[前][次][番号順一覧][スレッド一覧][生データ]

yarv-diff:285

From: ko1 atdot.net
Date: 20 Feb 2006 06:15:43 -0000
Subject: [yarv-diff:285] r449 - in trunk: . benchmark ext/syck ext/syck/ext ext/syck/lib lib lib/yaml test test/yaml

Author: ko1
Date: 2006-02-20 15:15:42 +0900 (Mon, 20 Feb 2006)
New Revision: 449

Added:
   trunk/benchmark/bm_vm3_thread_create_join.rb
   trunk/ext/syck/ext/
   trunk/ext/syck/ext/syck/
   trunk/ext/syck/lib/
   trunk/ext/syck/lib/okay/
   trunk/ext/syck/lib/yaml/
   trunk/lib/yaml/emitter.rb
   trunk/test/yaml/
   trunk/test/yaml/test_yaml.rb
Modified:
   trunk/
   trunk/ChangeLog
   trunk/ext/syck/bytecode.c
   trunk/ext/syck/emitter.c
   trunk/ext/syck/gram.c
   trunk/ext/syck/gram.h
   trunk/ext/syck/handler.c
   trunk/ext/syck/implicit.c
   trunk/ext/syck/node.c
   trunk/ext/syck/rubyext.c
   trunk/ext/syck/syck.c
   trunk/ext/syck/syck.h
   trunk/ext/syck/token.c
   trunk/ext/syck/yaml2byte.c
   trunk/lib/yaml.rb
   trunk/lib/yaml/basenode.rb
   trunk/lib/yaml/error.rb
   trunk/lib/yaml/rubytypes.rb
   trunk/lib/yaml/stream.rb
   trunk/lib/yaml/syck.rb
   trunk/lib/yaml/types.rb
Log:
 r682@lermite:  ko1 | 2006-02-20 14:19:34 +0900
 	* benchmark/bm_vm3_thread_create_join.rb : added
 
 	* ext/syck/ : imported from Ruby 1.9 HEAD
 
 	* lib/yaml.rb : ditto
 
 	* lib/yaml/ : ditto
 
 	* test/yaml/test_yaml.rb : ditto
 



Property changes on: trunk
___________________________________________________________________
Name: svk:merge
   - 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:680
   + 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:682

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-02-20 05:50:08 UTC (rev 448)
+++ trunk/ChangeLog	2006-02-20 06:15:42 UTC (rev 449)
@@ -4,6 +4,13 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2006-02-20(Mon) 15:13:24 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* benchmark/bm_vm3_thread_create_join.rb : added
+
+	* test/yaml/test_yaml.rb : imported from Ruby CVS trunk HEAD
+
+
 2006-02-20(Mon) 14:49:46 +0900  Minero Aoki  <aamine loveruby.net>
 
 	* lib/yaml.rb: imported from Ruby CVS trunk HEAD.

Added: trunk/benchmark/bm_vm3_thread_create_join.rb
===================================================================
--- trunk/benchmark/bm_vm3_thread_create_join.rb	2006-02-20 05:50:08 UTC (rev 448)
+++ trunk/benchmark/bm_vm3_thread_create_join.rb	2006-02-20 06:15:42 UTC (rev 449)
@@ -0,0 +1,6 @@
+i=0
+while i<1000 # benchmark loop 3
+  i+=1
+  Thread.new{
+  }.join
+end

Modified: trunk/ext/syck/bytecode.c
===================================================================
--- trunk/ext/syck/bytecode.c	2006-02-20 05:50:08 UTC (rev 448)
+++ trunk/ext/syck/bytecode.c	2006-02-20 06:15:42 UTC (rev 449)
@@ -1,1166 +1,1171 @@
-/* Generated by re2c 0.9.10 on Mon Sep 19 23:21:26 2005 */
-#line 1 "bytecode.re"
-/*
- * bytecode.re
- *
- * $Author: why $
- * $Date: 2005/09/20 06:50:19 $
- *
- * Copyright (C) 2003 why the lucky stiff
- */
-#include "ruby.h"
-#include "syck.h"
-#include "gram.h"
-
-#define QUOTELEN 128
-
-/*
- * They do my bidding...
- */
-#define YYCTYPE     char
-#define YYCURSOR    parser->cursor
-#define YYMARKER    parser->marker
-#define YYLIMIT     parser->limit
-#define YYTOKEN     parser->token
-#define YYTOKTMP    parser->toktmp
-#define YYLINEPTR   parser->lineptr
-#define YYLINECTPTR parser->linectptr
-#define YYLINE      parser->linect
-#define YYFILL(n)   syck_parser_read(parser)
-
-extern SyckParser *syck_parser_ptr;
-
-char *get_inline( SyckParser *parser );
-
-/*
- * Repositions the cursor at `n' offset from the token start.
- * Only works in `Header' and `Document' sections.
- */
-#define YYPOS(n)    YYCURSOR = YYTOKEN + n
-
-/*
- * Track line numbers
- */
-#define CHK_NL(ptr)    if ( *( ptr - 1 ) == '\n' && ptr > YYLINECTPTR ) { YYLINEPTR = ptr; YYLINE++; YYLINECTPTR = YYLINEPTR; }
-
-/*
- * I like seeing the level operations as macros...
- */
-#define ADD_LEVEL(len, status)  syck_parser_add_level( parser, len, status )
-#define POP_LEVEL()     syck_parser_pop_level( parser )
-#define CURRENT_LEVEL() syck_parser_current_level( parser )
-
-/*
- * Force a token next time around sycklex()
- */
-#define FORCE_NEXT_TOKEN(tok)    parser->force_token = tok;
-
-/*
- * Adding levels in bytecode requires us to make sure
- * we've got all our tokens worked out.
- */
-#define ADD_BYTE_LEVEL(lvl, len, s ) \
-        switch ( lvl->status ) \
-        { \
-            case syck_lvl_seq: \
-                lvl->ncount++; \
-                ADD_LEVEL(len, syck_lvl_open); \
-                YYPOS(0); \
-            return '-'; \
-        \
-            case syck_lvl_map: \
-                lvl->ncount++; \
-                ADD_LEVEL(len, s); \
-            break; \
-        \
-            case syck_lvl_open: \
-                lvl->status = s; \
-            break; \
-        \
-            default: \
-                ADD_LEVEL(len, s); \
-            break; \
-        }
-
-/*
- * Nice little macro to ensure we're YAML_IOPENed to the current level.
- * * Only use this macro in the "Document" section *
- */
-#define ENSURE_YAML_IOPEN(last_lvl, lvl_type, to_len, reset) \
-        if ( last_lvl->spaces < to_len ) \
-        { \
-            if ( last_lvl->status == syck_lvl_iseq || last_lvl->status == syck_lvl_imap ) \
-            { \
-                goto Document; \
-            } \
-            else \
-            { \
-                ADD_LEVEL( to_len, lvl_type ); \
-                if ( reset == 1 ) YYPOS(0); \
-                return YAML_IOPEN; \
-            } \
-        } 
-
-/*
- * Nice little macro to ensure closure of levels.
- * * Only use this macro in the "Document" section *
- */
-#define ENSURE_YAML_IEND(last_lvl, to_len) \
-        if ( last_lvl->spaces > to_len ) \
-        { \
-            syck_parser_pop_level( parser ); \
-            YYPOS(0); \
-            return YAML_IEND; \
-        }
-
-/*
- * Concatenates string items and manages allocation
- * to the string
- */
-#define CAT(s, c, i, l) \
-        { \
-            if ( i + 1 >= c ) \
-            { \
-                c += QUOTELEN; \
-                S_REALLOC_N( s, char, c ); \
-            } \
-            s[i++] = l; \
-            s[i] = '\0'; \
-        }
-
-/*
- * Parser for standard YAML Bytecode [UTF-8]
- */
-int
-sycklex_bytecode_utf8( YYSTYPE *sycklval, SyckParser *parser )
-{
-    SyckLevel *lvl;
-    syck_parser_ptr = parser;
-    if ( YYCURSOR == NULL ) 
-    {
-        syck_parser_read( parser );
-    }
-
-    if ( parser->force_token != 0 )
-    {
-        int t = parser->force_token;
-        parser->force_token = 0;
-        return t;
-    }
-
-#line 172 "bytecode.re"
-
-
-    lvl = CURRENT_LEVEL();
-    if ( lvl->status == syck_lvl_doc )
-    {
-        goto Document;
-    }
-
-/* Header: */
-
-    YYTOKEN = YYCURSOR;
-
-
-#line 165 "<stdout>"
-{
-	YYCTYPE yych;
-	unsigned int yyaccept;
-	goto yy0;
-	++YYCURSOR;
-yy0:
-	if((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
-	yych = *YYCURSOR;
-	switch(yych){
-	case 0x00:	goto yy2;
-	case 'D':	goto yy3;
-	default:	goto yy5;
-	}
-yy2:	YYCURSOR = YYMARKER;
-	switch(yyaccept){
-	case 0:	goto yy4;
-	}
-yy3:	yyaccept = 0;
-	yych = *(YYMARKER = ++YYCURSOR);
-	switch(yych){
-	case 0x0A:	goto yy6;
-	case 0x0D:	goto yy8;
-	default:	goto yy4;
-	}
-yy4:
-#line 199 "bytecode.re"
-{   YYPOS(0);
-            goto Document;
-        }
-#line 195 "<stdout>"
-yy5:	yych = *++YYCURSOR;
-	goto yy4;
-yy6:	++YYCURSOR;
-	goto yy7;
-yy7:
-#line 186 "bytecode.re"
-{   if ( lvl->status == syck_lvl_header )
-            {
-                CHK_NL(YYCURSOR);
-                goto Directive;
-            }
-            else
-            {
-                ENSURE_YAML_IEND(lvl, -1);
-                YYPOS(0);
-                return 0;
-            }
-        }
-#line 214 "<stdout>"
-yy8:	++YYCURSOR;
-	switch((yych = *YYCURSOR)) {
-	case 0x0A:	goto yy6;
-	default:	goto yy2;
-	}
-}
-#line 203 "bytecode.re"
-
-
-Document:
-    {
-        lvl = CURRENT_LEVEL();
-        if ( lvl->status == syck_lvl_header )
-        {
-            lvl->status = syck_lvl_doc;
-        }
-
-        YYTOKEN = YYCURSOR;
-
-
-#line 235 "<stdout>"
-{
-	YYCTYPE yych;
-	goto yy9;
-	++YYCURSOR;
-yy9:
-	if((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
-	yych = *YYCURSOR;
-	switch(yych){
-	case 0x00:	goto yy30;
-	case 0x0A:	goto yy27;
-	case 0x0D:	goto yy29;
-	case 'A':	goto yy19;
-	case 'D':	goto yy12;
-	case 'E':	goto yy16;
-	case 'M':	goto yy14;
-	case 'P':	goto yy13;
-	case 'Q':	goto yy15;
-	case 'R':	goto yy21;
-	case 'S':	goto yy17;
-	case 'T':	goto yy23;
-	case 'c':	goto yy25;
-	default:	goto yy11;
-	}
-yy11:yy12:	yych = *++YYCURSOR;
-	switch(yych){
-	case 0x0A:	goto yy41;
-	case 0x0D:	goto yy44;
-	default:	goto yy11;
-	}
-yy13:	yych = *++YYCURSOR;
-	switch(yych){
-	case 0x0A:	goto yy41;
-	case 0x0D:	goto yy43;
-	default:	goto yy11;
-	}
-yy14:	yych = *++YYCURSOR;
-	switch(yych){
-	case 0x0A:	goto yy38;
-	case 0x0D:	goto yy40;
-	default:	goto yy11;
-	}
-yy15:	yych = *++YYCURSOR;
-	switch(yych){
-	case 0x0A:	goto yy35;
-	case 0x0D:	goto yy37;
-	default:	goto yy11;
-	}
-yy16:	yych = *++YYCURSOR;
-	switch(yych){
-	case 0x0A:	goto yy32;
-	case 0x0D:	goto yy34;
-	default:	goto yy11;
-	}
-yy17:	++YYCURSOR;
-	goto yy18;
-yy18:
-#line 288 "bytecode.re"
-{   ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_str); 
-            goto Scalar;
-        }
-#line 296 "<stdout>"
-yy19:	++YYCURSOR;
-	goto yy20;
-yy20:
-#line 292 "bytecode.re"
-{   ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_open);
-            sycklval->name = get_inline( parser );
-            syck_hdlr_remove_anchor( parser, sycklval->name );
-            CHK_NL(YYCURSOR);
-            return YAML_ANCHOR;
-        }
-#line 307 "<stdout>"
-yy21:	++YYCURSOR;
-	goto yy22;
-yy22:
-#line 299 "bytecode.re"
-{   ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_str);
-            sycklval->name = get_inline( parser );
-            POP_LEVEL();
-            if ( *( YYCURSOR - 1 ) == '\n' ) YYCURSOR--;
-            return YAML_ALIAS;
-        }
-#line 318 "<stdout>"
-yy23:	++YYCURSOR;
-	goto yy24;
-yy24:
-#line 306 "bytecode.re"
-{   char *qstr;
-            ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_open);
-            qstr = get_inline( parser );
-            CHK_NL(YYCURSOR);
-            if ( qstr[0] == '!' )
-            {
-                int qidx = strlen( qstr );
-                if ( qstr[1] == '\0' )
-                {
-                    free( qstr );
-                    return YAML_ITRANSFER;
-                }
-
-                lvl = CURRENT_LEVEL();
-
-                /*
-                 * URL Prefixing
-                 */
-                if ( qstr[1] == '^' )
-                {
-                    sycklval->name = S_ALLOC_N( char, qidx + strlen( lvl->domain ) );
-                    sycklval->name[0] = '\0';
-                    strcat( sycklval->name, lvl->domain );
-                    strncat( sycklval->name, qstr + 2, qidx - 2 );
-                    free( qstr );
-                }
-                else
-                {
-                    char *carat = qstr + 1;
-                    char *qend = qstr + qidx;
-                    while ( (++carat) < qend )
-                    {
-                        if ( *carat == '^' )
-                            break;
-                    }
-
-                    if ( carat < qend )
-                    {
-                        free( lvl->domain );
-                        lvl->domain = syck_strndup( qstr + 1, carat - ( qstr + 1 ) );
-                        sycklval->name = S_ALLOC_N( char, ( qend - carat ) + strlen( lvl->domain ) );
-                        sycklval->name[0] = '\0';
-                        strcat( sycklval->name, lvl->domain );
-                        strncat( sycklval->name, carat + 1, ( qend - carat ) - 1 );
-                        free( qstr );
-                    }
-                    else
-                    {
-                        sycklval->name = S_ALLOC_N( char, strlen( qstr ) );
-                        sycklval->name[0] = '\0';
-                        S_MEMCPY( sycklval->name, qstr + 1, char, strlen( qstr ) );
-                        free( qstr );
-                    }
-                }
-                return YAML_TRANSFER;
-            }
-            sycklval->name = qstr;
-            return YAML_TAGURI;
-        }
-#line 382 "<stdout>"
-yy25:	++YYCURSOR;
-	goto yy26;
-yy26:
-#line 366 "bytecode.re"
-{   goto Comment; }
-#line 388 "<stdout>"
-yy27:	++YYCURSOR;
-	goto yy28;
-yy28:
-#line 368 "bytecode.re"
-{   CHK_NL(YYCURSOR);
-            if ( lvl->status == syck_lvl_seq )
-            {
-                return YAML_INDENT; 
-            }
-            else if ( lvl->status == syck_lvl_map )
-            {
-                if ( lvl->ncount % 2 == 1 ) return ':';
-                else                        return YAML_INDENT;
-            }
-            goto Document;
-        }
-#line 405 "<stdout>"
-yy29:	yych = *++YYCURSOR;
-	switch(yych){
-	case 0x0A:	goto yy27;
-	default:	goto yy11;
-	}
-yy30:	++YYCURSOR;
-	goto yy31;
-yy31:
-#line 381 "bytecode.re"
-{   ENSURE_YAML_IEND(lvl, -1);
-            YYPOS(0);
-            return 0;
-        }
-#line 419 "<stdout>"
-yy32:	++YYCURSOR;
-	goto yy33;
-yy33:
-#line 252 "bytecode.re"
-{   if ( lvl->status == syck_lvl_seq && lvl->ncount == 0 )
-            {
-                lvl->ncount++;
-                YYPOS(0);
-                FORCE_NEXT_TOKEN( ']' );
-                return '[';
-            }
-            else if ( lvl->status == syck_lvl_map && lvl->ncount == 0 )
-            {
-                lvl->ncount++;
-                YYPOS(0);
-                FORCE_NEXT_TOKEN( '}' );
-                return '{';
-            }
-            
-            POP_LEVEL();
-            lvl = CURRENT_LEVEL();
-            if ( lvl->status == syck_lvl_seq )
-            {
-                FORCE_NEXT_TOKEN(YAML_INDENT);   
-            }
-            else if ( lvl->status == syck_lvl_map )
-            {
-                if ( lvl->ncount % 2 == 1 )
-                {
-                    FORCE_NEXT_TOKEN(':');
-                }
-                else
-                {
-                    FORCE_NEXT_TOKEN(YAML_INDENT);
-                }
-            }
-            CHK_NL(YYCURSOR);
-            return YAML_IEND;
-        }
-#line 459 "<stdout>"
-yy34:	yych = *++YYCURSOR;
-	switch(yych){
-	case 0x0A:	goto yy32;
-	default:	goto yy11;
-	}
-yy35:	++YYCURSOR;
-	goto yy36;
-yy36:
-#line 237 "bytecode.re"
-{   int complex = 0;
-            if ( lvl->ncount % 2 == 0 && ( lvl->status == syck_lvl_map || lvl->status == syck_lvl_seq ) )
-            {
-                complex = 1;
-            }
-            ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_seq);
-            CHK_NL(YYCURSOR);
-            if ( complex )
-            {
-                FORCE_NEXT_TOKEN( YAML_IOPEN );
-                return '?';
-            }
-            return YAML_IOPEN;
-        }
-#line 483 "<stdout>"
-yy37:	yych = *++YYCURSOR;
-	switch(yych){
-	case 0x0A:	goto yy35;
-	default:	goto yy11;
-	}
-yy38:	++YYCURSOR;
-	goto yy39;
-yy39:
-#line 222 "bytecode.re"
-{   int complex = 0;
-            if ( lvl->ncount % 2 == 0 && ( lvl->status == syck_lvl_map || lvl->status == syck_lvl_seq ) )
-            {
-                complex = 1;
-            }
-            ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_map); 
-            CHK_NL(YYCURSOR);
-            if ( complex )
-            {
-                FORCE_NEXT_TOKEN( YAML_IOPEN );
-                return '?';
-            }
-            return YAML_IOPEN;
-        }
-#line 507 "<stdout>"
-yy40:	yych = *++YYCURSOR;
-	switch(yych){
-	case 0x0A:	goto yy38;
-	default:	goto yy11;
-	}
-yy41:	++YYCURSOR;
-	goto yy42;
-yy42:
-#line 217 "bytecode.re"
-{   ENSURE_YAML_IEND(lvl, -1);
-                YYPOS(0);
-                return 0;
-            }
-#line 521 "<stdout>"
-yy43:	yych = *++YYCURSOR;
-	switch(yych){
-	case 0x0A:	goto yy41;
-	default:	goto yy11;
-	}
-yy44:	++YYCURSOR;
-	switch((yych = *YYCURSOR)) {
-	case 0x0A:	goto yy41;
-	default:	goto yy11;
-	}
-}
-#line 386 "bytecode.re"
-
-
-    }
-
-Directive:
-    {
-        YYTOKEN = YYCURSOR;
-
-
-#line 543 "<stdout>"
-{
-	YYCTYPE yych;
-	unsigned int yyaccept;
-	goto yy45;
-	++YYCURSOR;
-yy45:
-	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
-	yych = *YYCURSOR;
-	switch(yych){
-	case 0x00:	goto yy47;
-	case 'V':	goto yy48;
-	default:	goto yy50;
-	}
-yy47:	YYCURSOR = YYMARKER;
-	switch(yyaccept){
-	case 0:	goto yy49;
-	}
-yy48:	yyaccept = 0;
-	yych = *(YYMARKER = ++YYCURSOR);
-	switch(yych){
-	case '.':
-	case '/':
-	case '0':
-	case '1':
-	case '2':
-	case '3':
-	case '4':
-	case '5':
-	case '6':
-	case '7':
-	case '8':
-	case '9':
-	case ':':
-	case ';':
-	case '<':
-	case '=':
-	case '>':
-	case '?':
-	case '@':
-	case 'A':
-	case 'B':
-	case 'C':
-	case 'D':
-	case 'E':
-	case 'F':
-	case 'G':
-	case 'H':
-	case 'I':
-	case 'J':
-	case 'K':
-	case 'L':
-	case 'M':
-	case 'N':
-	case 'O':
-	case 'P':
-	case 'Q':
-	case 'R':
-	case 'S':
-	case 'T':
-	case 'U':
-	case 'V':
-	case 'W':
-	case 'X':
-	case 'Y':
-	case 'Z':
-	case '[':
-	case '\\':
-	case ']':
-	case '^':
-	case '_':	case 'a':
-	case 'b':
-	case 'c':
-	case 'd':
-	case 'e':
-	case 'f':
-	case 'g':
-	case 'h':
-	case 'i':
-	case 'j':
-	case 'k':
-	case 'l':
-	case 'm':
-	case 'n':
-	case 'o':
-	case 'p':
-	case 'q':
-	case 'r':
-	case 's':
-	case 't':
-	case 'u':
-	case 'v':
-	case 'w':
-	case 'x':
-	case 'y':
-	case 'z':	goto yy51;
-	default:	goto yy49;
-	}
-yy49:
-#line 399 "bytecode.re"
-{   YYCURSOR = YYTOKEN;
-               return YAML_DOCSEP;
-           }
-#line 646 "<stdout>"
-yy50:	yych = *++YYCURSOR;
-	goto yy49;
-yy51:	++YYCURSOR;
-	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
-	yych = *YYCURSOR;
-	goto yy52;
-yy52:	switch(yych){
-	case '.':
-	case '/':
-	case '0':
-	case '1':
-	case '2':
-	case '3':
-	case '4':
-	case '5':
-	case '6':
-	case '7':
-	case '8':
-	case '9':	case ';':
-	case '<':
-	case '=':
-	case '>':
-	case '?':
-	case '@':
-	case 'A':
-	case 'B':
-	case 'C':
-	case 'D':
-	case 'E':
-	case 'F':
-	case 'G':
-	case 'H':
-	case 'I':
-	case 'J':
-	case 'K':
-	case 'L':
-	case 'M':
-	case 'N':
-	case 'O':
-	case 'P':
-	case 'Q':
-	case 'R':
-	case 'S':
-	case 'T':
-	case 'U':
-	case 'V':
-	case 'W':
-	case 'X':
-	case 'Y':
-	case 'Z':
-	case '[':
-	case '\\':
-	case ']':
-	case '^':
-	case '_':	case 'a':
-	case 'b':
-	case 'c':
-	case 'd':
-	case 'e':
-	case 'f':
-	case 'g':
-	case 'h':
-	case 'i':
-	case 'j':
-	case 'k':
-	case 'l':
-	case 'm':
-	case 'n':
-	case 'o':
-	case 'p':
-	case 'q':
-	case 'r':
-	case 's':
-	case 't':
-	case 'u':
-	case 'v':
-	case 'w':
-	case 'x':
-	case 'y':
-	case 'z':	goto yy51;
-	case ':':	goto yy53;
-	default:	goto yy47;
-	}
-yy53:	yych = *++YYCURSOR;
-	switch(yych){
-	case '.':
-	case '/':
-	case '0':
-	case '1':
-	case '2':
-	case '3':
-	case '4':
-	case '5':
-	case '6':
-	case '7':
-	case '8':
-	case '9':
-	case ':':
-	case ';':
-	case '<':
-	case '=':
-	case '>':
-	case '?':
-	case '@':
-	case 'A':
-	case 'B':
-	case 'C':
-	case 'D':
-	case 'E':
-	case 'F':
-	case 'G':
-	case 'H':
-	case 'I':
-	case 'J':
-	case 'K':
-	case 'L':
-	case 'M':
-	case 'N':
-	case 'O':
-	case 'P':
-	case 'Q':
-	case 'R':
-	case 'S':
-	case 'T':
-	case 'U':
-	case 'V':
-	case 'W':
-	case 'X':
-	case 'Y':
-	case 'Z':
-	case '[':
-	case '\\':
-	case ']':
-	case '^':
-	case '_':	case 'a':
-	case 'b':
-	case 'c':
-	case 'd':
-	case 'e':
-	case 'f':
-	case 'g':
-	case 'h':
-	case 'i':
-	case 'j':
-	case 'k':
-	case 'l':
-	case 'm':
-	case 'n':
-	case 'o':
-	case 'p':
-	case 'q':
-	case 'r':
-	case 's':
-	case 't':
-	case 'u':
-	case 'v':
-	case 'w':
-	case 'x':
-	case 'y':
-	case 'z':	goto yy54;
-	default:	goto yy47;
-	}
-yy54:	++YYCURSOR;
-	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
-	yych = *YYCURSOR;
-	goto yy55;
-yy55:	switch(yych){
-	case 0x0A:	goto yy56;
-	case 0x0D:	goto yy58;
-	case '.':
-	case '/':
-	case '0':
-	case '1':
-	case '2':
-	case '3':
-	case '4':
-	case '5':
-	case '6':
-	case '7':
-	case '8':
-	case '9':
-	case ':':
-	case ';':
-	case '<':
-	case '=':
-	case '>':
-	case '?':
-	case '@':
-	case 'A':
-	case 'B':
-	case 'C':
-	case 'D':
-	case 'E':
-	case 'F':
-	case 'G':
-	case 'H':
-	case 'I':
-	case 'J':
-	case 'K':
-	case 'L':
-	case 'M':
-	case 'N':
-	case 'O':
-	case 'P':
-	case 'Q':
-	case 'R':
-	case 'S':
-	case 'T':
-	case 'U':
-	case 'V':
-	case 'W':
-	case 'X':
-	case 'Y':
-	case 'Z':
-	case '[':
-	case '\\':
-	case ']':
-	case '^':
-	case '_':	case 'a':
-	case 'b':
-	case 'c':
-	case 'd':
-	case 'e':
-	case 'f':
-	case 'g':
-	case 'h':
-	case 'i':
-	case 'j':
-	case 'k':
-	case 'l':
-	case 'm':
-	case 'n':
-	case 'o':
-	case 'p':
-	case 'q':
-	case 'r':
-	case 's':
-	case 't':
-	case 'u':
-	case 'v':
-	case 'w':
-	case 'x':
-	case 'y':
-	case 'z':	goto yy54;
-	default:	goto yy47;
-	}
-yy56:	++YYCURSOR;
-	goto yy57;
-yy57:
-#line 396 "bytecode.re"
-{   CHK_NL(YYCURSOR);
-               goto Directive; }
-#line 899 "<stdout>"
-yy58:	++YYCURSOR;
-	switch((yych = *YYCURSOR)) {
-	case 0x0A:	goto yy56;
-	default:	goto yy47;
-	}
-}
-#line 402 "bytecode.re"
-
-
-    }
-
-Comment:
-    {
-        YYTOKEN = YYCURSOR;
-
-
-#line 916 "<stdout>"
-{
-	YYCTYPE yych;
-	goto yy59;
-	++YYCURSOR;
-yy59:
-	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
-	yych = *YYCURSOR;
-	switch(yych){
-	case 0x00:	goto yy61;
-	case 0x0A:	goto yy62;
-	case 0x0D:	goto yy64;
-	default:	goto yy66;
-	}
-yy61:yy62:	++YYCURSOR;
-	goto yy63;
-yy63:
-#line 412 "bytecode.re"
-{   CHK_NL(YYCURSOR);
-                goto Document; }
-#line 936 "<stdout>"
-yy64:	++YYCURSOR;
-	switch((yych = *YYCURSOR)) {
-	case 0x0A:	goto yy67;
-	default:	goto yy65;
-	}
-yy65:
-#line 415 "bytecode.re"
-{   goto Comment; }
-#line 945 "<stdout>"
-yy66:	yych = *++YYCURSOR;
-	goto yy65;
-yy67:	++YYCURSOR;
-	yych = *YYCURSOR;
-	goto yy63;
-}
-#line 417 "bytecode.re"
-
-
-    }
-
-Scalar:
-    {
-    int idx = 0;
-    int cap = 100;
-    char *str = S_ALLOC_N( char, cap );
-    char *tok;
-
-    str[0] = '\0';
-
-Scalar2:
-    tok = YYCURSOR;
-
-
-#line 970 "<stdout>"
-{
-	YYCTYPE yych;
-	goto yy68;
-	++YYCURSOR;
-yy68:
-	if((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
-	yych = *YYCURSOR;
-	switch(yych){
-	case 0x00:	goto yy74;
-	case 0x0A:	goto yy70;
-	case 0x0D:	goto yy72;
-	default:	goto yy76;
-	}
-yy70:	++YYCURSOR;
-	switch((yych = *YYCURSOR)) {
-	case 'C':	goto yy78;
-	case 'N':	goto yy80;
-	case 'Z':	goto yy83;
-	default:	goto yy71;
-	}
-yy71:
-#line 461 "bytecode.re"
-{   YYCURSOR = tok;
-            goto ScalarEnd; 
-        }
-#line 996 "<stdout>"
-yy72:	++YYCURSOR;
-	switch((yych = *YYCURSOR)) {
-	case 0x0A:	goto yy77;
-	default:	goto yy73;
-	}
-yy73:
-#line 469 "bytecode.re"
-{   CAT(str, cap, idx, tok[0]);
-            goto Scalar2; 
-        }
-#line 1007 "<stdout>"
-yy74:	++YYCURSOR;
-	goto yy75;
-yy75:
-#line 465 "bytecode.re"
-{   YYCURSOR = tok;
-            goto ScalarEnd;
-        }
-#line 1015 "<stdout>"
-yy76:	yych = *++YYCURSOR;
-	goto yy73;
-yy77:	yych = *++YYCURSOR;
-	switch(yych){
-	case 'C':	goto yy78;
-	case 'N':	goto yy80;
-	case 'Z':	goto yy83;
-	default:	goto yy71;
-	}
-yy78:	++YYCURSOR;
-	goto yy79;
-yy79:
-#line 435 "bytecode.re"
-{   CHK_NL(tok+1);
-            goto Scalar2; }
-#line 1031 "<stdout>"
-yy80:	++YYCURSOR;
-	if(YYLIMIT == YYCURSOR) YYFILL(1);
-	yych = *YYCURSOR;
-	goto yy81;
-yy81:	switch(yych){
-	case '0':
-	case '1':
-	case '2':
-	case '3':
-	case '4':
-	case '5':
-	case '6':
-	case '7':
-	case '8':
-	case '9':	goto yy80;
-	default:	goto yy82;
-	}
-yy82:
-#line 438 "bytecode.re"
-{   CHK_NL(tok+1);
-            if ( tok + 2 < YYCURSOR )
-            {
-                char *count = tok + 2;
-                int total = strtod( count, NULL );
-                int i;
-                for ( i = 0; i < total; i++ )
-                {
-                    CAT(str, cap, idx, '\n');
-                }
-            }
-            else
-            {
-                CAT(str, cap, idx, '\n');
-            }
-            goto Scalar2;
-        }
-#line 1068 "<stdout>"
-yy83:	++YYCURSOR;
-	goto yy84;
-yy84:
-#line 456 "bytecode.re"
-{   CHK_NL(tok+1);
-            CAT(str, cap, idx, '\0');
-            goto Scalar2; 
-        }
-#line 1077 "<stdout>"
-}
-#line 473 "bytecode.re"
-
-
-ScalarEnd:
-        {
-            SyckNode *n = syck_alloc_str();
-            n->data.str->ptr = str;
-            n->data.str->len = idx;
-            sycklval->nodeData = n;
-            POP_LEVEL();
-            if ( parser->implicit_typing == 1 )
-            {
-                try_tag_implicit( sycklval->nodeData, parser->taguri_expansion );
-            }
-            return YAML_PLAIN;
-        }
-    }
-
-}
-
-char *
-get_inline( SyckParser *parser )
-{
-    int idx = 0;
-    int cap = 100;
-    char *str = S_ALLOC_N( char, cap );
-    char *tok;
-
-    str[0] = '\0';
-
-Inline:
-    {
-        tok = YYCURSOR;
-
-
-#line 1114 "<stdout>"
-{
-	YYCTYPE yych;
-	goto yy85;
-	++YYCURSOR;
-yy85:
-	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
-	yych = *YYCURSOR;
-	switch(yych){
-	case 0x00:	goto yy91;
-	case 0x0A:	goto yy87;
-	case 0x0D:	goto yy89;
-	default:	goto yy93;
-	}
-yy87:	++YYCURSOR;
-	goto yy88;
-yy88:
-#line 508 "bytecode.re"
-{   CHK_NL(YYCURSOR);
-                return str; }
-#line 1134 "<stdout>"
-yy89:	++YYCURSOR;
-	switch((yych = *YYCURSOR)) {
-	case 0x0A:	goto yy94;
-	default:	goto yy90;
-	}
-yy90:
-#line 515 "bytecode.re"
-{   CAT(str, cap, idx, tok[0]);
-                goto Inline; 
-            }
-#line 1145 "<stdout>"
-yy91:	++YYCURSOR;
-	goto yy92;
-yy92:
-#line 511 "bytecode.re"
-{   YYCURSOR = tok;
-                return str;
-            }
-#line 1153 "<stdout>"
-yy93:	yych = *++YYCURSOR;
-	goto yy90;
-yy94:	++YYCURSOR;
-	yych = *YYCURSOR;
-	goto yy88;
-}
-#line 519 "bytecode.re"
-
-
-    }
-
-}
-
+/* Generated by re2c 0.9.3 on Fri Aug 13 11:47:50 2004 */
+#line 1 "bytecode.re"
+/*
+ * bytecode.re
+ *
+ * $Author: why $
+ * $Date: 2004/08/13 16:14:22 $
+ *
+ * Copyright (C) 2003 why the lucky stiff
+ */
+#include "ruby.h"
+#include "syck.h"
+#include "gram.h"
+
+#define QUOTELEN 128
+
+/*
+ * They do my bidding...
+ */
+#define YYCTYPE     char
+#define YYCURSOR    parser->cursor
+#define YYMARKER    parser->marker
+#define YYLIMIT     parser->limit
+#define YYTOKEN     parser->token
+#define YYTOKTMP    parser->toktmp
+#define YYLINEPTR   parser->lineptr
+#define YYLINECTPTR parser->linectptr
+#define YYLINE      parser->linect
+#define YYFILL(n)   syck_parser_read(parser)
+
+extern SyckParser *syck_parser_ptr;
+
+char *get_inline( SyckParser *parser );
+
+/*
+ * Repositions the cursor at `n' offset from the token start.
+ * Only works in `Header' and `Document' sections.
+ */
+#define YYPOS(n)    YYCURSOR = YYTOKEN + n
+
+/*
+ * Track line numbers
+ */
+#define CHK_NL(ptr)    if ( *( ptr - 1 ) == '\n' && ptr > YYLINECTPTR ) { YYLINEPTR = ptr; YYLINE++; YYLINECTPTR = YYLINEPTR; }
+
+/*
+ * I like seeing the level operations as macros...
+ */
+#define ADD_LEVEL(len, status)  syck_parser_add_level( parser, len, status )
+#define POP_LEVEL()     syck_parser_pop_level( parser )
+#define CURRENT_LEVEL() syck_parser_current_level( parser )
+
+/*
+ * Force a token next time around sycklex()
+ */
+#define FORCE_NEXT_TOKEN(tok)    parser->force_token = tok;
+
+/*
+ * Adding levels in bytecode requires us to make sure
+ * we've got all our tokens worked out.
+ */
+#define ADD_BYTE_LEVEL(lvl, len, s ) \
+        switch ( lvl->status ) \
+        { \
+            case syck_lvl_seq: \
+                lvl->ncount++; \
+                ADD_LEVEL(len, syck_lvl_open); \
+                YYPOS(0); \
+            return '-'; \
+        \
+            case syck_lvl_map: \
+                lvl->ncount++; \
+                ADD_LEVEL(len, s); \
+            break; \
+        \
+            case syck_lvl_open: \
+                lvl->status = s; \
+            break; \
+        \
+            default: \
+                ADD_LEVEL(len, s); \
+            break; \
+        }
+
+/*
+ * Nice little macro to ensure we're YAML_IOPENed to the current level.
+ * * Only use this macro in the "Document" section *
+ */
+#define ENSURE_YAML_IOPEN(last_lvl, lvl_type, to_len, reset) \
+        if ( last_lvl->spaces < to_len ) \
+        { \
+            if ( last_lvl->status == syck_lvl_inline ) \
+            { \
+                goto Document; \
+            } \
+            else \
+            { \
+                ADD_LEVEL( to_len, lvl_type ); \
+                if ( reset == 1 ) YYPOS(0); \
+                return YAML_IOPEN; \
+            } \
+        } 
+
+/*
+ * Nice little macro to ensure closure of levels.
+ * * Only use this macro in the "Document" section *
+ */
+#define ENSURE_YAML_IEND(last_lvl, to_len) \
+        if ( last_lvl->spaces > to_len ) \
+        { \
+            syck_parser_pop_level( parser ); \
+            YYPOS(0); \
+            return YAML_IEND; \
+        }
+
+/*
+ * Concatenates string items and manages allocation
+ * to the string
+ */
+#define CAT(s, c, i, l) \
+        { \
+            if ( i + 1 >= c ) \
+            { \
+                c += QUOTELEN; \
+                S_REALLOC_N( s, char, c ); \
+            } \
+            s[i++] = l; \
+            s[i] = '\0'; \
+        }
+
+/*
+ * Parser for standard YAML Bytecode [UTF-8]
+ */
+int
+sycklex_bytecode_utf8( YYSTYPE *sycklval, SyckParser *parser )
+{
+    SyckLevel *lvl;
+    int doc_level = 0;
+    syck_parser_ptr = parser;
+    if ( YYCURSOR == NULL ) 
+    {
+        syck_parser_read( parser );
+    }
+
+    if ( parser->force_token != 0 )
+    {
+        int t = parser->force_token;
+        parser->force_token = 0;
+        return t;
+    }
+
+#line 173 "bytecode.re"
+
+
+    lvl = CURRENT_LEVEL();
+    if ( lvl->status == syck_lvl_doc )
+    {
+        goto Document;
+    }
+
+Header:
+
+    YYTOKEN = YYCURSOR;
+
+
+#line 7 "<stdout>"
+{
+	YYCTYPE yych;
+	unsigned int yyaccept;
+	goto yy0;
+yy1:	++YYCURSOR;
+yy0:
+	if((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
+	yych = *YYCURSOR;
+	switch(yych){
+	case '\000':	goto yy2;
+	case 'D':	goto yy3;
+	default:	goto yy5;
+	}
+yy2:	YYCURSOR = YYMARKER;
+	switch(yyaccept){
+	case 0:	goto yy4;
+	}
+yy3:	yyaccept = 0;
+	yych = *(YYMARKER = ++YYCURSOR);
+	switch(yych){
+	case '\n':	goto yy6;
+	case '\r':	goto yy8;
+	default:	goto yy4;
+	}
+yy4:
+#line 200 "bytecode.re"
+{   YYPOS(0);
+            goto Document;
+        }
+#line 37 "<stdout>"
+yy5:	yych = *++YYCURSOR;
+	goto yy4;
+yy6:	++YYCURSOR;
+	goto yy7;
+yy7:
+#line 187 "bytecode.re"
+{   if ( lvl->status == syck_lvl_header )
+            {
+                CHK_NL(YYCURSOR);
+                goto Directive;
+            }
+            else
+            {
+                ENSURE_YAML_IEND(lvl, -1);
+                YYPOS(0);
+                return 0;
+            }
+        }
+#line 56 "<stdout>"
+yy8:	++YYCURSOR;
+	switch((yych = *YYCURSOR)) {
+	case '\n':	goto yy6;
+	default:	goto yy2;
+	}
+}
+#line 204 "bytecode.re"
+
+
+Document:
+    {
+        lvl = CURRENT_LEVEL();
+        if ( lvl->status == syck_lvl_header )
+        {
+            lvl->status = syck_lvl_doc;
+        }
+
+        YYTOKEN = YYCURSOR;
+
+
+#line 65 "<stdout>"
+{
+	YYCTYPE yych;
+	unsigned int yyaccept;
+	goto yy9;
+yy10:	++YYCURSOR;
+yy9:
+	if((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
+	yych = *YYCURSOR;
+	switch(yych){
+	case '\000':	goto yy30;
+	case '\n':	goto yy27;
+	case '\r':	goto yy29;
+	case 'A':	goto yy19;
+	case 'D':	goto yy12;
+	case 'E':	goto yy16;
+	case 'M':	goto yy14;
+	case 'P':	goto yy13;
+	case 'Q':	goto yy15;
+	case 'R':	goto yy21;
+	case 'S':	goto yy17;
+	case 'T':	goto yy23;
+	case 'c':	goto yy25;
+	default:	goto yy11;
+	}
+yy11:yy12:	yych = *++YYCURSOR;
+	switch(yych){
+	case '\n':	goto yy41;
+	case '\r':	goto yy44;
+	default:	goto yy11;
+	}
+yy13:	yych = *++YYCURSOR;
+	switch(yych){
+	case '\n':	goto yy41;
+	case '\r':	goto yy43;
+	default:	goto yy11;
+	}
+yy14:	yych = *++YYCURSOR;
+	switch(yych){
+	case '\n':	goto yy38;
+	case '\r':	goto yy40;
+	default:	goto yy11;
+	}
+yy15:	yych = *++YYCURSOR;
+	switch(yych){
+	case '\n':	goto yy35;
+	case '\r':	goto yy37;
+	default:	goto yy11;
+	}
+yy16:	yych = *++YYCURSOR;
+	switch(yych){
+	case '\n':	goto yy32;
+	case '\r':	goto yy34;
+	default:	goto yy11;
+	}
+yy17:	++YYCURSOR;
+	goto yy18;
+yy18:
+#line 289 "bytecode.re"
+{   ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_str); 
+            goto Scalar;
+        }
+#line 127 "<stdout>"
+yy19:	++YYCURSOR;
+	goto yy20;
+yy20:
+#line 293 "bytecode.re"
+{   ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_open);
+            sycklval->name = get_inline( parser );
+            syck_hdlr_remove_anchor( parser, sycklval->name );
+            CHK_NL(YYCURSOR);
+            return YAML_ANCHOR;
+        }
+#line 138 "<stdout>"
+yy21:	++YYCURSOR;
+	goto yy22;
+yy22:
+#line 300 "bytecode.re"
+{   ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_str);
+            sycklval->name = get_inline( parser );
+            POP_LEVEL();
+            if ( *( YYCURSOR - 1 ) == '\n' ) YYCURSOR--;
+            return YAML_ALIAS;
+        }
+#line 149 "<stdout>"
+yy23:	++YYCURSOR;
+	goto yy24;
+yy24:
+#line 307 "bytecode.re"
+{   char *qstr;
+            ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_open);
+            qstr = get_inline( parser );
+            CHK_NL(YYCURSOR);
+            if ( qstr[0] == '!' )
+            {
+                int qidx = strlen( qstr );
+                if ( qstr[1] == '\0' )
+                {
+                    free( qstr );
+                    return YAML_ITRANSFER;
+                }
+
+                lvl = CURRENT_LEVEL();
+
+                /*
+                 * URL Prefixing
+                 */
+                if ( qstr[1] == '^' )
+                {
+                    sycklval->name = S_ALLOC_N( char, qidx + strlen( lvl->domain ) );
+                    sycklval->name[0] = '\0';
+                    strcat( sycklval->name, lvl->domain );
+                    strncat( sycklval->name, qstr + 2, qidx - 2 );
+                    free( qstr );
+                }
+                else
+                {
+                    char *carat = qstr + 1;
+                    char *qend = qstr + qidx;
+                    while ( (++carat) < qend )
+                    {
+                        if ( *carat == '^' )
+                            break;
+                    }
+
+                    if ( carat < qend )
+                    {
+                        free( lvl->domain );
+                        lvl->domain = syck_strndup( qstr + 1, carat - ( qstr + 1 ) );
+                        sycklval->name = S_ALLOC_N( char, ( qend - carat ) + strlen( lvl->domain ) );
+                        sycklval->name[0] = '\0';
+                        strcat( sycklval->name, lvl->domain );
+                        strncat( sycklval->name, carat + 1, ( qend - carat ) - 1 );
+                        free( qstr );
+                    }
+                    else
+                    {
+                        sycklval->name = S_ALLOC_N( char, strlen( qstr ) );
+                        sycklval->name[0] = '\0';
+                        S_MEMCPY( sycklval->name, qstr + 1, char, strlen( qstr ) );
+                        free( qstr );
+                    }
+                }
+                return YAML_TRANSFER;
+            }
+            sycklval->name = qstr;
+            return YAML_TAGURI;
+        }
+#line 213 "<stdout>"
+yy25:	++YYCURSOR;
+	goto yy26;
+yy26:
+#line 367 "bytecode.re"
+{   goto Comment; }
+#line 219 "<stdout>"
+yy27:	++YYCURSOR;
+	goto yy28;
+yy28:
+#line 369 "bytecode.re"
+{   CHK_NL(YYCURSOR);
+            if ( lvl->status == syck_lvl_seq )
+            {
+                return YAML_INDENT; 
+            }
+            else if ( lvl->status == syck_lvl_map )
+            {
+                if ( lvl->ncount % 2 == 1 ) return ':';
+                else                        return YAML_INDENT;
+            }
+            goto Document;
+        }
+#line 236 "<stdout>"
+yy29:	yych = *++YYCURSOR;
+	switch(yych){
+	case '\n':	goto yy27;
+	default:	goto yy11;
+	}
+yy30:	++YYCURSOR;
+	goto yy31;
+yy31:
+#line 382 "bytecode.re"
+{   ENSURE_YAML_IEND(lvl, -1);
+            YYPOS(0);
+            return 0;
+        }
+#line 250 "<stdout>"
+yy32:	++YYCURSOR;
+	goto yy33;
+yy33:
+#line 253 "bytecode.re"
+{   if ( lvl->status == syck_lvl_seq && lvl->ncount == 0 )
+            {
+                lvl->ncount++;
+                YYPOS(0);
+                FORCE_NEXT_TOKEN( ']' );
+                return '[';
+            }
+            else if ( lvl->status == syck_lvl_map && lvl->ncount == 0 )
+            {
+                lvl->ncount++;
+                YYPOS(0);
+                FORCE_NEXT_TOKEN( '}' );
+                return '{';
+            }
+            
+            POP_LEVEL();
+            lvl = CURRENT_LEVEL();
+            if ( lvl->status == syck_lvl_seq )
+            {
+                FORCE_NEXT_TOKEN(YAML_INDENT);   
+            }
+            else if ( lvl->status == syck_lvl_map )
+            {
+                if ( lvl->ncount % 2 == 1 )
+                {
+                    FORCE_NEXT_TOKEN(':');
+                }
+                else
+                {
+                    FORCE_NEXT_TOKEN(YAML_INDENT);
+                }
+            }
+            CHK_NL(YYCURSOR);
+            return YAML_IEND;
+        }
+#line 290 "<stdout>"
+yy34:	yych = *++YYCURSOR;
+	switch(yych){
+	case '\n':	goto yy32;
+	default:	goto yy11;
+	}
+yy35:	++YYCURSOR;
+	goto yy36;
+yy36:
+#line 238 "bytecode.re"
+{   int complex = 0;
+            if ( lvl->ncount % 2 == 0 && ( lvl->status == syck_lvl_map || lvl->status == syck_lvl_seq ) )
+            {
+                complex = 1;
+            }
+            ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_seq);
+            CHK_NL(YYCURSOR);
+            if ( complex )
+            {
+                FORCE_NEXT_TOKEN( YAML_IOPEN );
+                return '?';
+            }
+            return YAML_IOPEN;
+        }
+#line 314 "<stdout>"
+yy37:	yych = *++YYCURSOR;
+	switch(yych){
+	case '\n':	goto yy35;
+	default:	goto yy11;
+	}
+yy38:	++YYCURSOR;
+	goto yy39;
+yy39:
+#line 223 "bytecode.re"
+{   int complex = 0;
+            if ( lvl->ncount % 2 == 0 && ( lvl->status == syck_lvl_map || lvl->status == syck_lvl_seq ) )
+            {
+                complex = 1;
+            }
+            ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_map); 
+            CHK_NL(YYCURSOR);
+            if ( complex )
+            {
+                FORCE_NEXT_TOKEN( YAML_IOPEN );
+                return '?';
+            }
+            return YAML_IOPEN;
+        }
+#line 338 "<stdout>"
+yy40:	yych = *++YYCURSOR;
+	switch(yych){
+	case '\n':	goto yy38;
+	default:	goto yy11;
+	}
+yy41:	++YYCURSOR;
+	goto yy42;
+yy42:
+#line 218 "bytecode.re"
+{   ENSURE_YAML_IEND(lvl, -1);
+                YYPOS(0);
+                return 0;
+            }
+#line 352 "<stdout>"
+yy43:	yych = *++YYCURSOR;
+	switch(yych){
+	case '\n':	goto yy41;
+	default:	goto yy11;
+	}
+yy44:	++YYCURSOR;
+	switch((yych = *YYCURSOR)) {
+	case '\n':	goto yy41;
+	default:	goto yy11;
+	}
+}
+#line 387 "bytecode.re"
+
+
+    }
+
+Directive:
+    {
+        YYTOKEN = YYCURSOR;
+
+
+#line 366 "<stdout>"
+{
+	YYCTYPE yych;
+	unsigned int yyaccept;
+	goto yy45;
+yy46:	++YYCURSOR;
+yy45:
+	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+	yych = *YYCURSOR;
+	switch(yych){
+	case '\000':	goto yy47;
+	case 'V':	goto yy48;
+	default:	goto yy50;
+	}
+yy47:	YYCURSOR = YYMARKER;
+	switch(yyaccept){
+	case 0:	goto yy49;
+	}
+yy48:	yyaccept = 0;
+	yych = *(YYMARKER = ++YYCURSOR);
+	switch(yych){
+	case '.':
+	case '/':
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+	case ':':
+	case ';':
+	case '<':
+	case '=':
+	case '>':
+	case '?':
+	case '@':
+	case 'A':
+	case 'B':
+	case 'C':
+	case 'D':
+	case 'E':
+	case 'F':
+	case 'G':
+	case 'H':
+	case 'I':
+	case 'J':
+	case 'K':
+	case 'L':
+	case 'M':
+	case 'N':
+	case 'O':
+	case 'P':
+	case 'Q':
+	case 'R':
+	case 'S':
+	case 'T':
+	case 'U':
+	case 'V':
+	case 'W':
+	case 'X':
+	case 'Y':
+	case 'Z':
+	case '[':
+	case '\\':
+	case ']':
+	case '^':
+	case '_':	case 'a':
+	case 'b':
+	case 'c':
+	case 'd':
+	case 'e':
+	case 'f':
+	case 'g':
+	case 'h':
+	case 'i':
+	case 'j':
+	case 'k':
+	case 'l':
+	case 'm':
+	case 'n':
+	case 'o':
+	case 'p':
+	case 'q':
+	case 'r':
+	case 's':
+	case 't':
+	case 'u':
+	case 'v':
+	case 'w':
+	case 'x':
+	case 'y':
+	case 'z':	goto yy51;
+	default:	goto yy49;
+	}
+yy49:
+#line 400 "bytecode.re"
+{   YYCURSOR = YYTOKEN;
+               return YAML_DOCSEP;
+           }
+#line 469 "<stdout>"
+yy50:	yych = *++YYCURSOR;
+	goto yy49;
+yy51:	++YYCURSOR;
+	if(YYLIMIT == YYCURSOR) YYFILL(1);
+	yych = *YYCURSOR;
+	goto yy52;
+yy52:	switch(yych){
+	case '.':
+	case '/':
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	case ';':
+	case '<':
+	case '=':
+	case '>':
+	case '?':
+	case '@':
+	case 'A':
+	case 'B':
+	case 'C':
+	case 'D':
+	case 'E':
+	case 'F':
+	case 'G':
+	case 'H':
+	case 'I':
+	case 'J':
+	case 'K':
+	case 'L':
+	case 'M':
+	case 'N':
+	case 'O':
+	case 'P':
+	case 'Q':
+	case 'R':
+	case 'S':
+	case 'T':
+	case 'U':
+	case 'V':
+	case 'W':
+	case 'X':
+	case 'Y':
+	case 'Z':
+	case '[':
+	case '\\':
+	case ']':
+	case '^':
+	case '_':	case 'a':
+	case 'b':
+	case 'c':
+	case 'd':
+	case 'e':
+	case 'f':
+	case 'g':
+	case 'h':
+	case 'i':
+	case 'j':
+	case 'k':
+	case 'l':
+	case 'm':
+	case 'n':
+	case 'o':
+	case 'p':
+	case 'q':
+	case 'r':
+	case 's':
+	case 't':
+	case 'u':
+	case 'v':
+	case 'w':
+	case 'x':
+	case 'y':
+	case 'z':	goto yy51;
+	case ':':	goto yy53;
+	default:	goto yy47;
+	}
+yy53:	yych = *++YYCURSOR;
+	switch(yych){
+	case '.':
+	case '/':
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+	case ':':
+	case ';':
+	case '<':
+	case '=':
+	case '>':
+	case '?':
+	case '@':
+	case 'A':
+	case 'B':
+	case 'C':
+	case 'D':
+	case 'E':
+	case 'F':
+	case 'G':
+	case 'H':
+	case 'I':
+	case 'J':
+	case 'K':
+	case 'L':
+	case 'M':
+	case 'N':
+	case 'O':
+	case 'P':
+	case 'Q':
+	case 'R':
+	case 'S':
+	case 'T':
+	case 'U':
+	case 'V':
+	case 'W':
+	case 'X':
+	case 'Y':
+	case 'Z':
+	case '[':
+	case '\\':
+	case ']':
+	case '^':
+	case '_':	case 'a':
+	case 'b':
+	case 'c':
+	case 'd':
+	case 'e':
+	case 'f':
+	case 'g':
+	case 'h':
+	case 'i':
+	case 'j':
+	case 'k':
+	case 'l':
+	case 'm':
+	case 'n':
+	case 'o':
+	case 'p':
+	case 'q':
+	case 'r':
+	case 's':
+	case 't':
+	case 'u':
+	case 'v':
+	case 'w':
+	case 'x':
+	case 'y':
+	case 'z':	goto yy54;
+	default:	goto yy47;
+	}
+yy54:	++YYCURSOR;
+	if(YYLIMIT == YYCURSOR) YYFILL(1);
+	yych = *YYCURSOR;
+	goto yy55;
+yy55:	switch(yych){
+	case '\n':	goto yy56;
+	case '\r':	goto yy58;
+	case '.':
+	case '/':
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+	case ':':
+	case ';':
+	case '<':
+	case '=':
+	case '>':
+	case '?':
+	case '@':
+	case 'A':
+	case 'B':
+	case 'C':
+	case 'D':
+	case 'E':
+	case 'F':
+	case 'G':
+	case 'H':
+	case 'I':
+	case 'J':
+	case 'K':
+	case 'L':
+	case 'M':
+	case 'N':
+	case 'O':
+	case 'P':
+	case 'Q':
+	case 'R':
+	case 'S':
+	case 'T':
+	case 'U':
+	case 'V':
+	case 'W':
+	case 'X':
+	case 'Y':
+	case 'Z':
+	case '[':
+	case '\\':
+	case ']':
+	case '^':
+	case '_':	case 'a':
+	case 'b':
+	case 'c':
+	case 'd':
+	case 'e':
+	case 'f':
+	case 'g':
+	case 'h':
+	case 'i':
+	case 'j':
+	case 'k':
+	case 'l':
+	case 'm':
+	case 'n':
+	case 'o':
+	case 'p':
+	case 'q':
+	case 'r':
+	case 's':
+	case 't':
+	case 'u':
+	case 'v':
+	case 'w':
+	case 'x':
+	case 'y':
+	case 'z':	goto yy54;
+	default:	goto yy47;
+	}
+yy56:	++YYCURSOR;
+	goto yy57;
+yy57:
+#line 397 "bytecode.re"
+{   CHK_NL(YYCURSOR);
+               goto Directive; }
+#line 724 "<stdout>"
+yy58:	++YYCURSOR;
+	switch((yych = *YYCURSOR)) {
+	case '\n':	goto yy56;
+	default:	goto yy47;
+	}
+}
+#line 403 "bytecode.re"
+
+
+    }
+
+Comment:
+    {
+        YYTOKEN = YYCURSOR;
+
+
+#line 733 "<stdout>"
+{
+	YYCTYPE yych;
+	unsigned int yyaccept;
+	goto yy59;
+yy60:	++YYCURSOR;
+yy59:
+	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+	yych = *YYCURSOR;
+	switch(yych){
+	case '\000':	goto yy61;
+	case '\n':	goto yy62;
+	case '\r':	goto yy64;
+	default:	goto yy66;
+	}
+yy61:yy62:	++YYCURSOR;
+	goto yy63;
+yy63:
+#line 413 "bytecode.re"
+{   CHK_NL(YYCURSOR);
+                goto Document; }
+#line 754 "<stdout>"
+yy64:	++YYCURSOR;
+	switch((yych = *YYCURSOR)) {
+	case '\n':	goto yy67;
+	default:	goto yy65;
+	}
+yy65:
+#line 416 "bytecode.re"
+{   goto Comment; }
+#line 763 "<stdout>"
+yy66:	yych = *++YYCURSOR;
+	goto yy65;
+yy67:	++YYCURSOR;
+	yych = *YYCURSOR;
+	goto yy63;
+}
+#line 418 "bytecode.re"
+
+
+    }
+
+Scalar:
+    {
+    int idx = 0;
+    int cap = 100;
+    char *str = S_ALLOC_N( char, cap );
+    char *tok;
+
+    str[0] = '\0';
+
+Scalar2:
+    tok = YYCURSOR;
+
+
+#line 771 "<stdout>"
+{
+	YYCTYPE yych;
+	unsigned int yyaccept;
+	goto yy68;
+yy69:	++YYCURSOR;
+yy68:
+	if((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
+	yych = *YYCURSOR;
+	switch(yych){
+	case '\000':	goto yy74;
+	case '\n':	goto yy70;
+	case '\r':	goto yy72;
+	default:	goto yy76;
+	}
+yy70:	++YYCURSOR;
+	switch((yych = *YYCURSOR)) {
+	case 'C':	goto yy78;
+	case 'N':	goto yy80;
+	case 'Z':	goto yy83;
+	default:	goto yy71;
+	}
+yy71:
+#line 462 "bytecode.re"
+{   YYCURSOR = tok;
+            goto ScalarEnd; 
+        }
+#line 798 "<stdout>"
+yy72:	++YYCURSOR;
+	switch((yych = *YYCURSOR)) {
+	case '\n':	goto yy77;
+	default:	goto yy73;
+	}
+yy73:
+#line 470 "bytecode.re"
+{   CAT(str, cap, idx, tok[0]);
+            goto Scalar2; 
+        }
+#line 809 "<stdout>"
+yy74:	++YYCURSOR;
+	goto yy75;
+yy75:
+#line 466 "bytecode.re"
+{   YYCURSOR = tok;
+            goto ScalarEnd;
+        }
+#line 817 "<stdout>"
+yy76:	yych = *++YYCURSOR;
+	goto yy73;
+yy77:	yych = *++YYCURSOR;
+	switch(yych){
+	case 'C':	goto yy78;
+	case 'N':	goto yy80;
+	case 'Z':	goto yy83;
+	default:	goto yy71;
+	}
+yy78:	++YYCURSOR;
+	goto yy79;
+yy79:
+#line 436 "bytecode.re"
+{   CHK_NL(tok+1);
+            goto Scalar2; }
+#line 833 "<stdout>"
+yy80:	++YYCURSOR;
+	if(YYLIMIT == YYCURSOR) YYFILL(1);
+	yych = *YYCURSOR;
+	goto yy81;
+yy81:	switch(yych){
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':	goto yy80;
+	default:	goto yy82;
+	}
+yy82:
+#line 439 "bytecode.re"
+{   CHK_NL(tok+1);
+            if ( tok + 2 < YYCURSOR )
+            {
+                char *count = tok + 2;
+                int total = strtod( count, NULL );
+                int i;
+                for ( i = 0; i < total; i++ )
+                {
+                    CAT(str, cap, idx, '\n');
+                }
+            }
+            else
+            {
+                CAT(str, cap, idx, '\n');
+            }
+            goto Scalar2;
+        }
+#line 871 "<stdout>"
+yy83:	++YYCURSOR;
+	goto yy84;
+yy84:
+#line 457 "bytecode.re"
+{   CHK_NL(tok+1);
+            CAT(str, cap, idx, '\0');
+            goto Scalar2; 
+        }
+#line 880 "<stdout>"
+}
+#line 474 "bytecode.re"
+
+
+ScalarEnd:
+        {
+            SyckNode *n = syck_alloc_str();
+            n->data.str->ptr = str;
+            n->data.str->len = idx;
+            sycklval->nodeData = n;
+            POP_LEVEL();
+            if ( parser->implicit_typing == 1 )
+            {
+                try_tag_implicit( sycklval->nodeData, parser->taguri_expansion );
+            }
+            return YAML_PLAIN;
+        }
+    }
+
+}
+
+char *
+get_inline( SyckParser *parser )
+{
+    int idx = 0;
+    int cap = 100;
+    char *str = S_ALLOC_N( char, cap );
+    char *tok;
+
+    str[0] = '\0';
+
+Inline:
+    {
+        tok = YYCURSOR;
+
+
+#line 884 "<stdout>"
+{
+	YYCTYPE yych;
+	unsigned int yyaccept;
+	goto yy85;
+yy86:	++YYCURSOR;
+yy85:
+	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+	yych = *YYCURSOR;
+	switch(yych){
+	case '\000':	goto yy91;
+	case '\n':	goto yy87;
+	case '\r':	goto yy89;
+	default:	goto yy93;
+	}
+yy87:	++YYCURSOR;
+	goto yy88;
+yy88:
+#line 509 "bytecode.re"
+{   CHK_NL(YYCURSOR);
+                return str; }
+#line 905 "<stdout>"
+yy89:	++YYCURSOR;
+	switch((yych = *YYCURSOR)) {
+	case '\n':	goto yy94;
+	default:	goto yy90;
+	}
+yy90:
+#line 516 "bytecode.re"
+{   CAT(str, cap, idx, tok[0]);
+                goto Inline; 
+            }
+#line 916 "<stdout>"
+yy91:	++YYCURSOR;
+	goto yy92;
+yy92:
+#line 512 "bytecode.re"
+{   YYCURSOR = tok;
+                return str;
+            }
+#line 924 "<stdout>"
+yy93:	yych = *++YYCURSOR;
+	goto yy90;
+yy94:	++YYCURSOR;
+	yych = *YYCURSOR;
+	goto yy88;
+}
+#line 520 "bytecode.re"
+
+
+    }
+
+}
+

Modified: trunk/ext/syck/emitter.c
===================================================================
--- trunk/ext/syck/emitter.c	2006-02-20 05:50:08 UTC (rev 448)
+++ trunk/ext/syck/emitter.c	2006-02-20 06:15:42 UTC (rev 449)
@@ -1,1242 +1,444 @@
-/*
- * emitter.c
- *
- * $Author: ocean $
- * $Date: 2006/02/02 15:02:49 $
- *
- * Copyright (C) 2003 why the lucky stiff
- * 
- * All Base64 code from Ruby's pack.c.
- * Ruby is Copyright (C) 1993-2003 Yukihiro Matsumoto 
- */
-#include "ruby.h"
-
-#include <stdio.h>
-#include <string.h>
-
-#include "syck.h"
-
-#define DEFAULT_ANCHOR_FORMAT "id%03d"
-
-const char hex_table[] = 
-"0123456789ABCDEF";
-static char b64_table[] =
-"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-/*
- * Built-in base64 (from Ruby's pack.c)
- */
-char *
-syck_base64enc( char *s, long len )
-{
-    long i = 0;
-    int padding = '=';
-    char *buff = S_ALLOC_N(char, len * 4 / 3 + 6);
-
-    while (len >= 3) {
-        buff[i++] = b64_table[077 & (*s >> 2)];
-        buff[i++] = b64_table[077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017))];
-        buff[i++] = b64_table[077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03))];
-        buff[i++] = b64_table[077 & s[2]];
-        s += 3;
-        len -= 3;
-    }
-    if (len == 2) {
-        buff[i++] = b64_table[077 & (*s >> 2)];
-        buff[i++] = b64_table[077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017))];
-        buff[i++] = b64_table[077 & (((s[1] << 2) & 074) | (('\0' >> 6) & 03))];
-        buff[i++] = padding;
-    }
-    else if (len == 1) {
-        buff[i++] = b64_table[077 & (*s >> 2)];
-        buff[i++] = b64_table[077 & (((*s << 4) & 060) | (('\0' >> 4) & 017))];
-        buff[i++] = padding;
-        buff[i++] = padding;
-    }
-    buff[i++] = '\n';
-    return buff;
-}
-
-char *
-syck_base64dec( char *s, long len )
-{
-    int a = -1,b = -1,c = 0,d;
-    static int first = 1;
-    static int b64_xtable[256];
-    char *ptr = syck_strndup( s, len );
-    char *end = ptr;
-    char *send = s + len;
-
-    if (first) {
-        int i;
-        first = 0;
-
-        for (i = 0; i < 256; i++) {
-        b64_xtable[i] = -1;
-        }
-        for (i = 0; i < 64; i++) {
-        b64_xtable[(int)b64_table[i]] = i;
-        }
-    }
-    while (s < send) {
-        while (s[0] == '\r' || s[0] == '\n') { s++; }
-        if ((a = b64_xtable[(int)s[0]]) == -1) break;
-        if ((b = b64_xtable[(int)s[1]]) == -1) break;
-        if ((c = b64_xtable[(int)s[2]]) == -1) break;
-        if ((d = b64_xtable[(int)s[3]]) == -1) break;
-        *end++ = a << 2 | b >> 4;
-        *end++ = b << 4 | c >> 2;
-        *end++ = c << 6 | d;
-        s += 4;
-    }
-    if (a != -1 && b != -1) {
-        if (s + 2 < send && s[2] == '=')
-        *end++ = a << 2 | b >> 4;
-        if (c != -1 && s + 3 < send && s[3] == '=') {
-        *end++ = a << 2 | b >> 4;
-        *end++ = b << 4 | c >> 2;
-        }
-    }
-    *end = '\0';
-    /*RSTRING(buf)->len = ptr - RSTRING(buf)->ptr;*/
-    return ptr;
-}
-
-/*
- * Allocate an emitter
- */
-SyckEmitter *
-syck_new_emitter()
-{
-    SyckEmitter *e;
-    e = S_ALLOC( SyckEmitter );
-    e->headless = 0;
-    e->use_header = 0;
-    e->use_version = 0;
-    e->sort_keys = 0;
-    e->anchor_format = NULL;
-    e->explicit_typing = 0;
-    e->best_width = 80;
-    e->style = scalar_none;
-    e->stage = doc_open;
-    e->indent = 2;
-    e->level = -1;
-    e->anchors = NULL;
-    e->markers = NULL;
-    e->anchored = NULL;
-    e->bufsize = SYCK_BUFFERSIZE;
-    e->buffer = NULL;
-    e->marker = NULL;
-    e->bufpos = 0;
-    e->emitter_handler = NULL;
-    e->output_handler = NULL;
-    e->lvl_idx = 0;
-    e->lvl_capa = ALLOC_CT;
-    e->levels = S_ALLOC_N( SyckLevel, e->lvl_capa ); 
-    syck_emitter_reset_levels( e );
-    e->bonus = NULL;
-    return e;
-}
-
-int
-syck_st_free_anchors( char *key, char *name, char *arg )
-{
-    S_FREE( name );
-    return ST_CONTINUE;
-}
-
-void
-syck_emitter_st_free( SyckEmitter *e )
-{
-    /*
-     * Free the anchor tables
-     */
-    if ( e->anchors != NULL )
-    {
-        st_foreach( e->anchors, syck_st_free_anchors, 0 );
-        st_free_table( e->anchors );
-        e->anchors = NULL;
-    }
-
-    if ( e->anchored != NULL )
-    {
-        st_free_table( e->anchored );
-        e->anchored = NULL;
-    }
-
-    /*
-     * Free the markers tables
-     */
-    if ( e->markers != NULL )
-    {
-        st_free_table( e->markers );
-        e->markers = NULL;
-    }
-}
-
-SyckLevel *
-syck_emitter_current_level( SyckEmitter *e )
-{
-    return &e->levels[e->lvl_idx-1];
-}
-
-SyckLevel *
-syck_emitter_parent_level( SyckEmitter *e )
-{
-    return &e->levels[e->lvl_idx-2];
-}
-
-void
-syck_emitter_pop_level( SyckEmitter *e )
-{
-    ASSERT( e != NULL );
-
-    /* The root level should never be popped */
-    if ( e->lvl_idx <= 1 ) return;
-
-    e->lvl_idx -= 1;
-    free( e->levels[e->lvl_idx].domain );
-}
-
-void 
-syck_emitter_add_level( SyckEmitter *e, int len, enum syck_level_status status )
-{
-    ASSERT( e != NULL );
-    if ( e->lvl_idx + 1 > e->lvl_capa )
-    {
-        e->lvl_capa += ALLOC_CT;
-        S_REALLOC_N( e->levels, SyckLevel, e->lvl_capa );
-    }
-
-    ASSERT( len > e->levels[e->lvl_idx-1].spaces );
-    e->levels[e->lvl_idx].spaces = len;
-    e->levels[e->lvl_idx].ncount = 0;
-    e->levels[e->lvl_idx].domain = syck_strndup( e->levels[e->lvl_idx-1].domain, strlen( e->levels[e->lvl_idx-1].domain ) );
-    e->levels[e->lvl_idx].status = status;
-    e->levels[e->lvl_idx].anctag = 0;
-    e->lvl_idx += 1;
-}
-
-void
-syck_emitter_reset_levels( SyckEmitter *e )
-{
-    while ( e->lvl_idx > 1 )
-    {
-        syck_emitter_pop_level( e );
-    }
-
-    if ( e->lvl_idx < 1 )
-    {
-        e->lvl_idx = 1;
-        e->levels[0].spaces = -1;
-        e->levels[0].ncount = 0;
-        e->levels[0].domain = syck_strndup( "", 0 );
-        e->levels[0].anctag = 0;
-    }
-    e->levels[0].status = syck_lvl_header;
-}
-
-void
-syck_emitter_handler( SyckEmitter *e, SyckEmitterHandler hdlr )
-{
-    e->emitter_handler = hdlr;
-}
-
-void
-syck_output_handler( SyckEmitter *e, SyckOutputHandler hdlr )
-{
-    e->output_handler = hdlr;
-}
-
-void
-syck_free_emitter( SyckEmitter *e )
-{
-    /*
-     * Free tables
-     */
-    syck_emitter_st_free( e );
-    syck_emitter_reset_levels( e );
-    S_FREE( e->levels[0].domain );
-    S_FREE( e->levels );
-    if ( e->buffer != NULL )
-    {
-        S_FREE( e->buffer );
-    }
-    S_FREE( e );
-}
-
-void
-syck_emitter_clear( SyckEmitter *e )
-{
-    if ( e->buffer == NULL )
-    {
-        e->buffer = S_ALLOC_N( char, e->bufsize );
-        S_MEMZERO( e->buffer, char, e->bufsize );
-    }
-    e->buffer[0] = '\0';
-    e->marker = e->buffer;
-    e->bufpos = 0;
-}
-
-/*
- * Raw write to the emitter buffer.
- */
-void
-syck_emitter_write( SyckEmitter *e, char *str, long len )
-{
-    long at;
-    ASSERT( str != NULL )
-    if ( e->buffer == NULL )
-    {
-        syck_emitter_clear( e );
-    }
-    
-    /*
-     * Flush if at end of buffer
-     */
-    at = e->marker - e->buffer;
-    if ( len + at >= e->bufsize )
-    {
-        syck_emitter_flush( e, 0 );
-	for (;;) {
-	    long rest = e->bufsize - (e->marker - e->buffer);
-	    if (len <= rest) break;
-	    S_MEMCPY( e->marker, str, char, rest );
-	    e->marker += rest;
-	    str += rest;
-	    len -= rest;
-	    syck_emitter_flush( e, 0 );
-	}
-    }
-
-    /*
-     * Write to buffer
-     */
-    S_MEMCPY( e->marker, str, char, len );
-    e->marker += len;
-}
-
-/*
- * Write a chunk of data out.
- */
-void
-syck_emitter_flush( SyckEmitter *e, long check_room )
-{
-    /*
-     * Check for enough space in the buffer for check_room length.
-     */
-    if ( check_room > 0 )
-    {
-        if ( e->bufsize > ( e->marker - e->buffer ) + check_room )
-        {
-            return;
-        }
-    }
-    else
-    {
-        check_room = e->bufsize;
-    }
-
-    /*
-     * Commit buffer.
-     */
-    if ( check_room > e->marker - e->buffer )
-    {
-        check_room = e->marker - e->buffer;
-    }
-    (e->output_handler)( e, e->buffer, check_room );
-    e->bufpos += check_room;
-    e->marker -= check_room;
-}
-
-/*
- * Start emitting from the given node, check for anchoring and then
- * issue the callback to the emitter handler.
- */
-void
-syck_emit( SyckEmitter *e, st_data_t n )
-{
-    SYMID oid;
-    char *anchor_name = NULL;
-    int indent = 0;
-    long x = 0;
-    SyckLevel *lvl = syck_emitter_current_level( e );
-    
-    /*
-     * Determine headers.
-     */
-    if ( e->stage == doc_open && ( e->headless == 0 || e->use_header == 1 ) )
-    {
-        if ( e->use_version == 1 )
-        {
-            char *header = S_ALLOC_N( char, 64 );
-            S_MEMZERO( header, char, 64 );
-            sprintf( header, "--- %%YAML:%d.%d ", SYCK_YAML_MAJOR, SYCK_YAML_MINOR );
-            syck_emitter_write( e, header, strlen( header ) );
-            S_FREE( header );
-        }
-        else
-        {
-            syck_emitter_write( e, "--- ", 4 );
-        }
-        e->stage = doc_processing;
-    }
-
-    /* Add new level */
-    if ( lvl->spaces >= 0 ) {
-        indent = lvl->spaces + e->indent;
-    }
-    syck_emitter_add_level( e, indent, syck_lvl_open );
-    lvl = syck_emitter_current_level( e );
-
-    /* Look for anchor */
-    if ( e->anchors != NULL &&
-        st_lookup( e->markers, n, (st_data_t *)&oid ) &&
-        st_lookup( e->anchors, (st_data_t)oid, (st_data_t *)&anchor_name ) )
-    {
-        if ( e->anchored == NULL )
-        {
-            e->anchored = st_init_numtable();
-        }
-
-        if ( ! st_lookup( e->anchored, (st_data_t)anchor_name, (st_data_t *)&x ) )
-        {
-            char *an = S_ALLOC_N( char, strlen( anchor_name ) + 3 );
-            sprintf( an, "&%s ", anchor_name );
-            syck_emitter_write( e, an, strlen( anchor_name ) + 2 );
-            free( an );
-
-            x = 1;
-            st_insert( e->anchored, (st_data_t)anchor_name, (st_data_t)x );
-            lvl->anctag = 1;
-        }
-        else
-        {
-            char *an = S_ALLOC_N( char, strlen( anchor_name ) + 2 );
-            sprintf( an, "*%s", anchor_name );
-            syck_emitter_write( e, an, strlen( anchor_name ) + 1 );
-            free( an );
-
-            goto end_emit;
-        }
-    }
-
-    (e->emitter_handler)( e, n );
-
-    /* Pop the level */
-end_emit:
-    syck_emitter_pop_level( e );
-    if ( e->lvl_idx == 1 ) {
-        syck_emitter_write( e, "\n", 1 );
-        e->headless = 0;
-        e->stage = doc_open;
-    }
-}
-
-/*
- * Determine what tag needs to be written, based on the taguri of the node
- * and the implicit tag which would be assigned to this node.  If a tag is
- * required, write the tag.
- */
-void syck_emit_tag( SyckEmitter *e, char *tag, char *ignore )
-{
-    SyckLevel *lvl;
-    if ( tag == NULL ) return;
-    if ( ignore != NULL && syck_tagcmp( tag, ignore ) == 0 && e->explicit_typing == 0 ) return;
-    lvl = syck_emitter_current_level( e );
-
-    /* implicit */
-    if ( strlen( tag ) == 0 ) {
-        syck_emitter_write( e, "! ", 2 );
-
-    /* global types */
-    } else if ( strncmp( tag, "tag:", 4 ) == 0 ) {
-        int taglen = strlen( tag );
-        syck_emitter_write( e, "!", 1 );
-        if ( strncmp( tag + 4, YAML_DOMAIN, strlen( YAML_DOMAIN ) ) == 0 ) {
-            int skip = 4 + strlen( YAML_DOMAIN ) + 1;
-            syck_emitter_write( e, tag + skip, taglen - skip );
-        } else {
-            char *subd = tag + 4;
-            while ( *subd != ':' && *subd != '\0' ) subd++;
-            if ( *subd == ':' ) {
-                if ( subd - tag > ( strlen( YAML_DOMAIN ) + 5 ) &&
-                     strncmp( subd - strlen( YAML_DOMAIN ), YAML_DOMAIN, strlen( YAML_DOMAIN ) ) == 0 ) {
-                    syck_emitter_write( e, tag + 4, subd - strlen( YAML_DOMAIN ) - ( tag + 4 ) - 1 );
-                    syck_emitter_write( e, "/", 1 );
-                    syck_emitter_write( e, subd + 1, ( tag + taglen ) - ( subd + 1 ) );
-                } else {
-                    syck_emitter_write( e, tag + 4, subd - ( tag + 4 ) );
-                    syck_emitter_write( e, "/", 1 );
-                    syck_emitter_write( e, subd + 1, ( tag + taglen ) - ( subd + 1 ) );
-                }
-            } else {
-                /* TODO: Invalid tag (no colon after domain) */
-                return;
-            }
-        }
-        syck_emitter_write( e, " ", 1 );
-
-    /* private types */
-    } else if ( strncmp( tag, "x-private:", 10 ) == 0 ) {
-        syck_emitter_write( e, "!!", 2 );
-        syck_emitter_write( e, tag + 10, strlen( tag ) - 10 );
-        syck_emitter_write( e, " ", 1 );
-    }
-    lvl->anctag = 1;
-}
-
-/* 
- * Emit a newline and an appropriately spaced indent.
- */
-void syck_emit_indent( SyckEmitter *e )
-{
-    int i;
-    SyckLevel *lvl = syck_emitter_current_level( e );
-    if ( e->bufpos == 0 && ( e->marker - e->buffer ) == 0 ) return;
-    if ( lvl->spaces >= 0 ) {
-        char *spcs = S_ALLOC_N( char, lvl->spaces + 2 );
-
-        spcs[0] = '\n'; spcs[lvl->spaces + 1] = '\0';
-        for ( i = 0; i < lvl->spaces; i++ ) spcs[i+1] = ' ';
-        syck_emitter_write( e, spcs, lvl->spaces + 1 );
-        free( spcs );
-    }
-}
-
-/* Clear the scan */
-#define SCAN_NONE       0
-/* All printable characters? */
-#define SCAN_NONPRINT   1
-/* Any indented lines? */
-#define SCAN_INDENTED   2
-/* Larger than the requested width? */
-#define SCAN_WIDE       4
-/* Opens or closes with whitespace? */
-#define SCAN_WHITEEDGE  8
-/* Contains a newline */
-#define SCAN_NEWLINE    16
-/* Contains a single quote */
-#define SCAN_SINGLEQ    32
-/* Contains a double quote */
-#define SCAN_DOUBLEQ    64
-/* Starts with a token */
-#define SCAN_INDIC_S    128
-/* Contains a flow indicator */
-#define SCAN_INDIC_C    256
-/* Ends without newlines */
-#define SCAN_NONL_E     512
-/* Ends with many newlines */
-#define SCAN_MANYNL_E   1024
-/* Contains flow map indicators */
-#define SCAN_FLOWMAP    2048
-/* Contains flow seq indicators */
-#define SCAN_FLOWSEQ    4096
-/* Contains a valid doc separator */
-#define SCAN_DOCSEP     8192
-
-/*
- * Basic printable test for LATIN-1 characters.
- */
-int
-syck_scan_scalar( int req_width, char *cursor, long len )
-{
-    long i = 0, start = 0;
-    int flags = SCAN_NONE;
-
-    if ( len < 1 )  return flags;
-
-    /* c-indicators from the spec */
-    if ( cursor[0] == '[' || cursor[0] == ']' ||
-         cursor[0] == '{' || cursor[0] == '}' ||
-         cursor[0] == '!' || cursor[0] == '*' ||
-         cursor[0] == '&' || cursor[0] == '|' ||
-         cursor[0] == '>' || cursor[0] == '\'' ||
-         cursor[0] == '"' || cursor[0] == '#' ||
-         cursor[0] == '%' || cursor[0] == '@' ||
-         cursor[0] == '&' ) {
-            flags |= SCAN_INDIC_S;
-    }
-    if ( ( cursor[0] == '-' || cursor[0] == ':' ||
-           cursor[0] == '?' || cursor[0] == ',' ) &&
-           ( cursor[1] == ' ' || cursor[1] == '\n' || len == 1 ) )
-    {
-            flags |= SCAN_INDIC_S;
-    }
-
-    /* whitespace edges */
-    if ( cursor[len-1] != '\n' ) {
-        flags |= SCAN_NONL_E;
-    } else if ( len > 1 && cursor[len-2] == '\n' ) {
-        flags |= SCAN_MANYNL_E;
-    }
-    if ( 
-        ( len > 0 && ( cursor[0] == ' ' || cursor[0] == '\t' ) ) ||
-        ( len > 1 && ( cursor[len-1] == ' ' || cursor[len-1] == '\t' ) )
-    ) {
-        flags |= SCAN_WHITEEDGE;
-    }
-
-    /* opening doc sep */
-    if ( len >= 3 && strncmp( cursor, "---", 3 ) == 0 )
-        flags |= SCAN_DOCSEP;
-
-    /* scan string */
-    for ( i = 0; i < len; i++ ) {
-
-        if ( ! ( cursor[i] == 0x9 ||
-                 cursor[i] == 0xA ||
-                 cursor[i] == 0xD ||
-               ( cursor[i] >= 0x20 && cursor[i] <= 0x7E ) )
-        ) {
-            flags |= SCAN_NONPRINT;
-        }
-        else if ( cursor[i] == '\n' ) {
-            flags |= SCAN_NEWLINE;
-            if ( len - i >= 3 && strncmp( &cursor[i+1], "---", 3 ) == 0 )
-                flags |= SCAN_DOCSEP;
-            if ( cursor[i+1] == ' ' || cursor[i+1] == '\t' ) 
-                flags |= SCAN_INDENTED;
-            if ( req_width > 0 && i - start > req_width )
-                flags |= SCAN_WIDE;
-            start = i;
-        }
-        else if ( cursor[i] == '\'' )
-        {
-            flags |= SCAN_SINGLEQ;
-        }
-        else if ( cursor[i] == '"' )
-        {
-            flags |= SCAN_DOUBLEQ;
-        }
-        else if ( cursor[i] == ']' )
-        {
-            flags |= SCAN_FLOWSEQ;
-        }
-        else if ( cursor[i] == '}' )
-        {
-            flags |= SCAN_FLOWMAP;
-        }
-        /* remember, if plain collections get implemented, to add nb-plain-flow-char */
-        else if ( ( cursor[i] == ' ' && cursor[i+1] == '#' ) ||
-                  ( cursor[i] == ':' && 
-                    ( cursor[i+1] == ' ' || cursor[i+1] == '\n' || i == len - 1 ) ) )
-        {
-            flags |= SCAN_INDIC_C;
-        }
-        else if ( cursor[i] == ',' && 
-                  ( cursor[i+1] == ' ' || cursor[i+1] == '\n' || i == len - 1 ) )
-        {
-            flags |= SCAN_FLOWMAP;
-            flags |= SCAN_FLOWSEQ;
-        }
-    }
-
-    /* printf( "---STR---\n%s\nFLAGS: %d\n", cursor, flags ); */
-    return flags;
-}
-/*
- * All scalars should be emitted through this function, which determines an appropriate style,
- * tag and indent.
- */
-void syck_emit_scalar( SyckEmitter *e, char *tag, enum scalar_style force_style, int force_indent, int force_width,
-                       char keep_nl, char *str, long len )
-{
-    enum scalar_style favor_style = scalar_literal;
-    SyckLevel *parent = syck_emitter_parent_level( e );
-    SyckLevel *lvl = syck_emitter_current_level( e );
-    int scan = 0;
-    char *implicit;
-    
-    if ( str == NULL ) str = "";
-
-    /* No empty nulls as map keys */
-    if ( len == 0 && ( parent->status == syck_lvl_map || parent->status == syck_lvl_imap ) && 
-         parent->ncount % 2 == 1 && syck_tagcmp( tag, "tag:yaml.org,2002:null" ) == 0 ) 
-    {
-        str = "~";
-        len = 1;
-    }
-
-    scan = syck_scan_scalar( force_width, str, len );
-    implicit = syck_match_implicit( str, len );
-
-    /* quote strings which default to implicits */
-    implicit = syck_taguri( YAML_DOMAIN, implicit, strlen( implicit ) );
-    if ( syck_tagcmp( tag, implicit ) != 0 && syck_tagcmp( tag, "tag:yaml.org,2002:str" ) == 0 ) {
-        force_style = scalar_2quote;
-    } else {
-        /* complex key */
-        if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 &&
-             ( !( tag == NULL || 
-             ( implicit != NULL && syck_tagcmp( tag, implicit ) == 0 && e->explicit_typing == 0 ) ) ) ) 
-        {
-            syck_emitter_write( e, "? ", 2 );
-            parent->status = syck_lvl_mapx;
-        }
-        syck_emit_tag( e, tag, implicit );
-    }
-    S_FREE( implicit );
-
-    /* if still arbitrary, sniff a good block style. */
-    if ( force_style == scalar_none ) {
-        if ( scan & SCAN_NEWLINE ) {
-            force_style = scalar_literal;
-        } else {
-            force_style = scalar_plain;
-        }
-    }
-
-    if ( e->style == scalar_fold ) {
-        favor_style = scalar_fold;
-    }
-
-    /* Determine block style */
-    if ( scan & SCAN_NONPRINT ) {
-        force_style = scalar_2quote;
-    } else if ( scan & SCAN_WHITEEDGE ) {
-        force_style = scalar_2quote;
-    } else if ( force_style != scalar_fold && ( scan & SCAN_INDENTED ) ) {
-        force_style = scalar_literal;
-    } else if ( force_style == scalar_plain && ( scan & SCAN_NEWLINE ) ) {
-        force_style = favor_style;
-    } else if ( force_style == scalar_plain && parent->status == syck_lvl_iseq && ( scan & SCAN_FLOWSEQ ) ) {
-        force_style = scalar_2quote;
-    } else if ( force_style == scalar_plain && parent->status == syck_lvl_imap && ( scan & SCAN_FLOWMAP ) ) {
-        force_style = scalar_2quote;
-    /* } else if ( force_style == scalar_fold && ( ! ( scan & SCAN_WIDE ) ) ) {
-        force_style = scalar_literal; */
-    } else if ( force_style == scalar_plain && ( scan & SCAN_INDIC_S || scan & SCAN_INDIC_C ) ) {
-        if ( scan & SCAN_NEWLINE ) {
-            force_style = favor_style;
-        } else {
-            force_style = scalar_2quote;
-        }
-    }
-
-    if ( force_indent > 0 ) {
-        lvl->spaces = parent->spaces + force_indent;
-    } else if ( scan & SCAN_DOCSEP ) {
-        lvl->spaces = parent->spaces + e->indent;
-    }
-
-    /* For now, all ambiguous keys are going to be double-quoted */
-    if ( ( parent->status == syck_lvl_map || parent->status == syck_lvl_mapx ) && parent->ncount % 2 == 1 ) {
-        if ( force_style != scalar_plain ) {
-            force_style = scalar_2quote;
-        }
-    }
-
-    /* If the parent is an inline, double quote anything complex */
-    if ( parent->status == syck_lvl_imap || parent->status == syck_lvl_iseq ) {
-        if ( force_style != scalar_plain && force_style != scalar_1quote ) {
-            force_style = scalar_2quote;
-        }
-    }
-
-    /* Fix the ending newlines */
-    if ( scan & SCAN_NONL_E ) {
-        keep_nl = NL_CHOMP;
-    } else if ( scan & SCAN_MANYNL_E ) {
-        keep_nl = NL_KEEP;
-    }
-
-    /* Write the text node */
-    switch ( force_style )
-    {
-        case scalar_1quote:
-            syck_emit_1quoted( e, force_width, str, len );
-        break;
-
-        case scalar_none:
-        case scalar_2quote:
-            syck_emit_2quoted( e, force_width, str, len );
-        break;
-
-        case scalar_fold:
-            syck_emit_folded( e, force_width, keep_nl, str, len );
-        break;
-
-        case scalar_literal:
-            syck_emit_literal( e, keep_nl, str, len );
-        break;
-
-        case scalar_plain:
-            syck_emitter_write( e, str, len );
-        break;
-    }
-
-    if ( parent->status == syck_lvl_mapx )
-    {
-        syck_emitter_write( e, "\n", 1 );
-    }
-}
-
-void
-syck_emitter_escape( SyckEmitter *e, char *src, long len )
-{
-    int i;
-    for( i = 0; i < len; i++ )
-    {
-        if( (src[i] < 0x20) || (0x7E < src[i]) )
-        {
-            syck_emitter_write( e, "\\", 1 );
-            if( '\0' == src[i] )
-                syck_emitter_write( e, "0", 1 );
-            else
-            {
-                syck_emitter_write( e, "x", 1 );
-                syck_emitter_write( e, (char *)hex_table + ((src[i] & 0xF0) >> 4), 1 );
-                syck_emitter_write( e, (char *)hex_table + (src[i] & 0x0F), 1 );
-            }
-        }
-        else
-        {
-            syck_emitter_write( e, src + i, 1 );
-            if( '\\' == src[i] )
-                syck_emitter_write( e, "\\", 1 );
-        }
-    }
-}
-
-/*
- * Outputs a single-quoted block.
- */
-void syck_emit_1quoted( SyckEmitter *e, int width, char *str, long len )
-{
-    char do_indent = 0;
-    char *mark = str;
-    char *start = str;
-    char *end = str;
-    syck_emitter_write( e, "'", 1 );
-    while ( mark < str + len ) {
-        if ( do_indent ) {
-            syck_emit_indent( e );
-            do_indent = 0;
-        }
-        switch ( *mark ) {
-            case '\'':  syck_emitter_write( e, "'", 1 ); break;
-
-            case '\n':
-                end = mark + 1;
-                if ( *start != ' ' && *start != '\n' && *end != '\n' && *end != ' ' ) {
-                    syck_emitter_write( e, "\n\n", 2 );
-                } else {
-                    syck_emitter_write( e, "\n", 1 );
-                }
-                do_indent = 1;
-                start = mark + 1;
-            break;
-
-            case ' ':
-                if ( width > 0 && *start != ' ' && mark - end > width ) {
-                    do_indent = 1;
-                    end = mark + 1;
-                } else {
-                    syck_emitter_write( e, " ", 1 );
-                }
-            break;
-
-            default:
-                syck_emitter_write( e, mark, 1 );
-            break;
-        }
-        mark++;
-    }
-    syck_emitter_write( e, "'", 1 );
-}
-
-/*
- * Outputs a double-quoted block.
- */
-void syck_emit_2quoted( SyckEmitter *e, int width, char *str, long len )
-{
-    char do_indent = 0;
-    char *mark = str;
-    char *start = str;
-    char *end = str;
-    syck_emitter_write( e, "\"", 1 );
-    while ( mark < str + len ) {
-        if ( do_indent > 0 ) {
-            if ( do_indent == 2 ) {
-                syck_emitter_write( e, "\\", 1 );
-            }
-            syck_emit_indent( e );
-            do_indent = 0;
-        }
-        switch ( *mark ) {
-
-            /* Escape sequences allowed within double quotes. */
-            case '"':  syck_emitter_write( e, "\\\"", 2 ); break;
-            case '\\': syck_emitter_write( e, "\\\\", 2 ); break;
-            case '\0': syck_emitter_write( e, "\\0",  2 ); break;
-            case '\a': syck_emitter_write( e, "\\a",  2 ); break;
-            case '\b': syck_emitter_write( e, "\\b",  2 ); break;
-            case '\f': syck_emitter_write( e, "\\f",  2 ); break;
-            case '\r': syck_emitter_write( e, "\\r",  2 ); break;
-            case '\t': syck_emitter_write( e, "\\t",  2 ); break;
-            case '\v': syck_emitter_write( e, "\\v",  2 ); break;
-            case 0x1b: syck_emitter_write( e, "\\e",  2 ); break;
-
-            case '\n':
-                end = mark + 1;
-                syck_emitter_write( e, "\\n", 2 );
-                do_indent = 2;
-                start = mark + 1;
-                if ( start < str + len && ( *start == ' ' || *start == '\n' ) ) {
-                    do_indent = 0;
-                }
-            break;
-
-            case ' ':
-                if ( width > 0 && *start != ' ' && mark - end > width ) {
-                    do_indent = 1;
-                    end = mark + 1;
-                } else {
-                    syck_emitter_write( e, " ", 1 );
-                }
-            break;
-
-            default:
-                syck_emitter_escape( e, mark, 1 );
-            break;
-        }
-        mark++;
-    }
-    syck_emitter_write( e, "\"", 1 );
-}
-
-/*
- * Outputs a literal block.
- */
-void syck_emit_literal( SyckEmitter *e, char keep_nl, char *str, long len )
-{
-    char *mark = str;
-    char *start = str;
-    char *end = str;
-    syck_emitter_write( e, "|", 1 );
-    if ( keep_nl == NL_CHOMP ) {
-        syck_emitter_write( e, "-", 1 );
-    } else if ( keep_nl == NL_KEEP ) {
-        syck_emitter_write( e, "+", 1 );
-    }
-    syck_emit_indent( e );
-    while ( mark < str + len ) {
-        if ( *mark == '\n' ) {
-            end = mark;
-            if ( *start != ' ' && *start != '\n' && *end != '\n' && *end != ' ' ) end += 1;
-            syck_emitter_write( e, start, end - start );
-            if ( mark + 1 == str + len ) {
-                if ( keep_nl != NL_KEEP ) syck_emitter_write( e, "\n", 1 );
-            } else {
-                syck_emit_indent( e );
-            }
-            start = mark + 1;
-        }
-        mark++;
-    }
-    end = str + len;
-    if ( start < end ) {
-        syck_emitter_write( e, start, end - start );
-    }
-}
-
-/*
- * Outputs a folded block.
- */
-void syck_emit_folded( SyckEmitter *e, int width, char keep_nl, char *str, long len )
-{
-    char *mark = str;
-    char *start = str;
-    char *end = str;
-    syck_emitter_write( e, ">", 1 );
-    if ( keep_nl == NL_CHOMP ) {
-        syck_emitter_write( e, "-", 1 );
-    } else if ( keep_nl == NL_KEEP ) {
-        syck_emitter_write( e, "+", 1 );
-    }
-    syck_emit_indent( e );
-    if ( width <= 0 ) width = e->best_width;
-    while ( mark < str + len ) {
-        switch ( *mark ) {
-            case '\n':
-                syck_emitter_write( e, end, mark - end );
-                end = mark + 1;
-                if ( *start != ' ' && *start != '\n' && *end != '\n' && *end != ' ' ) {
-                    syck_emitter_write( e, "\n", 1 );
-                }
-                if ( mark + 1 == str + len ) {
-                    if ( keep_nl != NL_KEEP ) syck_emitter_write( e, "\n", 1 );
-                } else {
-                    syck_emit_indent( e );
-                }
-                start = mark + 1;
-            break;
-
-            case ' ':
-                if ( *start != ' ' ) {
-                    if ( mark - end > width ) {
-                        syck_emitter_write( e, end, mark - end );
-                        syck_emit_indent( e );
-                        end = mark + 1;
-                    }
-                }
-            break;
-        }
-        mark++;
-    }
-    if ( end < mark ) {
-        syck_emitter_write( e, end, mark - end );
-    }
-}
-
-/*
- * Begins emission of a sequence.
- */
-void syck_emit_seq( SyckEmitter *e, char *tag, enum seq_style style )
-{
-    SyckLevel *parent = syck_emitter_parent_level( e );
-    SyckLevel *lvl = syck_emitter_current_level( e );
-    syck_emit_tag( e, tag, "tag:yaml.org,2002:seq" );
-    if ( style == seq_inline || ( parent->status == syck_lvl_imap || parent->status == syck_lvl_iseq ) ) {
-        syck_emitter_write( e, "[", 1 );
-        lvl->status = syck_lvl_iseq;
-    } else {
-        /* complex key */
-        if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 ) {
-            syck_emitter_write( e, "? ", 2 );
-            parent->status = syck_lvl_mapx;
-        }
-        lvl->status = syck_lvl_seq;
-    }
-}
-
-/*
- * Begins emission of a mapping.
- */
-void syck_emit_map( SyckEmitter *e, char *tag, enum map_style style )
-{
-    SyckLevel *parent = syck_emitter_parent_level( e );
-    SyckLevel *lvl = syck_emitter_current_level( e );
-    syck_emit_tag( e, tag, "tag:yaml.org,2002:map" );
-    if ( style == map_inline || ( parent->status == syck_lvl_imap || parent->status == syck_lvl_iseq ) ) {
-        syck_emitter_write( e, "{", 1 );
-        lvl->status = syck_lvl_imap;
-    } else {
-        /* complex key */
-        if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 ) {
-            syck_emitter_write( e, "? ", 2 );
-            parent->status = syck_lvl_mapx;
-        }
-        lvl->status = syck_lvl_map;
-    }
-}
-
-/*
- * Handles emitting of a collection item (for both
- * sequences and maps)
- */
-void syck_emit_item( SyckEmitter *e, st_data_t n )
-{
-    SyckLevel *lvl = syck_emitter_current_level( e );
-    switch ( lvl->status )
-    {
-        case syck_lvl_seq:
-        {
-            SyckLevel *parent = syck_emitter_parent_level( e );
-
-            /* seq-in-map shortcut -- the lvl->anctag check should be unneccesary but
-             * there is a nasty shift/reduce in the parser on this point and
-             * i'm not ready to tickle it. */
-            if ( lvl->anctag == 0 && parent->status == syck_lvl_map && lvl->ncount == 0 ) {
-                lvl->spaces = parent->spaces;
-            }
-
-            /* seq-in-seq shortcut */
-            else if ( lvl->anctag == 0 && parent->status == syck_lvl_seq && lvl->ncount == 0 ) {
-                int spcs = ( lvl->spaces - parent->spaces ) - 2;
-                if ( spcs >= 0 ) {
-                    int i = 0;
-                    for ( i = 0; i < spcs; i++ ) {
-                        syck_emitter_write( e, " ", 1 );
-                    }
-                    syck_emitter_write( e, "- ", 2 );
-                    break;
-                }
-            }
-
-            syck_emit_indent( e );
-            syck_emitter_write( e, "- ", 2 );
-        }
-        break;
-
-        case syck_lvl_iseq:
-        {
-            if ( lvl->ncount > 0 ) {
-                syck_emitter_write( e, ", ", 2 );
-            }
-        }
-        break;
-
-        case syck_lvl_map:
-        {
-            SyckLevel *parent = syck_emitter_parent_level( e );
-
-            /* map-in-seq shortcut */
-            if ( lvl->anctag == 0 && parent->status == syck_lvl_seq && lvl->ncount == 0 ) {
-                int spcs = ( lvl->spaces - parent->spaces ) - 2;
-                if ( spcs >= 0 ) {
-                    int i = 0;
-                    for ( i = 0; i < spcs; i++ ) {
-                        syck_emitter_write( e, " ", 1 );
-                    }
-                    break;
-                }
-            }
-
-            if ( lvl->ncount % 2 == 0 ) {
-                syck_emit_indent( e );
-            } else {
-                syck_emitter_write( e, ": ", 2 );
-            }
-        }
-        break;
-
-        case syck_lvl_mapx:
-        {
-            if ( lvl->ncount % 2 == 0 ) {
-                syck_emit_indent( e );
-                lvl->status = syck_lvl_map;
-            } else {
-                int i;
-                if ( lvl->spaces > 0 ) {
-                    char *spcs = S_ALLOC_N( char, lvl->spaces + 1 );
-
-                    spcs[lvl->spaces] = '\0';
-                    for ( i = 0; i < lvl->spaces; i++ ) spcs[i] = ' ';
-                    syck_emitter_write( e, spcs, lvl->spaces );
-                    S_FREE( spcs );
-                }
-                syck_emitter_write( e, ": ", 2 );
-            }
-        }
-        break;
-
-        case syck_lvl_imap:
-        {
-            if ( lvl->ncount > 0 ) {
-                if ( lvl->ncount % 2 == 0 ) {
-                    syck_emitter_write( e, ", ", 2 );
-                } else {
-                    syck_emitter_write( e, ": ", 2 );
-                }
-            }
-        }
-        break;
-
-        default: break;
-    }
-    lvl->ncount++;
-
-    syck_emit( e, n );
-}
-
-/*
- * Closes emission of a collection.
- */
-void syck_emit_end( SyckEmitter *e )
-{
-    SyckLevel *lvl = syck_emitter_current_level( e );
-    SyckLevel *parent = syck_emitter_parent_level( e );
-    switch ( lvl->status )
-    {
-        case syck_lvl_seq:
-            if ( lvl->ncount == 0 ) {
-                syck_emitter_write( e, "[]\n", 3 );
-            } else if ( parent->status == syck_lvl_mapx ) {
-                syck_emitter_write( e, "\n", 1 );
-            }
-        break;
-
-        case syck_lvl_iseq:
-            syck_emitter_write( e, "]\n", 1 );
-        break;
-
-        case syck_lvl_map:
-            if ( lvl->ncount == 0 ) {
-                syck_emitter_write( e, "{}\n", 3 );
-            } else if ( lvl->ncount % 2 == 1 ) {
-                syck_emitter_write( e, ":\n", 1 );
-            } else if ( parent->status == syck_lvl_mapx ) {
-                syck_emitter_write( e, "\n", 1 );
-            }
-        break;
-
-        case syck_lvl_imap:
-            syck_emitter_write( e, "}\n", 1 );
-        break;
-
-        default: break;
-    }
-}
-
-/*
- * Fill markers table with emitter nodes in the
- * soon-to-be-emitted tree.
- */
-SYMID
-syck_emitter_mark_node( SyckEmitter *e, st_data_t n )
-{
-    SYMID oid = 0;
-    char *anchor_name = NULL;
-
-    /*
-     * Ensure markers table is initialized.
-     */
-    if ( e->markers == NULL )
-    {
-        e->markers = st_init_numtable();
-    }
-
-    /*
-     * Markers table initially marks the string position of the
-     * object.  Doesn't yet create an anchor, simply notes the
-     * position.
-     */
-    if ( ! st_lookup( e->markers, n, (st_data_t *)&oid ) )
-    {
-        /*
-         * Store all markers
-         */
-        oid = e->markers->num_entries + 1;
-        st_insert( e->markers, n, (st_data_t)oid );
-    }
-    else
-    {
-        if ( e->anchors == NULL )
-        {
-            e->anchors = st_init_numtable();
-        }
-
-        if ( ! st_lookup( e->anchors, (st_data_t)oid, (st_data_t *)&anchor_name ) )
-        {
-            int idx = 0;
-            char *anc = ( e->anchor_format == NULL ? DEFAULT_ANCHOR_FORMAT : e->anchor_format );
-
-            /*
-             * Second time hitting this object, let's give it an anchor
-             */
-            idx = e->anchors->num_entries + 1;
-            anchor_name = S_ALLOC_N( char, strlen( anc ) + 10 );
-            S_MEMZERO( anchor_name, char, strlen( anc ) + 10 );
-            sprintf( anchor_name, anc, idx );
-
-            /*
-             * Insert into anchors table
-             */
-            st_insert( e->anchors, (st_data_t)oid, (st_data_t)anchor_name );
-        }
-    }
-    return oid;
-}
-
+/*
+ * emitter.c
+ *
+ * $Author: why $
+ * $Date: 2004/05/06 06:29:56 $
+ *
+ * Copyright (C) 2003 why the lucky stiff
+ * 
+ * All Base64 code from Ruby's pack.c.
+ * Ruby is Copyright (C) 1993-2003 Yukihiro Matsumoto 
+ */
+#include "ruby.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "syck.h"
+
+#define DEFAULT_ANCHOR_FORMAT "id%03d"
+
+static char b64_table[] =
+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+struct adjust_arg {
+    /* Position to start adjusting */
+    long startpos;
+    /* Adjusting by an offset */
+    int offset;
+};
+
+/*
+ * Built-in base64 (from Ruby's pack.c)
+ */
+char *
+syck_base64enc( char *s, long len )
+{
+    long i = 0;
+    int padding = '=';
+    char *buff = S_ALLOCA_N(char, len * 4 / 3 + 6);
+
+    while (len >= 3) {
+        buff[i++] = b64_table[077 & (*s >> 2)];
+        buff[i++] = b64_table[077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017))];
+        buff[i++] = b64_table[077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03))];
+        buff[i++] = b64_table[077 & s[2]];
+        s += 3;
+        len -= 3;
+    }
+    if (len == 2) {
+        buff[i++] = b64_table[077 & (*s >> 2)];
+        buff[i++] = b64_table[077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017))];
+        buff[i++] = b64_table[077 & (((s[1] << 2) & 074) | (('\0' >> 6) & 03))];
+        buff[i++] = padding;
+    }
+    else if (len == 1) {
+        buff[i++] = b64_table[077 & (*s >> 2)];
+        buff[i++] = b64_table[077 & (((*s << 4) & 060) | (('\0' >> 4) & 017))];
+        buff[i++] = padding;
+        buff[i++] = padding;
+    }
+    buff[i++] = '\n';
+    return buff;
+}
+
+char *
+syck_base64dec( char *s, long len )
+{
+    int a = -1,b = -1,c = 0,d;
+    static int first = 1;
+    static int b64_xtable[256];
+    char *ptr = syck_strndup( s, len );
+    char *end = ptr;
+    char *send = s + len;
+
+    if (first) {
+        int i;
+        first = 0;
+
+        for (i = 0; i < 256; i++) {
+        b64_xtable[i] = -1;
+        }
+        for (i = 0; i < 64; i++) {
+        b64_xtable[(int)b64_table[i]] = i;
+        }
+    }
+    while (s < send) {
+        while (s[0] == '\r' || s[0] == '\n') { s++; }
+        if ((a = b64_xtable[(int)s[0]]) == -1) break;
+        if ((b = b64_xtable[(int)s[1]]) == -1) break;
+        if ((c = b64_xtable[(int)s[2]]) == -1) break;
+        if ((d = b64_xtable[(int)s[3]]) == -1) break;
+        *end++ = a << 2 | b >> 4;
+        *end++ = b << 4 | c >> 2;
+        *end++ = c << 6 | d;
+        s += 4;
+    }
+    if (a != -1 && b != -1) {
+        if (s + 2 < send && s[2] == '=')
+        *end++ = a << 2 | b >> 4;
+        if (c != -1 && s + 3 < send && s[3] == '=') {
+        *end++ = a << 2 | b >> 4;
+        *end++ = b << 4 | c >> 2;
+        }
+    }
+    *end = '\0';
+    /*RSTRING(buf)->len = ptr - RSTRING(buf)->ptr;*/
+    return ptr;
+}
+
+/*
+ * Allocate an emitter
+ */
+SyckEmitter *
+syck_new_emitter()
+{
+    SyckEmitter *e;
+    e = S_ALLOC( SyckEmitter );
+    e->headless = 0;
+    e->seq_map = 0;
+    e->use_header = 0;
+    e->use_version = 0;
+    e->sort_keys = 0;
+    e->anchor_format = NULL;
+    e->explicit_typing = 0;
+    e->best_width = 80;
+    e->block_style = block_arbitrary;
+    e->stage = doc_open;
+    e->indent = 2;
+    e->level = -1;
+    e->ignore_id = 0;
+    e->anchors = NULL;
+    e->markers = NULL;
+    e->bufsize = SYCK_BUFFERSIZE;
+    e->buffer = NULL;
+    e->marker = NULL;
+    e->bufpos = 0;
+    e->handler = NULL;
+    e->bonus = NULL;
+    return e;
+}
+
+int
+syck_st_free_anchors( char *key, char *name, char *arg )
+{
+    S_FREE( name );
+    return ST_CONTINUE;
+}
+
+int
+syck_st_free_markers( char *key, SyckEmitterNode *n, char *arg )
+{
+    S_FREE( n );
+    return ST_CONTINUE;
+}
+
+void
+syck_emitter_st_free( SyckEmitter *e )
+{
+    /*
+     * Free the anchor tables
+     */
+    if ( e->anchors != NULL )
+    {
+        st_foreach( e->anchors, syck_st_free_anchors, 0 );
+        st_free_table( e->anchors );
+        e->anchors = NULL;
+    }
+
+    /*
+     * Free the markers tables
+     */
+    if ( e->markers != NULL )
+    {
+        st_foreach( e->markers, syck_st_free_markers, 0 );
+        st_free_table( e->markers );
+        e->markers = NULL;
+    }
+}
+
+void
+syck_emitter_ignore_id( SyckEmitter *e, SYMID id )
+{
+    e->ignore_id = id;
+}
+
+void
+syck_emitter_handler( SyckEmitter *e, SyckOutputHandler hdlr )
+{
+    e->handler = hdlr;
+}
+
+void
+syck_free_emitter( SyckEmitter *e )
+{
+    /*
+     * Free tables
+     */
+    syck_emitter_st_free( e );
+    if ( e->buffer != NULL )
+    {
+        S_FREE( e->buffer );
+    }
+    S_FREE( e );
+}
+
+void
+syck_emitter_clear( SyckEmitter *e )
+{
+    if ( e->buffer == NULL )
+    {
+        e->buffer = S_ALLOC_N( char, e->bufsize );
+        S_MEMZERO( e->buffer, char, e->bufsize );
+    }
+    e->buffer[0] = '\0';
+    e->marker = e->buffer;
+    e->bufpos = 0;
+}
+
+/*
+ * Raw write to the emitter buffer.
+ */
+void
+syck_emitter_write( SyckEmitter *e, char *str, long len )
+{
+    long at;
+    ASSERT( str != NULL )
+    if ( e->buffer == NULL )
+    {
+        syck_emitter_clear( e );
+    }
+    
+    /*
+     * Flush if at end of buffer
+     */
+    at = e->marker - e->buffer;
+    if ( len + at >= e->bufsize )
+    {
+        syck_emitter_flush( e, 0 );
+	for (;;) {
+	    long rest = e->bufsize - (e->marker - e->buffer);
+	    if (len <= rest) break;
+	    S_MEMCPY( e->marker, str, char, rest );
+	    e->marker += rest;
+	    str += rest;
+	    len -= rest;
+	    syck_emitter_flush( e, 0 );
+	}
+    }
+
+    /*
+     * Write to buffer
+     */
+    S_MEMCPY( e->marker, str, char, len );
+    e->marker += len;
+}
+
+/*
+ * Write a chunk of data out.
+ */
+void
+syck_emitter_flush( SyckEmitter *e, long check_room )
+{
+    /*
+     * Check for enough space in the buffer for check_room length.
+     */
+    if ( check_room > 0 )
+    {
+        if ( e->bufsize > ( e->marker - e->buffer ) + check_room )
+        {
+            return;
+        }
+    }
+    else
+    {
+        check_room = e->bufsize;
+    }
+
+    /*
+     * Determine headers.
+     */
+    if ( ( e->stage == doc_open && ( e->headless == 0 || e->use_header == 1 ) ) || 
+         e->stage == doc_need_header )
+    {
+        if ( e->use_version == 1 )
+        {
+            char *header = S_ALLOC_N( char, 64 );
+            S_MEMZERO( header, char, 64 );
+            sprintf( header, "--- %%YAML:%d.%d ", SYCK_YAML_MAJOR, SYCK_YAML_MINOR );
+            (e->handler)( e, header, strlen( header ) );
+            S_FREE( header );
+        }
+        else
+        {
+            (e->handler)( e, "--- ", 4 );
+        }
+        e->stage = doc_processing;
+    }
+
+    /*
+     * Commit buffer.
+     */
+    if ( check_room > e->marker - e->buffer )
+    {
+        check_room = e->marker - e->buffer;
+    }
+    (e->handler)( e, e->buffer, check_room );
+    e->bufpos += check_room;
+    e->marker -= check_room;
+}
+
+/*
+ * Emit a simple, unquoted string.
+ */
+void
+syck_emitter_simple( SyckEmitter *e, char *str, long len )
+{
+    e->seq_map = 0;
+    syck_emitter_write( e, str, len );
+}
+
+/*
+ * Shift the offsets of all applicable anchors
+ */
+int
+syck_adjust_anchors( char *key, SyckEmitterNode *n, struct adjust_arg *arg )
+{
+    if ( arg->startpos < n->pos )
+    {
+        n->pos += arg->offset;
+    }
+    return ST_CONTINUE;
+}
+
+/*
+ * call on start of an object's marshalling
+ * (handles anchors, returns an alias)
+ */
+char *
+syck_emitter_start_obj( SyckEmitter *e, SYMID oid )
+{
+    SyckEmitterNode *n = NULL;
+    char *anchor_name = NULL;
+
+    e->level++;
+    if ( oid != e->ignore_id )
+    {
+        /*
+         * Look for anchors
+         */
+        if ( e->markers == NULL )
+        {
+            e->markers = st_init_numtable();
+        }
+
+        /*
+         * Markers table initially marks the string position of the
+         * object.  Doesn't yet create an anchor, simply notes the
+         * position.
+         */
+        if ( ! st_lookup( e->markers, (st_data_t)oid, (st_data_t *)&n ) )
+        {
+            /*
+             * Store all markers
+             */
+            n = S_ALLOC( SyckEmitterNode );
+            n->is_shortcut = 0;
+            n->indent = e->level * e->indent;
+            n->pos = e->bufpos + ( e->marker - e->buffer );
+            st_insert( e->markers, (st_data_t)oid, (st_data_t)n );
+        }
+        else
+        {
+            if ( e->anchors == NULL )
+            {
+                e->anchors = st_init_numtable();
+            }
+
+            if ( ! st_lookup( e->anchors, (st_data_t)oid, (st_data_t *)&anchor_name ) )
+            {
+                int idx = 0;
+                /*
+                 * Second time hitting this object, let's give it an anchor
+                 */
+                idx = e->anchors->num_entries + 1;
+
+                /*
+                 * Create the anchor tag
+                 */
+                if ( n->pos >= e->bufpos )
+                {
+                    int alen;
+                    struct adjust_arg *args = S_ALLOC( struct adjust_arg );
+                    char *start = e->buffer + ( n->pos - e->bufpos );
+
+                    char *anc = ( e->anchor_format == NULL ? DEFAULT_ANCHOR_FORMAT : e->anchor_format );
+                    anchor_name = S_ALLOC_N( char, strlen( anc ) + 10 );
+                    S_MEMZERO( anchor_name, char, strlen( anc ) + 10 );
+                    sprintf( anchor_name, anc, idx );
+
+                    /*
+                     * Need to flush the buffer some, if there is not room for the anchor.
+                     */
+                    alen = strlen( anchor_name ) + 2;
+                    syck_emitter_flush( e, alen );
+
+                    /*
+                     * Write the anchor into the buffer
+                     */
+                    S_MEMMOVE( start + alen, start, char, e->marker - start );
+                    S_MEMCPY( start + 1, anchor_name, char, strlen( anchor_name ) );
+                    start[0] = '&';
+                    start[alen - 1] = ' ';
+                    e->marker += alen;
+
+                    /*
+                     * Cycle through anchors, modify for the size of the anchor.
+                     */
+                    args->startpos = n->pos;
+                    args->offset = alen;
+                    st_foreach( e->markers, syck_adjust_anchors, (st_data_t)args );
+                    S_FREE( args );
+
+                    /*
+                     * Insert into anchors table
+                     */
+                    st_insert( e->anchors, (st_data_t)oid, (st_data_t)anchor_name );
+                }
+            }
+
+        }
+    }
+
+    return anchor_name;
+}
+
+/*
+ * call on completion of an object's marshalling
+ */
+void
+syck_emitter_end_obj( SyckEmitter *e )
+{
+    e->level--;
+}
+

