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

yarv-diff:284

From: ko1 atdot.net
Date: 20 Feb 2006 05:50:09 -0000
Subject: [yarv-diff:284] r448 - in trunk: . ext ext/syck lib lib/yaml

Author: aamine
Date: 2006-02-20 14:50:08 +0900 (Mon, 20 Feb 2006)
New Revision: 448

Added:
   trunk/ext/syck/
   trunk/ext/syck/bytecode.c
   trunk/ext/syck/depend
   trunk/ext/syck/emitter.c
   trunk/ext/syck/extconf.rb
   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/ext/syck/yamlbyte.h
   trunk/lib/yaml.rb
   trunk/lib/yaml/
   trunk/lib/yaml/baseemitter.rb
   trunk/lib/yaml/basenode.rb
   trunk/lib/yaml/constants.rb
   trunk/lib/yaml/dbm.rb
   trunk/lib/yaml/encoding.rb
   trunk/lib/yaml/error.rb
   trunk/lib/yaml/loader.rb
   trunk/lib/yaml/rubytypes.rb
   trunk/lib/yaml/store.rb
   trunk/lib/yaml/stream.rb
   trunk/lib/yaml/stringio.rb
   trunk/lib/yaml/syck.rb
   trunk/lib/yaml/tag.rb
   trunk/lib/yaml/types.rb
   trunk/lib/yaml/yamlnode.rb
   trunk/lib/yaml/ypath.rb
Modified:
   trunk/ChangeLog
Log:
* lib/yaml.rb: imported from Ruby CVS trunk HEAD.
* lib/yaml: ditto.
* ext/syck: ditto.


Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-02-20 05:15:09 UTC (rev 447)
+++ trunk/ChangeLog	2006-02-20 05:50:08 UTC (rev 448)
@@ -4,6 +4,15 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2006-02-20(Mon) 14:49:46 +0900  Minero Aoki  <aamine loveruby.net>
+
+	* lib/yaml.rb: imported from Ruby CVS trunk HEAD.
+
+	* lib/yaml: ditto.
+
+	* ext/syck: ditto.
+
+
 2006-02-20(Mon) 13:58:03 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* compile.c : support block parameter which is NODE_ATTRASGN


Property changes on: trunk/ext/syck
___________________________________________________________________
Name: svn:ignore
   + Makefile
mkmf.log
*.def


