                 //  - preserve the elif / else structure
                 //
                 // I've gone with the former because it fits the structure of existing code, but
-                // if the resulting condtions end up being messy, or it becomes unreliable for
-                // any reason, then we should reconsider.  In practice most conditions are simple
-                // and #if..elif chains are not long.  The main liability is that we sort field names
+                // if the resulting conditions end up being messy, or it becomes unreliable for
+                // any reason, then we should reconsider. In practice most conditions are simple
+                // and #if..elif chains are not long. The main liability is that we sort field names
                 // lexicographically so clauses may become reorganized on output; this does not lead
                 // to bugs but makes the code confusing to read.
 

                }
            }

            // For line matching of GC_ directives we match only at
            // the start of the line after taking the substring
            // starting at the known-good index.  This yields the same

        return v;
    }

    function pushGCmembers(list, cls) {
        var members = [];
        var result = list.split(/,|;/);
        for(var i = 0; i < result.length - 1; i++) {
            var attr = [cls];
            attr[1] = result[i].replace(/^\s*|\s*$/g, "");
            specs.push(new constructors["GC_POINTER"]("GC_POINTER",attr,copyIfStack()));
        }
    }

    function positionalAttrs(tag, s, paren, cls) {
        var attr = splitAttrs(s, paren);
        for ( var i=0 ; i < attr.length ; i++ ) {