Modified: trunk/ext/syck/gram.c
===================================================================
--- trunk/ext/syck/gram.c	2006-02-20 05:50:08 UTC (rev 448)
+++ trunk/ext/syck/gram.c	2006-02-20 06:15:42 UTC (rev 449)
@@ -1,1894 +1,1796 @@
-/* A Bison parser, made by GNU Bison 1.875d.  */
-
-/* Skeleton parser for Yacc-like parsing with Bison,
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
-/* As a special exception, when this file is copied by Bison into a
-   Bison output file, you may use that output file without restriction.
-   This special exception was added by the Free Software Foundation
-   in version 1.24 of Bison.  */
-
-/* Written by Richard Stallman by simplifying the original so called
-   ``semantic'' parser.  */
-
-/* All symbols defined below should begin with yy or YY, to avoid
-   infringing on user name space.  This should be done even for local
-   variables, as they might otherwise be expanded by user macros.
-   There are some unavoidable exceptions within include files to
-   define necessary library symbols; they are noted "INFRINGES ON
-   USER NAME SPACE" below.  */
-
-/* Identify Bison output.  */
-#define YYBISON 1
-
-/* Skeleton name.  */
-#define YYSKELETON_NAME "yacc.c"
-
-/* Pure parsers.  */
-#define YYPURE 1
-
-/* Using locations.  */
-#define YYLSP_NEEDED 0
-
-/* If NAME_PREFIX is specified substitute the variables and functions
-   names.  */
-#define yyparse syckparse
-#define yylex   sycklex
-#define yyerror syckerror
-#define yylval  sycklval
-#define yychar  syckchar
-#define yydebug syckdebug
-#define yynerrs sycknerrs
-
-
-/* Tokens.  */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     YAML_ANCHOR = 258,
-     YAML_ALIAS = 259,
-     YAML_TRANSFER = 260,
-     YAML_TAGURI = 261,
-     YAML_ITRANSFER = 262,
-     YAML_WORD = 263,
-     YAML_PLAIN = 264,
-     YAML_BLOCK = 265,
-     YAML_DOCSEP = 266,
-     YAML_IOPEN = 267,
-     YAML_INDENT = 268,
-     YAML_IEND = 269
-   };
-#endif
-#define YAML_ANCHOR 258
-#define YAML_ALIAS 259
-#define YAML_TRANSFER 260
-#define YAML_TAGURI 261
-#define YAML_ITRANSFER 262
-#define YAML_WORD 263
-#define YAML_PLAIN 264
-#define YAML_BLOCK 265
-#define YAML_DOCSEP 266
-#define YAML_IOPEN 267
-#define YAML_INDENT 268
-#define YAML_IEND 269
-
-
-
-
-/* Copy the first part of user declarations.  */
-#line 14 "gram.y"
-
-
-#include "syck.h"
-
-void apply_seq_in_map( SyckParser *parser, SyckNode *n );
-
-#define YYPARSE_PARAM   parser
-#define YYLEX_PARAM     parser
-
-#define NULL_NODE(parser, node) \
-        SyckNode *node = syck_new_str( "", scalar_plain ); \
-        if ( ((SyckParser *)parser)->taguri_expansion == 1 ) \
-        { \
-            node->type_id = syck_taguri( YAML_DOMAIN, "null", 4 ); \
-        } \
-        else \
-        { \
-            node->type_id = syck_strndup( "null", 4 ); \
-        }
-
-
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 1
-#endif
-
-/* Enabling verbose error messages.  */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 0
-#endif
-
-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 35 "gram.y"
-typedef union YYSTYPE {
-    SYMID nodeId;
-    SyckNode *nodeData;
-    char *name;
-} YYSTYPE;
-/* Line 191 of yacc.c.  */
-#line 140 "gram.c"
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-
-
-/* Copy the second part of user declarations.  */
-
-
-/* Line 214 of yacc.c.  */
-#line 152 "gram.c"
-
-#if ! defined (yyoverflow) || YYERROR_VERBOSE
-
-# ifndef YYFREE
-#  define YYFREE free
-# endif
-# ifndef YYMALLOC
-#  define YYMALLOC malloc
-# endif
-
-/* The parser invokes alloca or malloc; define the necessary symbols.  */
-
-# ifdef YYSTACK_USE_ALLOCA
-#  if YYSTACK_USE_ALLOCA
-#   define YYSTACK_ALLOC alloca
-#  endif
-# else
-#  if defined (alloca) || defined (_ALLOCA_H)
-#   define YYSTACK_ALLOC alloca
-#  else
-#   ifdef __GNUC__
-#    define YYSTACK_ALLOC __builtin_alloca
-#   endif
-#  endif
-# endif
-
-# ifdef YYSTACK_ALLOC
-   /* Pacify GCC's `empty if-body' warning. */
-#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
-# else
-#  if defined (__STDC__) || defined (__cplusplus)
-#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#   define YYSIZE_T size_t
-#  endif
-#  define YYSTACK_ALLOC YYMALLOC
-#  define YYSTACK_FREE YYFREE
-# endif
-#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
-
-
-#if (! defined (yyoverflow) \
-     && (! defined (__cplusplus) \
-	 || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
-
-/* A type that is properly aligned for any stack member.  */
-union yyalloc
-{
-  short int yyss;
-  YYSTYPE yyvs;
-  };
-
-/* The size of the maximum gap between one aligned stack and the next.  */
-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-
-/* The size of an array large to enough to hold all stacks, each with
-   N elements.  */
-# define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (short int) + sizeof (YYSTYPE))			\
-      + YYSTACK_GAP_MAXIMUM)
-
-/* Copy COUNT objects from FROM to TO.  The source and destination do
-   not overlap.  */
-# ifndef YYCOPY
-#  if defined (__GNUC__) && 1 < __GNUC__
-#   define YYCOPY(To, From, Count) \
-      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-#  else
-#   define YYCOPY(To, From, Count)		\
-      do					\
-	{					\
-	  register YYSIZE_T yyi;		\
-	  for (yyi = 0; yyi < (Count); yyi++)	\
-	    (To)[yyi] = (From)[yyi];		\
-	}					\
-      while (0)
-#  endif
-# endif
-
-/* Relocate STACK from its old location to the new one.  The
-   local variables YYSIZE and YYSTACKSIZE give the old and new number of
-   elements in the stack, and YYPTR gives the new location of the
-   stack.  Advance YYPTR to a properly aligned location for the next
-   stack.  */
-# define YYSTACK_RELOCATE(Stack)					\
-    do									\
-      {									\
-	YYSIZE_T yynewbytes;						\
-	YYCOPY (&yyptr->Stack, Stack, yysize);				\
-	Stack = &yyptr->Stack;						\
-	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-	yyptr += yynewbytes / sizeof (*yyptr);				\
-      }									\
-    while (0)
-
-#endif
-
-#if defined (__STDC__) || defined (__cplusplus)
-   typedef signed char yysigned_char;
-#else
-   typedef short int yysigned_char;
-#endif
-
-/* YYFINAL -- State number of the termination state. */
-#define YYFINAL  52
-/* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   396
-
-/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS  23
-/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS  29
-/* YYNRULES -- Number of rules. */
-#define YYNRULES  79
-/* YYNRULES -- Number of states. */
-#define YYNSTATES  128
-
-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
-#define YYUNDEFTOK  2
-#define YYMAXUTOK   269
-
-#define YYTRANSLATE(YYX) 						\
-  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-
-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
-static const unsigned char yytranslate[] =
-{
-       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,    21,    15,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,    16,     2,
-       2,     2,     2,    22,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,    17,     2,    18,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,    19,     2,    20,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14
-};
-
-#if YYDEBUG
-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
-   YYRHS.  */
-static const unsigned char yyprhs[] =
-{
-       0,     0,     3,     5,     8,     9,    11,    13,    15,    18,
-      21,    24,    28,    30,    32,    36,    37,    40,    43,    46,
-      49,    51,    54,    56,    58,    60,    63,    66,    69,    72,
-      75,    77,    79,    81,    85,    87,    89,    91,    93,    95,
-      99,   103,   106,   110,   113,   117,   120,   124,   127,   129,
-     133,   136,   140,   143,   145,   149,   151,   153,   157,   161,
-     165,   168,   172,   175,   179,   182,   184,   188,   190,   194,
-     196,   200,   204,   207,   211,   215,   218,   220,   224,   226
-};
-
-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-static const yysigned_char yyrhs[] =
-{
-      24,     0,    -1,    25,    -1,    11,    27,    -1,    -1,    33,
-      -1,    26,    -1,    34,    -1,     5,    26,    -1,     6,    26,
-      -1,     3,    26,    -1,    29,    26,    32,    -1,    25,    -1,
-      28,    -1,    29,    28,    30,    -1,    -1,     7,    28,    -1,
-       5,    28,    -1,     6,    28,    -1,     3,    28,    -1,    12,
-      -1,    29,    13,    -1,    14,    -1,    13,    -1,    14,    -1,
-      31,    32,    -1,     5,    33,    -1,     6,    33,    -1,     7,
-      33,    -1,     3,    33,    -1,     4,    -1,     8,    -1,     9,
-      -1,    29,    33,    32,    -1,    10,    -1,    35,    -1,    39,
-      -1,    42,    -1,    49,    -1,    29,    37,    30,    -1,    29,
-      38,    30,    -1,    15,    27,    -1,     5,    31,    38,    -1,
-       5,    37,    -1,     6,    31,    38,    -1,     6,    37,    -1,
-       3,    31,    38,    -1,     3,    37,    -1,    36,    -1,    38,
-      31,    36,    -1,    38,    31,    -1,    17,    40,    18,    -1,
-      17,    18,    -1,    41,    -1,    40,    21,    41,    -1,    25,
-      -1,    48,    -1,    29,    43,    30,    -1,    29,    47,    30,
-      -1,     5,    31,    47,    -1,     5,    43,    -1,     6,    31,
-      47,    -1,     6,    43,    -1,     3,    31,    47,    -1,     3,
-      43,    -1,    33,    -1,    22,    25,    31,    -1,    27,    -1,
-      44,    16,    45,    -1,    46,    -1,    47,    31,    36,    -1,
-      47,    31,    46,    -1,    47,    31,    -1,    25,    16,    27,
-      -1,    19,    50,    20,    -1,    19,    20,    -1,    51,    -1,
-      50,    21,    51,    -1,    25,    -1,    48,    -1
-};
-
-/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-static const unsigned short int yyrline[] =
-{
-       0,    56,    56,    60,    65,    70,    71,    74,    75,    80,
-      85,    94,   100,   101,   104,   109,   113,   121,   126,   131,
-     145,   146,   149,   152,   155,   156,   164,   169,   174,   182,
-     186,   194,   207,   208,   218,   219,   220,   221,   222,   228,
-     232,   238,   244,   249,   254,   259,   264,   268,   274,   278,
-     283,   292,   296,   302,   306,   313,   314,   320,   325,   332,
-     337,   342,   347,   352,   356,   362,   363,   369,   379,   396,
-     397,   409,   417,   426,   434,   438,   444,   445,   454,   461
-};
-#endif
-
-#if YYDEBUG || YYERROR_VERBOSE
-/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
-static const char *const yytname[] =
-{
-  "$end", "error", "$undefined", "YAML_ANCHOR", "YAML_ALIAS",
-  "YAML_TRANSFER", "YAML_TAGURI", "YAML_ITRANSFER", "YAML_WORD",
-  "YAML_PLAIN", "YAML_BLOCK", "YAML_DOCSEP", "YAML_IOPEN", "YAML_INDENT",
-  "YAML_IEND", "'-'", "':'", "'['", "']'", "'{'", "'}'", "','", "'?'",
-  "$accept", "doc", "atom", "ind_rep", "atom_or_empty", "empty",
-  "indent_open", "indent_end", "indent_sep", "indent_flex_end", "word_rep",
-  "struct_rep", "implicit_seq", "basic_seq", "top_imp_seq",
-  "in_implicit_seq", "inline_seq", "in_inline_seq", "inline_seq_atom",
-  "implicit_map", "top_imp_map", "complex_key", "complex_value",
-  "complex_mapping", "in_implicit_map", "basic_mapping", "inline_map",
-  "in_inline_map", "inline_map_atom", 0
-};
-#endif
-
-# ifdef YYPRINT
-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
-   token YYLEX-NUM.  */
-static const unsigned short int yytoknum[] =
-{
-       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
-     265,   266,   267,   268,   269,    45,    58,    91,    93,   123,
-     125,    44,    63
-};
-# endif
-
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const unsigned char yyr1[] =
-{
-       0,    23,    24,    24,    24,    25,    25,    26,    26,    26,
-      26,    26,    27,    27,    28,    28,    28,    28,    28,    28,
-      29,    29,    30,    31,    32,    32,    33,    33,    33,    33,
-      33,    33,    33,    33,    34,    34,    34,    34,    34,    35,
-      35,    36,    37,    37,    37,    37,    37,    37,    38,    38,
-      38,    39,    39,    40,    40,    41,    41,    42,    42,    43,
-      43,    43,    43,    43,    43,    44,    44,    45,    46,    47,
-      47,    47,    47,    48,    49,    49,    50,    50,    51,    51
-};
-
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-static const unsigned char yyr2[] =
-{
-       0,     2,     1,     2,     0,     1,     1,     1,     2,     2,
-       2,     3,     1,     1,     3,     0,     2,     2,     2,     2,
-       1,     2,     1,     1,     1,     2,     2,     2,     2,     2,
-       1,     1,     1,     3,     1,     1,     1,     1,     1,     3,
-       3,     2,     3,     2,     3,     2,     3,     2,     1,     3,
-       2,     3,     2,     1,     3,     1,     1,     3,     3,     3,
-       2,     3,     2,     3,     2,     1,     3,     1,     3,     1,
-       3,     3,     2,     3,     3,     2,     1,     3,     1,     1
-};
-
-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
-   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
-   means the default is an error.  */
-static const unsigned char yydefact[] =
-{
-       4,     0,    30,     0,     0,     0,    31,    32,    34,    15,
-      20,     0,     0,     0,     2,     6,     0,     5,     7,    35,
-      36,    37,    38,    10,    29,     8,    26,     9,    27,     0,
-       0,     0,     0,    28,    15,    15,    15,    15,    12,     3,
-      13,    15,    52,    55,     0,    53,    56,    75,    78,    79,
-       0,    76,     1,     0,     0,     0,    21,    15,     0,     0,
-      65,    48,     0,     0,     0,     0,    69,     0,     0,    19,
-      17,    18,    15,    15,    15,    16,    15,    15,    15,    15,
-       0,    15,    51,     0,    74,     0,    23,     0,    47,    64,
-       0,    43,    60,     0,    45,    62,    41,     0,    24,     0,
-      11,    33,    22,    39,    40,    50,    57,    15,    58,    72,
-      14,    73,    54,    77,    65,    46,    63,    42,    59,    44,
-      61,    66,    25,    49,    67,    68,    70,    71
-};
-
-/* YYDEFGOTO[NTERM-NUM]. */
-static const yysigned_char yydefgoto[] =
-{
-      -1,    13,    38,    15,    39,    40,    16,   103,    99,   101,
-      17,    18,    19,    61,    62,    63,    20,    44,    45,    21,
-      64,    65,   125,    66,    67,    46,    22,    50,    51
-};
-
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-   STATE-NUM.  */
-#define YYPACT_NINF -97
-static const short int yypact[] =
-{
-     250,   318,   -97,   318,   318,   374,   -97,   -97,   -97,   335,
-     -97,   267,   232,     7,   -97,   -97,   192,   -97,   -97,   -97,
-     -97,   -97,   -97,   -97,   -97,   -97,   -97,   -97,   -97,   374,
-     374,   374,   352,   -97,   335,   335,   335,   384,   -97,   -97,
-     -97,   212,   -97,    10,     0,   -97,   -97,   -97,    10,   -97,
-      -4,   -97,   -97,   284,   284,   284,   -97,   335,   318,    30,
-      30,   -97,    -2,    36,    -2,    16,   -97,    36,    30,   -97,
-     -97,   -97,   384,   384,   384,   -97,   363,   301,   301,   301,
-      -2,   335,   -97,   318,   -97,   318,   -97,   158,   -97,   -97,
-     158,   -97,   -97,   158,   -97,   -97,   -97,    24,   -97,    30,
-     -97,   -97,   -97,   -97,   -97,    26,   -97,   335,   -97,   158,
-     -97,   -97,   -97,   -97,   -97,    24,    24,    24,    24,    24,
-      24,   -97,   -97,   -97,   -97,   -97,   -97,   -97
-};
-
-/* YYPGOTO[NTERM-NUM].  */
-static const yysigned_char yypgoto[] =
-{
-     -97,   -97,     8,    81,   -56,   109,    33,   -53,    74,   -54,
-      -1,   -97,   -97,   -96,   -31,   -32,   -97,   -97,   -44,   -97,
-      77,   -97,   -97,   -52,     9,    -6,   -97,   -97,   -29
-};
-
-/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
-   positive, shift that token.  If negative, reduce the rule which
-   number is the opposite.  If zero, do what YYDEFACT says.
-   If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -1
-static const unsigned char yytable[] =
-{
-      24,    96,    26,    28,    33,   100,    49,    52,    14,   123,
-     104,   106,   102,   126,   108,    60,    84,    85,    82,    43,
-      48,    83,    88,    91,    94,   111,    81,   110,    24,    26,
-      28,    68,   107,    24,    26,    28,    33,    86,    32,   112,
-      60,    57,    41,    86,    98,   122,    88,    91,    94,    86,
-     102,   124,    24,    26,    28,   115,   113,   127,   117,     0,
-       0,   119,    32,    32,    32,    32,    97,    41,    41,    41,
-      76,    24,    26,    28,    41,    68,    24,    26,    28,    49,
-       0,     0,    23,     0,    25,    27,   114,     0,     0,   114,
-      41,    43,   114,    48,     0,     0,   116,    59,     0,   118,
-       0,     0,   120,     0,     0,    76,    76,    76,   114,    76,
-      41,    41,    41,     0,    41,    23,    25,    27,     0,     0,
-      32,     0,    59,    32,     0,     0,    32,    87,    90,    93,
-      89,    92,    95,     0,    23,    25,    27,   105,     0,     0,
-      41,   109,    32,    69,    70,    71,    75,     0,     0,     0,
-      80,    87,    90,    93,    89,    92,    95,     0,    23,    25,
-      27,    29,     2,    30,    31,     5,     6,     7,     0,     0,
-      10,   121,     0,    57,     0,     0,     0,     0,     0,     0,
-      58,    69,    70,    71,     0,    80,    69,    70,    71,   105,
-     109,   105,   109,   105,   109,    53,     2,    54,    55,     5,
-       6,     7,     8,     0,    10,    56,     0,    57,     0,    11,
-       0,    12,     0,     0,    58,    77,     2,    78,    79,    37,
-       6,     7,     8,     0,    10,    56,     0,    57,     0,    11,
-       0,    12,     0,     0,    58,     1,     2,     3,     4,     5,
-       6,     7,     8,     0,    10,     0,     0,     0,     0,    11,
-       0,    12,    47,     1,     2,     3,     4,     5,     6,     7,
-       8,     9,    10,     0,     0,     0,     0,    11,     0,    12,
-       1,     2,     3,     4,     5,     6,     7,     8,     0,    10,
-       0,     0,     0,     0,    11,    42,    12,    53,     2,    54,
-      55,     5,     6,     7,     8,     0,    10,    86,     0,     0,
-       0,    11,     0,    12,    77,     2,    78,    79,    37,     6,
-       7,     8,     0,    10,    86,     0,     0,     0,    11,     0,
-      12,     1,     2,     3,     4,     5,     6,     7,     8,     0,
-      10,     0,     0,     0,     0,    11,     0,    12,    34,     2,
-      35,    36,    37,     6,     7,     8,     0,    10,     0,     0,
-       0,     0,    11,     0,    12,    29,     2,    30,    31,     5,
-       6,     7,     0,     0,    10,    56,    72,     2,    73,    74,
-      37,     6,     7,     0,     0,    10,    56,    29,     2,    30,
-      31,     5,     6,     7,     0,     0,    10,    72,     2,    73,
-      74,    37,     6,     7,     0,     0,    10
-};
-
-static const yysigned_char yycheck[] =
-{
-       1,    57,     3,     4,     5,    59,    12,     0,     0,   105,
-      63,    64,    14,   109,    67,    16,    20,    21,    18,    11,
-      12,    21,    53,    54,    55,    81,    16,    80,    29,    30,
-      31,    32,    16,    34,    35,    36,    37,    13,     5,    83,
-      41,    15,     9,    13,    14,    99,    77,    78,    79,    13,
-      14,   107,    53,    54,    55,    87,    85,   109,    90,    -1,
-      -1,    93,    29,    30,    31,    32,    58,    34,    35,    36,
-      37,    72,    73,    74,    41,    76,    77,    78,    79,    85,
-      -1,    -1,     1,    -1,     3,     4,    87,    -1,    -1,    90,
-      57,    83,    93,    85,    -1,    -1,    87,    16,    -1,    90,
-      -1,    -1,    93,    -1,    -1,    72,    73,    74,   109,    76,
-      77,    78,    79,    -1,    81,    34,    35,    36,    -1,    -1,
-      87,    -1,    41,    90,    -1,    -1,    93,    53,    54,    55,
-      53,    54,    55,    -1,    53,    54,    55,    63,    -1,    -1,
-     107,    67,   109,    34,    35,    36,    37,    -1,    -1,    -1,
-      41,    77,    78,    79,    77,    78,    79,    -1,    77,    78,
-      79,     3,     4,     5,     6,     7,     8,     9,    -1,    -1,
-      12,    97,    -1,    15,    -1,    -1,    -1,    -1,    -1,    -1,
-      22,    72,    73,    74,    -1,    76,    77,    78,    79,   115,
-     116,   117,   118,   119,   120,     3,     4,     5,     6,     7,
-       8,     9,    10,    -1,    12,    13,    -1,    15,    -1,    17,
-      -1,    19,    -1,    -1,    22,     3,     4,     5,     6,     7,
-       8,     9,    10,    -1,    12,    13,    -1,    15,    -1,    17,
-      -1,    19,    -1,    -1,    22,     3,     4,     5,     6,     7,
-       8,     9,    10,    -1,    12,    -1,    -1,    -1,    -1,    17,
-      -1,    19,    20,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    -1,    -1,    -1,    -1,    17,    -1,    19,
-       3,     4,     5,     6,     7,     8,     9,    10,    -1,    12,
-      -1,    -1,    -1,    -1,    17,    18,    19,     3,     4,     5,
-       6,     7,     8,     9,    10,    -1,    12,    13,    -1,    -1,
-      -1,    17,    -1,    19,     3,     4,     5,     6,     7,     8,
-       9,    10,    -1,    12,    13,    -1,    -1,    -1,    17,    -1,
-      19,     3,     4,     5,     6,     7,     8,     9,    10,    -1,
-      12,    -1,    -1,    -1,    -1,    17,    -1,    19,     3,     4,
-       5,     6,     7,     8,     9,    10,    -1,    12,    -1,    -1,
-      -1,    -1,    17,    -1,    19,     3,     4,     5,     6,     7,
-       8,     9,    -1,    -1,    12,    13,     3,     4,     5,     6,
-       7,     8,     9,    -1,    -1,    12,    13,     3,     4,     5,
-       6,     7,     8,     9,    -1,    -1,    12,     3,     4,     5,
-       6,     7,     8,     9,    -1,    -1,    12
-};
-
-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-   symbol of state STATE-NUM.  */
-static const unsigned char yystos[] =
-{
-       0,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    17,    19,    24,    25,    26,    29,    33,    34,    35,
-      39,    42,    49,    26,    33,    26,    33,    26,    33,     3,
-       5,     6,    29,    33,     3,     5,     6,     7,    25,    27,
-      28,    29,    18,    25,    40,    41,    48,    20,    25,    48,
-      50,    51,     0,     3,     5,     6,    13,    15,    22,    26,
-      33,    36,    37,    38,    43,    44,    46,    47,    33,    28,
-      28,    28,     3,     5,     6,    28,    29,     3,     5,     6,
-      28,    16,    18,    21,    20,    21,    13,    31,    37,    43,
-      31,    37,    43,    31,    37,    43,    27,    25,    14,    31,
-      32,    32,    14,    30,    30,    31,    30,    16,    30,    31,
-      30,    27,    41,    51,    33,    38,    47,    38,    47,    38,
-      47,    31,    32,    36,    27,    45,    36,    46
-};
-
-#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
-# define YYSIZE_T __SIZE_TYPE__
-#endif
-#if ! defined (YYSIZE_T) && defined (size_t)
-# define YYSIZE_T size_t
-#endif
-#if ! defined (YYSIZE_T)
-# if defined (__STDC__) || defined (__cplusplus)
-#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-#  define YYSIZE_T size_t
-# endif
-#endif
-#if ! defined (YYSIZE_T)
-# define YYSIZE_T unsigned int
-#endif
-
-#define yyerrok		(yyerrstatus = 0)
-#define yyclearin	(yychar = YYEMPTY)
-#define YYEMPTY		(-2)
-#define YYEOF		0
-
-#define YYACCEPT	goto yyacceptlab
-#define YYABORT		goto yyabortlab
-#define YYERROR		goto yyerrorlab
-
-
-/* Like YYERROR except do call yyerror.  This remains here temporarily
-   to ease the transition to the new meaning of YYERROR, for GCC.
-   Once GCC version 2 has supplanted version 1, this can go.  */
-
-#define YYFAIL		goto yyerrlab
-
-#define YYRECOVERING()