Added: trunk/ext/syck/bytecode.c
===================================================================
--- trunk/ext/syck/bytecode.c	2006-02-20 05:15:09 UTC (rev 447)
+++ trunk/ext/syck/bytecode.c	2006-02-20 05:50:08 UTC (rev 448)
@@ -0,0 +1,1166 @@
+/* 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"
+
+
+    }
+
+}
+

Added: trunk/ext/syck/depend
===================================================================
--- trunk/ext/syck/depend	2006-02-20 05:15:09 UTC (rev 447)
+++ trunk/ext/syck/depend	2006-02-20 05:50:08 UTC (rev 448)
@@ -0,0 +1,12 @@
+ruby_headers = $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h \
+  $(hdrdir)/missing.h $(hdrdir)/intern.h $(hdrdir)/st.h
+bytecode.o: bytecode.c syck.h gram.h $(ruby_headers)
+emitter.o: emitter.c syck.h $(ruby_headers)
+gram.o: gram.c syck.h $(hdrdir)/st.h
+handler.o: handler.c syck.h $(ruby_headers)
+implicit.o: implicit.c syck.h $(ruby_headers)
+node.o: node.c syck.h $(ruby_headers)
+rubyext.o: rubyext.c syck.h $(ruby_headers)
+syck.o: syck.c syck.h $(ruby_headers)
+token.o: token.c syck.h gram.h $(ruby_headers)
+yaml2byte.o: yaml2byte.c syck.h yamlbyte.h $(ruby_headers)

Added: trunk/ext/syck/emitter.c
===================================================================
--- trunk/ext/syck/emitter.c	2006-02-20 05:15:09 UTC (rev 447)
+++ trunk/ext/syck/emitter.c	2006-02-20 05:50:08 UTC (rev 448)
@@ -0,0 +1,1242 @@
+/*
+ * 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;
+}
+

Added: trunk/ext/syck/extconf.rb
===================================================================
--- trunk/ext/syck/extconf.rb	2006-02-20 05:15:09 UTC (rev 447)
+++ trunk/ext/syck/extconf.rb	2006-02-20 05:50:08 UTC (rev 448)
@@ -0,0 +1,5 @@
+require 'mkmf'
+
+have_header( "st.h" )
+create_makefile( "syck" )
+

Added: trunk/ext/syck/gram.c
===================================================================
--- trunk/ext/syck/gram.c	2006-02-20 05:15:09 UTC (rev 447)
+++ trunk/ext/syck/gram.c	2006-02-20 05:50:08 UTC (rev 448)
@@ -0,0 +1,1894 @@
+/* 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()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)					\
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    {								\
+      yychar = (Token);						\
+      yylval = (Value);						\
+      yytoken = YYTRANSLATE (yychar);				\
+      YYPOPSTACK;						\
+      goto yybackup;						\
+    }								\
+  else								\
+    { 								\
+      yyerror ("syntax error: cannot back up");\
+      YYERROR;							\
+    }								\
+while (0)
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+   are run).  */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)		\
+   ((Current).first_line   = (Rhs)[1].first_line,	\
+    (Current).first_column = (Rhs)[1].first_column,	\
+    (Current).last_line    = (Rhs)[N].last_line,	\
+    (Current).last_column  = (Rhs)[N].last_column)
+#endif
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (&yylval, YYLEX_PARAM)
+#else
+# define YYLEX yylex (&yylval)
+#endif
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)			\
+do {						\
+  if (yydebug)					\
+    YYFPRINTF Args;				\
+} while (0)
+
+# define YYDSYMPRINT(Args)			\
+do {						\
+  if (yydebug)					\
+    yysymprint Args;				\
+} while (0)
+
+# define YYDSYMPRINTF(Title, Token, Value, Location)		\
+do {								\
+  if (yydebug)							\
+    {								\
+      YYFPRINTF (stderr, "%s ", Title);				\
+      yysymprint (stderr, 					\
+                  Token, Value);	\
+      YYFPRINTF (stderr, "\n");					\
+    }								\
+} while (0)
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short int *bottom, short int *top)
+#else
+static void
+yy_stack_print (bottom, top)
+    short int *bottom;
+    short int *top;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (/* Nothing. */; bottom <= top; ++bottom)
+    YYFPRINTF (stderr, " %d", *bottom);
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)				\
+do {								\
+  if (yydebug)							\
+    yy_stack_print ((Bottom), (Top));				\
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+    int yyrule;
+#endif
+{
+  int yyi;
+  unsigned int yylno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
+             yyrule - 1, yylno);
+  /* Print the symbols being reduced, and their result.  */
+  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+    YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
+  YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule)		\
+do {					\
+  if (yydebug)				\
+    yy_reduce_print (Rule);		\
+} while (0)
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YYDSYMPRINT(Args)
+# define YYDSYMPRINTF(Title, Token, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef	YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined (__GLIBC__) && defined (_STRING_H)
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+#   if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+#   else
+yystrlen (yystr)
+     const char *yystr;
+#   endif
+{
+  register const char *yys = yystr;
+
+  while (*yys++ != '\0')
+    continue;
+
+  return yys - yystr - 1;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+#   if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+#   else
+yystpcpy (yydest, yysrc)
+     char *yydest;
+     const char *yysrc;
+#   endif
+{
+  register char *yyd = yydest;
+  register const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+#endif /* !YYERROR_VERBOSE */
+
+
+
+#if YYDEBUG
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yysymprint (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvaluep;
+
+  if (yytype < YYNTOKENS)
+    {
+      YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+# ifdef YYPRINT
+      YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
+    }
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+  YYFPRINTF (yyoutput, ")");
+}
+
+#endif /* ! YYDEBUG */
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yydestruct (int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yytype, yyvaluep)
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvaluep;
+
+  switch (yytype)
+    {
+
+      default:
+        break;
+    }
+}
+
+
+/* Prevent warnings from -Wmissing-prototypes.  */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM);
+# else
+int yyparse ();
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+
+
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+  void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+  /* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far.  */
+int yynerrs;
+
+  register int yystate;
+  register int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yytoken = 0;
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack.  */
+  short int yyssa[YYINITDEPTH];
+  short int *yyss = yyssa;
+  register short int *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  register YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+
+  /* When reducing, the number of symbols on the RHS of the reduced
+     rule.  */
+  int yylen;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;		/* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed. so pushing a state here evens the stacks.
+     */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyss + yystacksize - 1 <= yyssp)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+	/* Give user a chance to reallocate the stack. Use copies of
+	   these so that the &'s don't force the real ones into
+	   memory.  */
+	YYSTYPE *yyvs1 = yyvs;
+	short int *yyss1 = yyss;
+
+
+	/* Each stack pointer address is followed by the size of the
+	   data in use in that stack, in bytes.  This used to be a
+	   conditional around just the two extra args, but that might
+	   be undefined if yyoverflow is a macro.  */
+	yyoverflow ("parser stack overflow",
+		    &yyss1, yysize * sizeof (*yyssp),
+		    &yyvs1, yysize * sizeof (*yyvsp),
+
+		    &yystacksize);
+
+	yyss = yyss1;
+	yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyoverflowlab;
+# else
+      /* Extend the stack our own way.  */
+      if (YYMAXDEPTH <= yystacksize)
+	goto yyoverflowlab;
+      yystacksize *= 2;
+      if (YYMAXDEPTH < yystacksize)
+	yystacksize = YYMAXDEPTH;
+
+      {
+	short int *yyss1 = yyss;
+	union yyalloc *yyptr =
+	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+	if (! yyptr)
+	  goto yyoverflowlab;
+	YYSTACK_RELOCATE (yyss);
+	YYSTACK_RELOCATE (yyvs);
+
+#  undef YYSTACK_RELOCATE
+	if (yyss1 != yyssa)
+	  YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+		  (unsigned long int) yystacksize));
+
+      if (yyss + yystacksize - 1 <= yyssp)
+	YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  if (yychar <= YYEOF)
+    {
+      yychar = yytoken = YYEOF;
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yytoken = YYTRANSLATE (yychar);
+      YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
+    }
+
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+  YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
+    {
+        case 2:
+#line 57 "gram.y"
+    {
+           ((SyckParser *)parser)->root = syck_hdlr_add_node( (SyckParser *)parser, yyvsp[0].nodeData );
+        }
+    break;
+
+  case 3:
+#line 61 "gram.y"
+    {
+           ((SyckParser *)parser)->root = syck_hdlr_add_node( (SyckParser *)parser, yyvsp[0].nodeData );
+        }
+    break;
+
+  case 4:
+#line 65 "gram.y"
+    {
+           ((SyckParser *)parser)->eof = 1;
+        }
+    break;
+
+  case 8:
+#line 76 "gram.y"
+    { 
+            syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
+            yyval.nodeData = yyvsp[0].nodeData;
+        }
+    break;
+
+  case 9:
+#line 81 "gram.y"
+    {
+            syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, 0 );
+            yyval.nodeData = yyvsp[0].nodeData;
+        }
+    break;
+
+  case 10:
+#line 86 "gram.y"
+    { 
+           /*
+            * _Anchors_: The language binding must keep a separate symbol table
+            * for anchors.  The actual ID in the symbol table is returned to the
+            * higher nodes, though.
+            */
+           yyval.nodeData = syck_hdlr_add_anchor( (SyckParser *)parser, yyvsp[-1].name, yyvsp[0].nodeData );
+        }
+    break;
+
+  case 11:
+#line 95 "gram.y"
+    {
+           yyval.nodeData = yyvsp[-1].nodeData;
+        }
+    break;
+
+  case 14:
+#line 105 "gram.y"
+    {
+                    yyval.nodeData = yyvsp[-1].nodeData;
+                }
+    break;
+
+  case 15:
+#line 109 "gram.y"
+    {
+                    NULL_NODE( parser, n );
+                    yyval.nodeData = n;
+                }
+    break;
+
+  case 16:
+#line 114 "gram.y"
+    { 
+                   if ( ((SyckParser *)parser)->implicit_typing == 1 )
+                   {
+                      try_tag_implicit( yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
+                   }
+                   yyval.nodeData = yyvsp[0].nodeData;
+                }
+    break;
+
+  case 17:
+#line 122 "gram.y"
+    { 
+                    syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
+                    yyval.nodeData = yyvsp[0].nodeData;
+                }
+    break;
+
+  case 18:
+#line 127 "gram.y"
+    {
+                    syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, 0 );
+                    yyval.nodeData = yyvsp[0].nodeData;
+                }
+    break;
+
+  case 19:
+#line 132 "gram.y"
+    { 
+                   /*
+                    * _Anchors_: The language binding must keep a separate symbol table
+                    * for anchors.  The actual ID in the symbol table is returned to the
+                    * higher nodes, though.
+                    */
+                   yyval.nodeData = syck_hdlr_add_anchor( (SyckParser *)parser, yyvsp[-1].name, yyvsp[0].nodeData );
+                }
+    break;
+
+  case 26:
+#line 165 "gram.y"
+    { 
+               syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
+               yyval.nodeData = yyvsp[0].nodeData;
+            }
+    break;
+
+  case 27:
+#line 170 "gram.y"
+    { 
+               syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, 0 );
+               yyval.nodeData = yyvsp[0].nodeData;
+            }
+    break;
+
+  case 28:
+#line 175 "gram.y"
+    { 
+               if ( ((SyckParser *)parser)->implicit_typing == 1 )
+               {
+                  try_tag_implicit( yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
+               }
+               yyval.nodeData = yyvsp[0].nodeData;
+            }
+    break;
+
+  case 29:
+#line 183 "gram.y"
+    { 
+               yyval.nodeData = syck_hdlr_add_anchor( (SyckParser *)parser, yyvsp[-1].name, yyvsp[0].nodeData );
+            }
+    break;
+
+  case 30:
+#line 187 "gram.y"
+    {
+               /*
+                * _Aliases_: The anchor symbol table is scanned for the anchor name.
+                * The anchor's ID in the language's symbol table is returned.
+                */
+               yyval.nodeData = syck_hdlr_get_anchor( (SyckParser *)parser, yyvsp[0].name );
+            }
+    break;
+
+  case 31:
+#line 195 "gram.y"
+    { 
+               SyckNode *n = yyvsp[0].nodeData;
+               if ( ((SyckParser *)parser)->taguri_expansion == 1 )
+               {
+                   n->type_id = syck_taguri( YAML_DOMAIN, "str", 3 );
+               }
+               else
+               {
+                   n->type_id = syck_strndup( "str", 3 );
+               }
+               yyval.nodeData = n;
+            }
+    break;
+
+  case 33:
+#line 209 "gram.y"
+    {
+               yyval.nodeData = yyvsp[-1].nodeData;
+            }
+    break;
+
+  case 39:
+#line 229 "gram.y"
+    { 
+                    yyval.nodeData = yyvsp[-1].nodeData;
+                }
+    break;
+
+  case 40:
+#line 233 "gram.y"
+    { 
+                    yyval.nodeData = yyvsp[-1].nodeData;
+                }
+    break;
+
+  case 41:
+#line 239 "gram.y"
+    { 
+                    yyval.nodeId = syck_hdlr_add_node( (SyckParser *)parser, yyvsp[0].nodeData );
+                }
+    break;
+
+  case 42:
+#line 245 "gram.y"
+    { 
+                    syck_add_transfer( yyvsp[-2].name, yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
+                    yyval.nodeData = yyvsp[0].nodeData;
+                }
+    break;
+
+  case 43:
+#line 250 "gram.y"
+    { 
+                    syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
+                    yyval.nodeData = yyvsp[0].nodeData;
+                }
+    break;
+
+  case 44:
+#line 255 "gram.y"
+    { 
+                    syck_add_transfer( yyvsp[-2].name, yyvsp[0].nodeData, 0 );
+                    yyval.nodeData = yyvsp[0].nodeData;
+                }
+    break;
+
+  case 45:
+#line 260 "gram.y"
+    { 
+                    syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, 0 );
+                    yyval.nodeData = yyvsp[0].nodeData;
+                }
+    break;
+
+  case 46:
+#line 265 "gram.y"
+    { 
+                    yyval.nodeData = syck_hdlr_add_anchor( (SyckParser *)parser, yyvsp[-2].name, yyvsp[0].nodeData );
+                }
+    break;
+
+  case 47:
+#line 269 "gram.y"
+    { 
+                    yyval.nodeData = syck_hdlr_add_anchor( (SyckParser *)parser, yyvsp[-1].name, yyvsp[0].nodeData );
+                }
+    break;
+
+  case 48:
+#line 275 "gram.y"
+    {
+                    yyval.nodeData = syck_new_seq( yyvsp[0].nodeId );
+                }
+    break;
+
+  case 49:
+#line 279 "gram.y"
+    { 
+                    syck_seq_add( yyvsp[-2].nodeData, yyvsp[0].nodeId );
+                    yyval.nodeData = yyvsp[-2].nodeData;
+				}
+    break;
+
+  case 50:
+#line 284 "gram.y"
+    { 
+                    yyval.nodeData = yyvsp[-1].nodeData;
+				}
+    break;
+
+  case 51:
+#line 293 "gram.y"
+    { 
+                    yyval.nodeData = yyvsp[-1].nodeData;
+                }
+    break;
+
+  case 52:
+#line 297 "gram.y"
+    { 
+                    yyval.nodeData = syck_alloc_seq();
+                }
+    break;
+
+  case 53:
+#line 303 "gram.y"
+    {
+                    yyval.nodeData = syck_new_seq( syck_hdlr_add_node( (SyckParser *)parser, yyvsp[0].nodeData ) );
+                }
+    break;
+
+  case 54:
+#line 307 "gram.y"
+    { 
+                    syck_seq_add( yyvsp[-2].nodeData, syck_hdlr_add_node( (SyckParser *)parser, yyvsp[0].nodeData ) );
+                    yyval.nodeData = yyvsp[-2].nodeData;
+				}
+    break;
+
+  case 57:
+#line 321 "gram.y"
+    { 
+                    apply_seq_in_map( (SyckParser *)parser, yyvsp[-1].nodeData );
+                    yyval.nodeData = yyvsp[-1].nodeData;
+                }
+    break;
+
+  case 58:
+#line 326 "gram.y"
+    { 
+                    apply_seq_in_map( (SyckParser *)parser, yyvsp[-1].nodeData );
+                    yyval.nodeData = yyvsp[-1].nodeData;
+                }
+    break;
+
+  case 59:
+#line 333 "gram.y"
+    { 
+                    syck_add_transfer( yyvsp[-2].name, yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
+                    yyval.nodeData = yyvsp[0].nodeData;
+                }
+    break;
+
+  case 60:
+#line 338 "gram.y"
+    { 
+                    syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
+                    yyval.nodeData = yyvsp[0].nodeData;
+                }
+    break;
+
+  case 61:
+#line 343 "gram.y"
+    { 
+                    syck_add_transfer( yyvsp[-2].name, yyvsp[0].nodeData, 0 );
+                    yyval.nodeData = yyvsp[0].nodeData;
+                }
+    break;
+
+  case 62:
+#line 348 "gram.y"
+    { 
+                    syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, 0 );
+                    yyval.nodeData = yyvsp[0].nodeData;
+                }
+    break;
+
+  case 63:
+#line 353 "gram.y"
+    { 
+                    yyval.nodeData = syck_hdlr_add_anchor( (SyckParser *)parser, yyvsp[-2].name, yyvsp[0].nodeData );
+                }
+    break;
+
+  case 64:
+#line 357 "gram.y"
+    { 
+                    yyval.nodeData = syck_hdlr_add_anchor( (SyckParser *)parser, yyvsp[-1].name, yyvsp[0].nodeData );
+                }
+    break;
+
+  case 66:
+#line 364 "gram.y"
+    {
+                    yyval.nodeData = yyvsp[-1].nodeData;
+                }
+    break;
+
+  case 68:
+#line 380 "gram.y"
+    {
+                    yyval.nodeData = syck_new_map( 
+                        syck_hdlr_add_node( (SyckParser *)parser, yyvsp[-2].nodeData ), 
+                        syck_hdlr_add_node( (SyckParser *)parser, yyvsp[0].nodeData ) );
+                }
+    break;
+
+  case 70:
+#line 398 "gram.y"
+    {
+                    if ( yyvsp[-2].nodeData->shortcut == NULL )
+                    {
+                        yyvsp[-2].nodeData->shortcut = syck_new_seq( yyvsp[0].nodeId );
+                    }
+                    else
+                    {
+                        syck_seq_add( yyvsp[-2].nodeData->shortcut, yyvsp[0].nodeId );
+                    }
+                    yyval.nodeData = yyvsp[-2].nodeData;
+                }
+    break;
+
+  case 71:
+#line 410 "gram.y"
+    {
+                    apply_seq_in_map( (SyckParser *)parser, yyvsp[-2].nodeData );
+                    syck_map_update( yyvsp[-2].nodeData, yyvsp[0].nodeData );
+                    syck_free_node( yyvsp[0].nodeData );
+                    yyvsp[0].nodeData = NULL;
+                    yyval.nodeData = yyvsp[-2].nodeData;
+                }
+    break;
+
+  case 72:
+#line 418 "gram.y"
+    {
+                    yyval.nodeData = yyvsp[-1].nodeData;
+                }
+    break;
+
+  case 73:
+#line 427 "gram.y"
+    {
+                    yyval.nodeData = syck_new_map( 
+                        syck_hdlr_add_node( (SyckParser *)parser, yyvsp[-2].nodeData ), 
+                        syck_hdlr_add_node( (SyckParser *)parser, yyvsp[0].nodeData ) );
+                }
+    break;
+
+  case 74:
+#line 435 "gram.y"
+    {
+                    yyval.nodeData = yyvsp[-1].nodeData;
+                }
+    break;
+
+  case 75:
+#line 439 "gram.y"
+    {
+                    yyval.nodeData = syck_alloc_map();
+                }
+    break;
+
+  case 77:
+#line 446 "gram.y"
+    {
+                    syck_map_update( yyvsp[-2].nodeData, yyvsp[0].nodeData );
+                    syck_free_node( yyvsp[0].nodeData );
+                    yyvsp[0].nodeData = NULL;
+                    yyval.nodeData = yyvsp[-2].nodeData;
+				}
+    break;
+
+  case 78:
+#line 455 "gram.y"
+    {
+                    NULL_NODE( parser, n );
+                    yyval.nodeData = syck_new_map( 
+                        syck_hdlr_add_node( (SyckParser *)parser, yyvsp[0].nodeData ), 
+                        syck_hdlr_add_node( (SyckParser *)parser, n ) );
+                }
+    break;
+
+
+    }
+
+/* Line 1010 of yacc.c.  */
+#line 1651 "gram.c"
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+
+
+  YY_STACK_PRINT (yyss, yyssp);
+
+  *++yyvsp = yyval;
+
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (YYPACT_NINF < yyn && yyn < YYLAST)
+	{
+	  YYSIZE_T yysize = 0;
+	  int yytype = YYTRANSLATE (yychar);
+	  const char* yyprefix;
+	  char *yymsg;
+	  int yyx;
+
+	  /* Start YYX at -YYN if negative to avoid negative indexes in
+	     YYCHECK.  */
+	  int yyxbegin = yyn < 0 ? -yyn : 0;
+
+	  /* Stay within bounds of both yycheck and yytname.  */
+	  int yychecklim = YYLAST - yyn;
+	  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+	  int yycount = 0;
+
+	  yyprefix = ", expecting ";
+	  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+	      {
+		yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]);
+		yycount += 1;
+		if (yycount == 5)
+		  {
+		    yysize = 0;
+		    break;
+		  }
+	      }
+	  yysize += (sizeof ("syntax error, unexpected ")
+		     + yystrlen (yytname[yytype]));
+	  yymsg = (char *) YYSTACK_ALLOC (yysize);
+	  if (yymsg != 0)
+	    {
+	      char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
+	      yyp = yystpcpy (yyp, yytname[yytype]);
+
+	      if (yycount < 5)
+		{
+		  yyprefix = ", expecting ";
+		  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+		    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+		      {
+			yyp = yystpcpy (yyp, yyprefix);
+			yyp = yystpcpy (yyp, yytname[yyx]);
+			yyprefix = " or ";
+		      }
+		}
+	      yyerror (yymsg);
+	      YYSTACK_FREE (yymsg);
+	    }
+	  else
+	    yyerror ("syntax error; also virtual memory exhausted");
+	}
+      else
+#endif /* YYERROR_VERBOSE */
+	yyerror ("syntax error");
+    }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+	 error, discard it.  */
+
+      if (yychar <= YYEOF)
+        {
+          /* If at end of input, pop the error token,
+	     then the rest of the stack, then return failure.  */
+	  if (yychar == YYEOF)
+	     for (;;)
+	       {
+		 YYPOPSTACK;
+		 if (yyssp == yyss)
+		   YYABORT;
+		 YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+		 yydestruct (yystos[*yyssp], yyvsp);
+	       }
+        }
+      else
+	{
+	  YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
+	  yydestruct (yytoken, &yylval);
+	  yychar = YYEMPTY;
+
+	}
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+  goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+
+#ifdef __GNUC__
+  /* Pacify GCC when the user code never invokes YYERROR and the label
+     yyerrorlab therefore never appears in user code.  */
+  if (0)
+     goto yyerrorlab;
+#endif
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+  yystate = *yyssp;
+  goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+	{
+	  yyn += YYTERROR;
+	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+	    {
+	      yyn = yytable[yyn];
+	      if (0 < yyn)
+		break;
+	    }
+	}
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+	YYABORT;
+
+      YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+      yydestruct (yystos[yystate], yyvsp);
+      YYPOPSTACK;
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  YYDPRINTF ((stderr, "Shifting error token, "));
+
+  *++yyvsp = yylval;
+
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here.  |
+`----------------------------------------------*/
+yyoverflowlab:
+  yyerror ("parser stack overflow");
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+  return yyresult;
+}
+
+
+#line 464 "gram.y"
+
+
+void
+apply_seq_in_map( SyckParser *parser, SyckNode *n )
+{
+    long map_len;
+    if ( n->shortcut == NULL )
+    {
+        return;
+    }
+
+    map_len = syck_map_count( n );
+    syck_map_assign( n, map_value, map_len - 1,
+        syck_hdlr_add_node( parser, n->shortcut ) );
+
+    n->shortcut = NULL;
+}
+
+

Added: trunk/ext/syck/gram.h
===================================================================
--- trunk/ext/syck/gram.h	2006-02-20 05:15:09 UTC (rev 447)
+++ trunk/ext/syck/gram.h	2006-02-20 05:50:08 UTC (rev 448)
@@ -0,0 +1,79 @@
+/* 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.  */
+
+/* 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
+
+
+
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 35 "gram.y"
+typedef union YYSTYPE {
+    SYMID nodeId;
+    SyckNode *nodeData;
+    char *name;
+} YYSTYPE;
+/* Line 1285 of yacc.c.  */
+#line 71 "gram.h"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYP