diff options
author | why <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-10-14 23:15:19 +0000 |
---|---|---|
committer | why <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-10-14 23:15:19 +0000 |
commit | c76c3349e4d5cfc3d1452d32491647294c102a8b (patch) | |
tree | 8e4ffb887b591097de3f8f5b080276bb62f7648c /ext/syck/bytecode.c | |
parent | b215f2fdb93fba83199168e50c28adc458844a26 (diff) | |
download | ruby-c76c3349e4d5cfc3d1452d32491647294c102a8b.tar.gz |
* ext/syck/bytecode.c: Checkin of YAML bytecode support.
* ext/syck/gram.c: Ditto.
* ext/syck/syck.c: Ditto.
* ext/syck/token.c: Ditto.
* ext/syck/handler.c: Ditto.
* ext/syck/handler.c: Now using 'tag' rather than 'taguri' in type URIs.
* ext/syck/rubyext.c: Ditto (on both counts).
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4769 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/syck/bytecode.c')
-rw-r--r-- | ext/syck/bytecode.c | 735 |
1 files changed, 735 insertions, 0 deletions
diff --git a/ext/syck/bytecode.c b/ext/syck/bytecode.c new file mode 100644 index 0000000000..efc9890c4d --- /dev/null +++ b/ext/syck/bytecode.c @@ -0,0 +1,735 @@ +/* Generated by re2c 0.5 on Tue Oct 14 15:44:30 2003 */ +#line 1 "bytecode.re" +/* + * bytecode.re + * + * $Author$ + * $Date$ + * + * Copyright (C) 2003 why the lucky stiff + */ +#include "syck.h" +#include "ruby.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 + +/* + * 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_open: \ + lvl->status = s; \ + break; \ + \ + default: \ + ADD_LEVEL(len, s); \ + break; \ + } + +/* + * Nice little macro to ensure we're YAML_IOPENed to the current level. + * * Only use this macro in the "Document" section * + */ +#define ENSURE_YAML_IOPEN(last_lvl, lvl_type, to_len, reset) \ + if ( last_lvl->spaces < to_len ) \ + { \ + if ( last_lvl->status == syck_lvl_inline ) \ + { \ + goto Document; \ + } \ + else \ + { \ + ADD_LEVEL( to_len, lvl_type ); \ + if ( reset == 1 ) YYPOS(0); \ + return YAML_IOPEN; \ + } \ + } + +/* + * Nice little macro to ensure closure of levels. + * * Only use this macro in the "Document" section * + */ +#define ENSURE_YAML_IEND(last_lvl, to_len) \ + if ( last_lvl->spaces > to_len ) \ + { \ + syck_parser_pop_level( parser ); \ + YYPOS(0); \ + return YAML_IEND; \ + } + +/* + * Concatenates string items and manages allocation + * to the string + */ +#define CAT(s, c, i, l) \ + { \ + if ( i + 1 >= c ) \ + { \ + c += QUOTELEN; \ + S_REALLOC_N( s, char, c ); \ + } \ + s[i++] = l; \ + s[i] = '\0'; \ + } + +/* + * Parser for standard YAML Bytecode [UTF-8] + */ +int +sycklex_bytecode_utf8( YYSTYPE *sycklval, SyckParser *parser ) +{ + SyckLevel *lvl; + int doc_level = 0; + syck_parser_ptr = parser; + if ( YYCURSOR == NULL ) + { + syck_parser_read( parser ); + } + + if ( parser->force_token != 0 ) + { + int t = parser->force_token; + parser->force_token = 0; + return t; + } + +#line 163 + + + lvl = CURRENT_LEVEL(); + if ( lvl->status == syck_lvl_doc ) + { + goto Document; + } + +Header: + + YYTOKEN = YYCURSOR; + +{ + YYCTYPE yych; + unsigned int yyaccept; + goto yy0; +yy1: ++YYCURSOR; +yy0: + if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = *YYCURSOR; + if(yych <= '\000') goto yy2; + if(yych == 'D') goto yy3; + goto yy5; +yy2: YYCURSOR = YYMARKER; + switch(yyaccept){ + case 0: goto yy4; + } +yy3: yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if(yych == '\n') goto yy6; + if(yych == '\r') goto yy8; +yy4: +#line 189 + { YYPOS(0); + goto Document; + } +yy5: yych = *++YYCURSOR; + goto yy4; +yy6: yych = *++YYCURSOR; +yy7: +#line 177 + { if ( lvl->status == syck_lvl_header ) + { + goto Directive; + } + else + { + ENSURE_YAML_IEND(lvl, -1); + YYPOS(0); + return 0; + } + } +yy8: yych = *++YYCURSOR; + if(yych == '\n') goto yy6; + goto yy2; +} +#line 193 + + + lvl->status = syck_lvl_doc; + +Document: + { + lvl = CURRENT_LEVEL(); + if ( lvl->status == syck_lvl_header ) + { + lvl->status = syck_lvl_doc; + } + + YYTOKEN = YYCURSOR; + +{ + YYCTYPE yych; + unsigned int yyaccept; + goto yy9; +yy10: ++YYCURSOR; +yy9: + if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = *YYCURSOR; + if(yych <= 'E'){ + if(yych <= '\r'){ + if(yych <= '\t'){ + if(yych <= '\000') goto yy30; + } else { + if(yych <= '\n') goto yy27; + if(yych >= '\r') goto yy29; + } + } else { + if(yych <= 'A'){ + if(yych >= 'A') goto yy19; + } else { + if(yych <= 'C') goto yy11; + if(yych <= 'D') goto yy12; + goto yy16; + } + } + } else { + if(yych <= 'Q'){ + if(yych <= 'M'){ + if(yych >= 'M') goto yy14; + } else { + if(yych <= 'O') goto yy11; + if(yych <= 'P') goto yy13; + goto yy15; + } + } else { + if(yych <= 'T'){ + if(yych <= 'R') goto yy21; + if(yych <= 'S') goto yy17; + goto yy23; + } else { + if(yych == 'c') goto yy25; + } + } + } +yy11:yy12: yych = *++YYCURSOR; + if(yych == '\n') goto yy41; + if(yych == '\r') goto yy44; + goto yy11; +yy13: yych = *++YYCURSOR; + if(yych == '\n') goto yy41; + if(yych == '\r') goto yy43; + goto yy11; +yy14: yych = *++YYCURSOR; + if(yych == '\n') goto yy38; + if(yych == '\r') goto yy40; + goto yy11; +yy15: yych = *++YYCURSOR; + if(yych == '\n') goto yy35; + if(yych == '\r') goto yy37; + goto yy11; +yy16: yych = *++YYCURSOR; + if(yych == '\n') goto yy32; + if(yych == '\r') goto yy34; + goto yy11; +yy17: yych = *++YYCURSOR; +yy18: +#line 243 + { ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_str); + goto Scalar; + } +yy19: yych = *++YYCURSOR; +yy20: +#line 247 + { ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_open); + sycklval->name = get_inline( parser ); + syck_hdlr_remove_anchor( parser, sycklval->name ); + return YAML_ANCHOR; + } +yy21: yych = *++YYCURSOR; +yy22: +#line 253 + { 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; + } +yy23: yych = *++YYCURSOR; +yy24: +#line 260 + { char *qstr = get_inline( parser ); + 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 ) ); + S_MEMCPY( sycklval->name, qstr + 1, char, strlen( qstr ) ); + free( qstr ); + } + } + return YAML_TRANSFER; + } + sycklval->name = qstr; + return YAML_TAGURI; + } +yy25: yych = *++YYCURSOR; +yy26: +#line 316 + { goto Comment; } +yy27: yych = *++YYCURSOR; +yy28: +#line 318 + { if ( lvl->status == syck_lvl_seq ) + { + return YAML_INDENT; + } + else if ( lvl->status == syck_lvl_map ) + { + lvl->ncount++; + if ( lvl->ncount % 2 == 1 ) return ':'; + else return YAML_INDENT; + } + goto Document; + } +yy29: yych = *++YYCURSOR; + if(yych == '\n') goto yy27; + goto yy11; +yy30: yych = *++YYCURSOR; +yy31: +#line 331 + { ENSURE_YAML_IEND(lvl, -1); + YYPOS(0); + return 0; + } +yy32: yych = *++YYCURSOR; +yy33: +#line 222 + { POP_LEVEL(); + lvl = CURRENT_LEVEL(); + if ( lvl->status == syck_lvl_seq ) + { + FORCE_NEXT_TOKEN(YAML_INDENT); + } + else if ( lvl->status == syck_lvl_map ) + { + lvl->ncount++; + if ( lvl->ncount % 2 == 1 ) + { + FORCE_NEXT_TOKEN(':'); + } + else + { + FORCE_NEXT_TOKEN(YAML_INDENT); + } + } + return YAML_IEND; + } +yy34: yych = *++YYCURSOR; + if(yych == '\n') goto yy32; + goto yy11; +yy35: yych = *++YYCURSOR; +yy36: +#line 218 + { ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_seq); + return YAML_IOPEN; + } +yy37: yych = *++YYCURSOR; + if(yych == '\n') goto yy35; + goto yy11; +yy38: yych = *++YYCURSOR; +yy39: +#line 214 + { ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_map); + return YAML_IOPEN; + } +yy40: yych = *++YYCURSOR; + if(yych == '\n') goto yy38; + goto yy11; +yy41: yych = *++YYCURSOR; +yy42: +#line 209 + { ENSURE_YAML_IEND(lvl, -1); + YYPOS(0); + return 0; + } +yy43: yych = *++YYCURSOR; + if(yych == '\n') goto yy41; + goto yy11; +yy44: yych = *++YYCURSOR; + if(yych == '\n') goto yy41; + goto yy11; +} +#line 336 + + + } + +Directive: + { + YYTOKTMP = YYCURSOR; + +{ + YYCTYPE yych; + unsigned int yyaccept; + goto yy45; +yy46: ++YYCURSOR; +yy45: + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if(yych <= '\000') goto yy47; + if(yych == 'V') goto yy48; + goto yy50; +yy47: YYCURSOR = YYMARKER; + switch(yyaccept){ + case 0: goto yy49; + } +yy48: yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if(yych <= '-') goto yy49; + if(yych == '`') goto yy49; + if(yych <= 'z') goto yy51; +yy49: +#line 348 + { YYCURSOR = YYTOKTMP; + return YAML_DOCSEP; + } +yy50: yych = *++YYCURSOR; + goto yy49; +yy51: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy52: if(yych <= ':'){ + if(yych <= '-') goto yy47; + if(yych <= '9') goto yy51; + } else { + if(yych == '`') goto yy47; + if(yych <= 'z') goto yy51; + goto yy47; + } +yy53: yych = *++YYCURSOR; + if(yych <= '-') goto yy47; + if(yych == '`') goto yy47; + if(yych >= '{') goto yy47; +yy54: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy55: if(yych <= '\r'){ + if(yych == '\n') goto yy56; + if(yych <= '\f') goto yy47; + goto yy58; + } else { + if(yych <= '_'){ + if(yych <= '-') goto yy47; + goto yy54; + } else { + if(yych <= '`') goto yy47; + if(yych <= 'z') goto yy54; + goto yy47; + } + } +yy56: yych = *++YYCURSOR; +yy57: +#line 346 + { goto Directive; } +yy58: yych = *++YYCURSOR; + if(yych == '\n') goto yy56; + goto yy47; +} +#line 351 + + + } + +Comment: + { + YYTOKTMP = YYCURSOR; + +{ + YYCTYPE yych; + unsigned int yyaccept; + goto yy59; +yy60: ++YYCURSOR; +yy59: + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if(yych <= '\n'){ + if(yych <= '\000') goto yy61; + if(yych <= '\t') goto yy66; + goto yy62; + } else { + if(yych == '\r') goto yy64; + goto yy66; + } +yy61:yy62: yych = *++YYCURSOR; +yy63: +#line 361 + { goto Document; } +yy64: yych = *++YYCURSOR; + if(yych == '\n') goto yy67; +yy65: +#line 363 + { goto Comment; } +yy66: yych = *++YYCURSOR; + goto yy65; +yy67: yych = *++YYCURSOR; + goto yy63; +} +#line 365 + + + } + +Scalar: + { + int idx = 0; + int cap = 100; + char *str = S_ALLOC_N( char, cap ); + char *tok; + +Scalar2: + tok = YYCURSOR; + +{ + YYCTYPE yych; + unsigned int yyaccept; + goto yy68; +yy69: ++YYCURSOR; +yy68: + if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = *YYCURSOR; + if(yych <= '\n'){ + if(yych <= '\000') goto yy74; + if(yych <= '\t') goto yy76; + } else { + if(yych == '\r') goto yy72; + goto yy76; + } +yy70: yych = *++YYCURSOR; + if(yych <= 'M'){ + if(yych == 'C') goto yy78; + } else { + if(yych <= 'N') goto yy80; + if(yych == 'Z') goto yy83; + } +yy71: +#line 404 + { YYCURSOR = tok; + goto ScalarEnd; + } +yy72: yych = *++YYCURSOR; + if(yych == '\n') goto yy77; +yy73: +#line 412 + { CAT(str, cap, idx, tok[0]); + goto Scalar2; + } +yy74: yych = *++YYCURSOR; +yy75: +#line 408 + { YYCURSOR = tok; + goto ScalarEnd; + } +yy76: yych = *++YYCURSOR; + goto yy73; +yy77: yych = *++YYCURSOR; + if(yych <= 'M'){ + if(yych != 'C') goto yy71; + } else { + if(yych <= 'N') goto yy80; + if(yych == 'Z') goto yy83; + goto yy71; + } +yy78: yych = *++YYCURSOR; +yy79: +#line 381 + { goto Scalar2; } +yy80: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy81: if(yych <= '/') goto yy82; + if(yych <= '9') goto yy80; +yy82: +#line 383 + { 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; + } +yy83: yych = *++YYCURSOR; +yy84: +#line 400 + { CAT(str, cap, idx, '\0'); + goto Scalar2; + } +} +#line 416 + + +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; + +Inline: + { + tok = YYCURSOR; + +{ + YYCTYPE yych; + unsigned int yyaccept; + goto yy85; +yy86: ++YYCURSOR; +yy85: + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if(yych <= '\n'){ + if(yych <= '\000') goto yy91; + if(yych <= '\t') goto yy93; + } else { + if(yych == '\r') goto yy89; + goto yy93; + } +yy87: yych = *++YYCURSOR; +yy88: +#line 449 + { return str; } +yy89: yych = *++YYCURSOR; + if(yych == '\n') goto yy94; +yy90: +#line 455 + { CAT(str, cap, idx, tok[0]); + goto Inline; + } +yy91: yych = *++YYCURSOR; +yy92: +#line 451 + { YYCURSOR = tok; + return str; + } +yy93: yych = *++YYCURSOR; + goto yy90; +yy94: yych = *++YYCURSOR; + goto yy88; +} +#line 459 + + + } + +} + |