1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* lib/yaml.rb: removed fallback to pure Ruby parser.

* lib/yaml/baseemitter.rb (node_text): rewriting folded scalars.

* ext/syck/syck.h: reports style of scalars now, be they plain, block
  single-, or double-quoted.

* ext/syck/syck.c: ditto.

* ext/syck/gram.c: ditto.

* ext/syck/node.c: ditto.

* ext/syck/token.c: ditto.

* ext/syck/rubyext.c (yaml_org_handler): symbols loaded only
  if scalar style is plain.

* test/yaml/test_yaml.rb (test_perl_regexp): updated test to
  match new regexp serialization.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6315 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
why 2004-05-15 03:11:28 +00:00
parent 094290e68f
commit c474911e5b
11 changed files with 362 additions and 340 deletions

View file

@ -1,3 +1,26 @@
Sat May 15 12:04:58 2004 why the lucky stiff <why@ruby-lang.org>
* lib/yaml.rb: removed fallback to pure Ruby parser.
* lib/yaml/baseemitter.rb (node_text): rewriting folded scalars.
* ext/syck/syck.h: reports style of scalars now, be they plain, block
single-, or double-quoted.
* ext/syck/syck.c: ditto.
* ext/syck/gram.c: ditto.
* ext/syck/node.c: ditto.
* ext/syck/token.c: ditto.
* ext/syck/rubyext.c (yaml_org_handler): symbols loaded only
if scalar style is plain.
* test/yaml/test_yaml.rb (test_perl_regexp): updated test to
match new regexp serialization.
Sat May 15 01:41:34 2004 Yukihiro Matsumoto <matz@ruby-lang.org> Sat May 15 01:41:34 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (eval): forgot to restore $SAFE value before evaluating * eval.c (eval): forgot to restore $SAFE value before evaluating

View file

@ -99,7 +99,7 @@
#define YYLEX_PARAM parser #define YYLEX_PARAM parser
#define NULL_NODE(parser, node) \ #define NULL_NODE(parser, node) \
SyckNode *node = syck_new_str( "" ); \ SyckNode *node = syck_new_str( "", scalar_plain ); \
if ( ((SyckParser *)parser)->taguri_expansion == 1 ) \ if ( ((SyckParser *)parser)->taguri_expansion == 1 ) \
{ \ { \
node->type_id = syck_taguri( YAML_DOMAIN, "null", 4 ); \ node->type_id = syck_taguri( YAML_DOMAIN, "null", 4 ); \

View file

@ -63,7 +63,7 @@
#ifndef YYSTYPE #ifndef YYSTYPE
#line 23 "gram.y" #line 33 "gram.y"
typedef union { typedef union {
SYMID nodeId; SYMID nodeId;
SyckNode *nodeData; SyckNode *nodeData;

View file

@ -83,6 +83,7 @@ syck_alloc_str()
s = S_ALLOC( struct SyckStr ); s = S_ALLOC( struct SyckStr );
s->len = 0; s->len = 0;
s->ptr = NULL; s->ptr = NULL;
s->style = scalar_none;
n = syck_alloc_node( syck_str_kind ); n = syck_alloc_node( syck_str_kind );
n->data.str = s; n->data.str = s;
@ -91,19 +92,20 @@ syck_alloc_str()
} }
SyckNode * SyckNode *
syck_new_str( char *str ) syck_new_str( char *str, enum scalar_style style )
{ {
return syck_new_str2( str, strlen( str ) ); return syck_new_str2( str, strlen( str ), style );
} }
SyckNode * SyckNode *
syck_new_str2( char *str, long len ) syck_new_str2( char *str, long len, enum scalar_style style )
{ {
SyckNode *n; SyckNode *n;
n = syck_alloc_str(); n = syck_alloc_str();
n->data.str->ptr = S_ALLOC_N( char, len + 1 ); n->data.str->ptr = S_ALLOC_N( char, len + 1 );
n->data.str->len = len; n->data.str->len = len;
n->data.str->style = style;
memcpy( n->data.str->ptr, str, len ); memcpy( n->data.str->ptr, str, len );
n->data.str->ptr[len] = '\0'; n->data.str->ptr[len] = '\0';

View file

@ -15,33 +15,25 @@
typedef struct RVALUE { typedef struct RVALUE {
union { union {
#if 0
struct { struct {
unsigned long flags; /* always 0 for freed obj */ unsigned long flags; /* always 0 for freed obj */
struct RVALUE *next; struct RVALUE *next;
} free; } free;
#endif
struct RBasic basic; struct RBasic basic;
struct RObject object; struct RObject object;
struct RClass klass; struct RClass klass;
struct RFloat flonum; /*struct RFloat flonum;*/
struct RString string; /*struct RString string;*/
struct RArray array; struct RArray array;
struct RRegexp regexp; /*struct RRegexp regexp;*/
struct RHash hash; struct RHash hash;
struct RData data; /*struct RData data;*/
struct RStruct rstruct; struct RStruct rstruct;
struct RBignum bignum; /*struct RBignum bignum;*/
struct RFile file; /*struct RFile file;*/
#if 0
struct RNode node;
struct RMatch match;
struct RVarmap varmap;
struct SCOPE scope;
#endif
} as; } as;
#ifdef GC_DEBUG
char *file;
int line;
#endif
} RVALUE; } RVALUE;
typedef struct { typedef struct {
@ -95,7 +87,7 @@ struct parser_xtra {
*/ */
VALUE VALUE
rb_syck_compile(self, port) rb_syck_compile(self, port)
VALUE self, port; VALUE self, port;
{ {
SYMID oid; SYMID oid;
int taint; int taint;
@ -104,7 +96,7 @@ rb_syck_compile(self, port)
bytestring_t *sav; bytestring_t *sav;
SyckParser *parser = syck_new_parser(); SyckParser *parser = syck_new_parser();
taint = syck_parser_assign_io(parser, port); taint = syck_parser_assign_io(parser, port);
syck_parser_handler( parser, syck_yaml2byte_handler ); syck_parser_handler( parser, syck_yaml2byte_handler );
syck_parser_error_handler( parser, NULL ); syck_parser_error_handler( parser, NULL );
syck_parser_implicit_typing( parser, 0 ); syck_parser_implicit_typing( parser, 0 );
@ -161,14 +153,14 @@ rb_syck_io_str_read( char *buf, SyckIoStr *str, long max_size, long skip )
*/ */
int int
syck_parser_assign_io(parser, port) syck_parser_assign_io(parser, port)
SyckParser *parser; SyckParser *parser;
VALUE port; VALUE port;
{ {
int taint = Qtrue; int taint = Qtrue;
if (rb_respond_to(port, s_to_str)) { if (rb_respond_to(port, s_to_str)) {
taint = OBJ_TAINTED(port); /* original taintedness */ taint = OBJ_TAINTED(port); /* original taintedness */
StringValue(port); /* possible conversion */ StringValue(port); /* possible conversion */
syck_parser_str( parser, RSTRING(port)->ptr, RSTRING(port)->len, NULL ); syck_parser_str( parser, RSTRING(port)->ptr, RSTRING(port)->len, NULL );
} }
else if (rb_respond_to(port, s_read)) { else if (rb_respond_to(port, s_read)) {
if (rb_respond_to(port, s_binmode)) { if (rb_respond_to(port, s_binmode)) {
@ -341,7 +333,7 @@ rb_syck_parse_handler(p, n)
bonus = (struct parser_xtra *)p->bonus; bonus = (struct parser_xtra *)p->bonus;
if ( bonus->taint) OBJ_TAINT( obj ); if ( bonus->taint) OBJ_TAINT( obj );
if ( bonus->proc != 0 ) rb_funcall(bonus->proc, s_call, 1, v); if ( bonus->proc != 0 ) rb_funcall(bonus->proc, s_call, 1, v);
rb_ivar_set(obj, s_value, v); rb_ivar_set(obj, s_value, v);
rb_hash_aset(bonus->data, INT2FIX(RHASH(bonus->data)->tbl->num_entries), obj); rb_hash_aset(bonus->data, INT2FIX(RHASH(bonus->data)->tbl->num_entries), obj);
@ -356,10 +348,10 @@ VALUE
syck_merge_i( entry, hsh ) syck_merge_i( entry, hsh )
VALUE entry, hsh; VALUE entry, hsh;
{ {
if ( rb_obj_is_kind_of( entry, rb_cHash ) ) if ( rb_obj_is_kind_of( entry, rb_cHash ) )
{ {
rb_funcall( hsh, s_update, 1, entry ); rb_funcall( hsh, s_update, 1, entry );
} }
return Qnil; return Qnil;
} }
@ -375,12 +367,12 @@ rb_new_syck_node( obj, type_id )
if (rb_respond_to(obj, s_to_str)) if (rb_respond_to(obj, s_to_str))
{ {
StringValue(obj); /* possible conversion */ StringValue(obj); /* possible conversion */
n = syck_alloc_str(); n = syck_alloc_str();
n->data.str->ptr = RSTRING(obj)->ptr; n->data.str->ptr = RSTRING(obj)->ptr;
n->data.str->len = RSTRING(obj)->len; n->data.str->len = RSTRING(obj)->len;
} }
else if ( rb_obj_is_kind_of( obj, rb_cArray ) ) else if ( rb_obj_is_kind_of( obj, rb_cArray ) )
{ {
n = syck_alloc_seq(); n = syck_alloc_seq();
for ( i = 0; i < RARRAY(obj)->len; i++ ) for ( i = 0; i < RARRAY(obj)->len; i++ )
@ -535,7 +527,7 @@ yaml_org_handler( n, ref )
ptr += 2; ptr += 2;
while ( !ISDIGIT( *ptr ) ) ptr++; while ( !ISDIGIT( *ptr ) ) ptr++;
day = INT2FIX(strtol(ptr, NULL, 10)); day = INT2FIX(strtol(ptr, NULL, 10));
if ( !cDate ) { if ( !cDate ) {
/* /*
* Load Date module * Load Date module
@ -558,7 +550,9 @@ yaml_org_handler( n, ref )
{ {
obj = rb_funcall( cDefaultKey, s_new, 0 ); obj = rb_funcall( cDefaultKey, s_new, 0 );
} }
else if ( n->data.str->len > 1 && strncmp( n->data.str->ptr, ":", 1 ) == 0 ) else if ( n->data.str->style == scalar_plain &&
n->data.str->len > 1 &&
strncmp( n->data.str->ptr, ":", 1 ) == 0 )
{ {
obj = rb_funcall( oDefaultLoader, s_transfer, 2, obj = rb_funcall( oDefaultLoader, s_transfer, 2,
rb_str_new2( "ruby/sym" ), rb_str_new2( "ruby/sym" ),
@ -676,7 +670,7 @@ rb_syck_load_handler(p, n)
bonus = (struct parser_xtra *)p->bonus; bonus = (struct parser_xtra *)p->bonus;
if ( bonus->taint) OBJ_TAINT( obj ); if ( bonus->taint) OBJ_TAINT( obj );
if ( bonus->proc != 0 ) rb_funcall(bonus->proc, s_call, 1, obj); if ( bonus->proc != 0 ) rb_funcall(bonus->proc, s_call, 1, obj);
rb_hash_aset(bonus->data, INT2FIX(RHASH(bonus->data)->tbl->num_entries), obj); rb_hash_aset(bonus->data, INT2FIX(RHASH(bonus->data)->tbl->num_entries), obj);
return obj; return obj;
@ -722,21 +716,21 @@ rb_syck_bad_anchor_handler(p, a)
*/ */
void void
syck_set_model( parser, input, model ) syck_set_model( parser, input, model )
SyckParser *parser; SyckParser *parser;
VALUE input, model; VALUE input, model;
{ {
if ( model == sym_generic ) if ( model == sym_generic )
{ {
syck_parser_handler( parser, rb_syck_parse_handler ); syck_parser_handler( parser, rb_syck_parse_handler );
syck_parser_implicit_typing( parser, 1 ); syck_parser_implicit_typing( parser, 1 );
syck_parser_taguri_expansion( parser, 1 ); syck_parser_taguri_expansion( parser, 1 );
} }
else else
{ {
syck_parser_handler( parser, rb_syck_load_handler ); syck_parser_handler( parser, rb_syck_load_handler );
syck_parser_implicit_typing( parser, 1 ); syck_parser_implicit_typing( parser, 1 );
syck_parser_taguri_expansion( parser, 0 ); syck_parser_taguri_expansion( parser, 0 );
} }
if ( input == sym_bytecode ) if ( input == sym_bytecode )
{ {
syck_parser_set_input_type( parser, syck_bytecode_utf8 ); syck_parser_set_input_type( parser, syck_bytecode_utf8 );
@ -763,13 +757,13 @@ VALUE
syck_parser_new(argc, argv, class) syck_parser_new(argc, argv, class)
int argc; int argc;
VALUE *argv; VALUE *argv;
VALUE class; VALUE class;
{ {
VALUE pobj, options, init_argv[1]; VALUE pobj, options, init_argv[1];
SyckParser *parser = syck_new_parser(); SyckParser *parser = syck_new_parser();
rb_scan_args(argc, argv, "01", &options); rb_scan_args(argc, argv, "01", &options);
pobj = Data_Wrap_Struct( class, syck_mark_parser, syck_free_parser, parser ); pobj = Data_Wrap_Struct( class, syck_mark_parser, syck_free_parser, parser );
syck_parser_set_root_on_error( parser, Qnil ); syck_parser_set_root_on_error( parser, Qnil );
@ -777,9 +771,9 @@ syck_parser_new(argc, argv, class)
{ {
options = rb_hash_new(); options = rb_hash_new();
} }
init_argv[0] = options; init_argv[0] = options;
rb_obj_call_init(pobj, 1, init_argv); rb_obj_call_init(pobj, 1, init_argv);
return pobj; return pobj;
} }
/* /*
@ -790,7 +784,7 @@ syck_parser_initialize( self, options )
VALUE self, options; VALUE self, options;
{ {
rb_ivar_set(self, s_options, options); rb_ivar_set(self, s_options, options);
return self; return self;
} }
/* /*
@ -800,13 +794,13 @@ static VALUE
syck_parser_bufsize_set( self, size ) syck_parser_bufsize_set( self, size )
VALUE self, size; VALUE self, size;
{ {
SyckParser *parser; SyckParser *parser;
Data_Get_Struct(self, SyckParser, parser); Data_Get_Struct(self, SyckParser, parser);
if ( rb_respond_to( size, s_to_i ) ) { if ( rb_respond_to( size, s_to_i ) ) {
parser->bufsize = NUM2INT(rb_funcall(size, s_to_i, 0)); parser->bufsize = NUM2INT(rb_funcall(size, s_to_i, 0));
} }
return self; return self;
} }
/* /*
@ -816,10 +810,10 @@ static VALUE
syck_parser_bufsize_get( self ) syck_parser_bufsize_get( self )
VALUE self; VALUE self;
{ {
SyckParser *parser; SyckParser *parser;
Data_Get_Struct(self, SyckParser, parser); Data_Get_Struct(self, SyckParser, parser);
return INT2FIX( parser->bufsize ); return INT2FIX( parser->bufsize );
} }
/* /*
@ -829,26 +823,26 @@ VALUE
syck_parser_load(argc, argv, self) syck_parser_load(argc, argv, self)
int argc; int argc;
VALUE *argv; VALUE *argv;
VALUE self; VALUE self;
{ {
VALUE port, proc, model, input; VALUE port, proc, model, input;
SyckParser *parser; SyckParser *parser;
struct parser_xtra bonus; struct parser_xtra bonus;
volatile VALUE hash; /* protect from GC */ volatile VALUE hash; /* protect from GC */
rb_scan_args(argc, argv, "11", &port, &proc); rb_scan_args(argc, argv, "11", &port, &proc);
Data_Get_Struct(self, SyckParser, parser); Data_Get_Struct(self, SyckParser, parser);
input = rb_hash_aref( rb_attr_get( self, s_options ), sym_input ); input = rb_hash_aref( rb_attr_get( self, s_options ), sym_input );
model = rb_hash_aref( rb_attr_get( self, s_options ), sym_model ); model = rb_hash_aref( rb_attr_get( self, s_options ), sym_model );
syck_set_model( parser, input, model ); syck_set_model( parser, input, model );
bonus.taint = syck_parser_assign_io(parser, port); bonus.taint = syck_parser_assign_io(parser, port);
bonus.data = hash = rb_hash_new(); bonus.data = hash = rb_hash_new();
if ( NIL_P( proc ) ) bonus.proc = 0; if ( NIL_P( proc ) ) bonus.proc = 0;
else bonus.proc = proc; else bonus.proc = proc;
parser->bonus = (void *)&bonus; parser->bonus = (void *)&bonus;
return syck_parse( parser ); return syck_parse( parser );
} }
@ -860,38 +854,38 @@ VALUE
syck_parser_load_documents(argc, argv, self) syck_parser_load_documents(argc, argv, self)
int argc; int argc;
VALUE *argv; VALUE *argv;
VALUE self; VALUE self;
{ {
VALUE port, proc, v, input, model; VALUE port, proc, v, input, model;
SyckParser *parser; SyckParser *parser;
struct parser_xtra bonus; struct parser_xtra bonus;
volatile VALUE hash; volatile VALUE hash;
rb_scan_args(argc, argv, "1&", &port, &proc); rb_scan_args(argc, argv, "1&", &port, &proc);
Data_Get_Struct(self, SyckParser, parser); Data_Get_Struct(self, SyckParser, parser);
input = rb_hash_aref( rb_attr_get( self, s_options ), sym_input ); input = rb_hash_aref( rb_attr_get( self, s_options ), sym_input );
model = rb_hash_aref( rb_attr_get( self, s_options ), sym_model ); model = rb_hash_aref( rb_attr_get( self, s_options ), sym_model );
syck_set_model( parser, input, model ); syck_set_model( parser, input, model );
bonus.taint = syck_parser_assign_io(parser, port); bonus.taint = syck_parser_assign_io(parser, port);
while ( 1 ) while ( 1 )
{ {
/* Reset hash for tracking nodes */ /* Reset hash for tracking nodes */
bonus.data = hash = rb_hash_new(); bonus.data = hash = rb_hash_new();
bonus.proc = 0; bonus.proc = 0;
parser->bonus = (void *)&bonus; parser->bonus = (void *)&bonus;
/* Parse a document */ /* Parse a document */
v = syck_parse( parser ); v = syck_parse( parser );
if ( parser->eof == 1 ) if ( parser->eof == 1 )
{ {
break; break;
} }
/* Pass document to block */ /* Pass document to block */
rb_funcall( proc, s_call, 1, v ); rb_funcall( proc, s_call, 1, v );
} }
return Qnil; return Qnil;
} }
@ -913,7 +907,7 @@ syck_loader_initialize( self )
rb_hash_aset(families, rb_str_new2( YAML_DOMAIN ), rb_hash_new()); rb_hash_aset(families, rb_str_new2( YAML_DOMAIN ), rb_hash_new());
rb_hash_aset(families, rb_str_new2( RUBY_DOMAIN ), rb_hash_new()); rb_hash_aset(families, rb_str_new2( RUBY_DOMAIN ), rb_hash_new());
return self; return self;
} }
/* /*
@ -1025,15 +1019,15 @@ transfer_find_i(entry, col)
{ {
VALUE key = rb_ary_entry( entry, 0 ); VALUE key = rb_ary_entry( entry, 0 );
VALUE tid = rb_ary_entry( col, 0 ); VALUE tid = rb_ary_entry( col, 0 );
if ( rb_respond_to( key, s_match ) ) if ( rb_respond_to( key, s_match ) )
{ {
VALUE match = rb_funcall( key, rb_intern("match"), 1, tid ); VALUE match = rb_funcall( key, rb_intern("match"), 1, tid );
if ( ! NIL_P( match ) ) if ( ! NIL_P( match ) )
{ {
rb_ary_push( col, rb_ary_entry( entry, 1 ) ); rb_ary_push( col, rb_ary_entry( entry, 1 ) );
rb_iter_break(); rb_iter_break();
} }
} }
return Qnil; return Qnil;
} }
@ -1288,9 +1282,9 @@ VALUE
syck_emitter_new(argc, argv, class) syck_emitter_new(argc, argv, class)
int argc; int argc;
VALUE *argv; VALUE *argv;
VALUE class; VALUE class;
{ {
VALUE pobj, options, init_argv[1]; VALUE pobj, options, init_argv[1];
SyckEmitter *emitter = syck_new_emitter(); SyckEmitter *emitter = syck_new_emitter();
syck_emitter_ignore_id( emitter, Qnil ); syck_emitter_ignore_id( emitter, Qnil );
syck_emitter_handler( emitter, rb_syck_output_handler ); syck_emitter_handler( emitter, rb_syck_output_handler );
@ -1298,15 +1292,15 @@ syck_emitter_new(argc, argv, class)
emitter->bonus = (void *)rb_str_new2( "" ); emitter->bonus = (void *)rb_str_new2( "" );
rb_scan_args(argc, argv, "01", &options); rb_scan_args(argc, argv, "01", &options);
pobj = Data_Wrap_Struct( class, syck_mark_emitter, syck_free_emitter, emitter ); pobj = Data_Wrap_Struct( class, syck_mark_emitter, syck_free_emitter, emitter );
if ( ! rb_obj_is_instance_of( options, rb_cHash ) ) if ( ! rb_obj_is_instance_of( options, rb_cHash ) )
{ {
options = rb_hash_new(); options = rb_hash_new();
} }
init_argv[0] = options; init_argv[0] = options;
rb_obj_call_init(pobj, 1, init_argv); rb_obj_call_init(pobj, 1, init_argv);
return pobj; return pobj;
} }
/* /*
@ -1317,7 +1311,7 @@ syck_emitter_initialize( self, options )
VALUE self, options; VALUE self, options;
{ {
rb_ivar_set(self, s_options, options); rb_ivar_set(self, s_options, options);
return self; return self;
} }
/* /*
@ -1329,7 +1323,7 @@ syck_emitter_level_m( self )
{ {
SyckEmitter *emitter; SyckEmitter *emitter;
Data_Get_Struct(self, SyckEmitter, emitter); Data_Get_Struct(self, SyckEmitter, emitter);
return LONG2NUM( emitter->level ); return LONG2NUM( emitter->level );
} }
@ -1342,7 +1336,7 @@ syck_emitter_flush_m( self )
{ {
SyckEmitter *emitter; SyckEmitter *emitter;
Data_Get_Struct(self, SyckEmitter, emitter); Data_Get_Struct(self, SyckEmitter, emitter);
syck_emitter_flush( emitter, 0 ); syck_emitter_flush( emitter, 0 );
return self; return self;
} }
@ -1356,7 +1350,7 @@ syck_emitter_write_m( self, str )
{ {
SyckEmitter *emitter; SyckEmitter *emitter;
Data_Get_Struct(self, SyckEmitter, emitter); Data_Get_Struct(self, SyckEmitter, emitter);
StringValue(str); StringValue(str);
syck_emitter_write( emitter, RSTRING(str)->ptr, RSTRING(str)->len ); syck_emitter_write( emitter, RSTRING(str)->ptr, RSTRING(str)->len );
return self; return self;
@ -1371,7 +1365,7 @@ syck_emitter_simple_write( self, str )
{ {
SyckEmitter *emitter; SyckEmitter *emitter;
Data_Get_Struct(self, SyckEmitter, emitter); Data_Get_Struct(self, SyckEmitter, emitter);
StringValue(str); StringValue(str);
syck_emitter_simple( emitter, RSTRING(str)->ptr, RSTRING(str)->len ); syck_emitter_simple( emitter, RSTRING(str)->ptr, RSTRING(str)->len );
return self; return self;
@ -1387,7 +1381,7 @@ syck_emitter_start_object( self, oid )
char *anchor_name; char *anchor_name;
SyckEmitter *emitter; SyckEmitter *emitter;
Data_Get_Struct(self, SyckEmitter, emitter); Data_Get_Struct(self, SyckEmitter, emitter);
anchor_name = syck_emitter_start_obj( emitter, oid ); anchor_name = syck_emitter_start_obj( emitter, oid );
if ( anchor_name == NULL ) if ( anchor_name == NULL )
@ -1407,7 +1401,7 @@ syck_emitter_end_object( self )
{ {
SyckEmitter *emitter; SyckEmitter *emitter;
Data_Get_Struct(self, SyckEmitter, emitter); Data_Get_Struct(self, SyckEmitter, emitter);
syck_emitter_end_obj( emitter ); syck_emitter_end_obj( emitter );
if ( emitter->level < 0 ) if ( emitter->level < 0 )
@ -1428,9 +1422,9 @@ Init_syck()
rb_define_const( rb_syck, "VERSION", rb_str_new2( SYCK_VERSION ) ); rb_define_const( rb_syck, "VERSION", rb_str_new2( SYCK_VERSION ) );
rb_define_module_function( rb_syck, "compile", rb_syck_compile, 1 ); rb_define_module_function( rb_syck, "compile", rb_syck_compile, 1 );
/* /*
* Global symbols * Global symbols
*/ */
s_new = rb_intern("new"); s_new = rb_intern("new");
s_utc = rb_intern("utc"); s_utc = rb_intern("utc");
s_at = rb_intern("at"); s_at = rb_intern("at");
@ -1442,13 +1436,13 @@ Init_syck()
s_transfer = rb_intern("transfer"); s_transfer = rb_intern("transfer");
s_call = rb_intern("call"); s_call = rb_intern("call");
s_cmp = rb_intern("<=>"); s_cmp = rb_intern("<=>");
s_update = rb_intern("update"); s_update = rb_intern("update");
s_dup = rb_intern("dup"); s_dup = rb_intern("dup");
s_default_set = rb_intern("default="); s_default_set = rb_intern("default=");
s_match = rb_intern("match"); s_match = rb_intern("match");
s_keys = rb_intern("keys"); s_keys = rb_intern("keys");
s_to_str = rb_intern("to_str"); s_to_str = rb_intern("to_str");
s_tr_bang = rb_intern("tr!"); s_tr_bang = rb_intern("tr!");
s_unpack = rb_intern("unpack"); s_unpack = rb_intern("unpack");
s_anchors = rb_intern("@anchors"); s_anchors = rb_intern("@anchors");
@ -1461,10 +1455,10 @@ Init_syck()
s_type_id = rb_intern("@type_id"); s_type_id = rb_intern("@type_id");
s_value = rb_intern("@value"); s_value = rb_intern("@value");
sym_model = ID2SYM(rb_intern("Model")); sym_model = ID2SYM(rb_intern("Model"));
sym_generic = ID2SYM(rb_intern("Generic")); sym_generic = ID2SYM(rb_intern("Generic"));
sym_input = ID2SYM(rb_intern("Input")); sym_input = ID2SYM(rb_intern("Input"));
sym_bytecode = ID2SYM(rb_intern("Bytecode")); sym_bytecode = ID2SYM(rb_intern("Bytecode"));
sym_map = ID2SYM(rb_intern("map")); sym_map = ID2SYM(rb_intern("map"));
sym_scalar = ID2SYM(rb_intern("scalar")); sym_scalar = ID2SYM(rb_intern("scalar"));
sym_seq = ID2SYM(rb_intern("seq")); sym_seq = ID2SYM(rb_intern("seq"));
@ -1494,7 +1488,7 @@ Init_syck()
*/ */
cParser = rb_define_class_under( rb_syck, "Parser", rb_cObject ); cParser = rb_define_class_under( rb_syck, "Parser", rb_cObject );
rb_define_attr( cParser, "options", 1, 1 ); rb_define_attr( cParser, "options", 1, 1 );
rb_define_singleton_method( cParser, "new", syck_parser_new, -1 ); rb_define_singleton_method( cParser, "new", syck_parser_new, -1 );
rb_define_method(cParser, "initialize", syck_parser_initialize, 1); rb_define_method(cParser, "initialize", syck_parser_initialize, 1);
rb_define_method(cParser, "load", syck_parser_load, -1); rb_define_method(cParser, "load", syck_parser_load, -1);
rb_define_method(cParser, "load_documents", syck_parser_load_documents, -1); rb_define_method(cParser, "load_documents", syck_parser_load_documents, -1);
@ -1536,21 +1530,21 @@ Init_syck()
rb_define_method( cBadAlias, "<=>", syck_badalias_cmp, 1); rb_define_method( cBadAlias, "<=>", syck_badalias_cmp, 1);
rb_include_module( cBadAlias, rb_const_get( rb_cObject, rb_intern("Comparable") ) ); rb_include_module( cBadAlias, rb_const_get( rb_cObject, rb_intern("Comparable") ) );
/* /*
* Define YAML::Syck::MergeKey class * Define YAML::Syck::MergeKey class
*/ */
cMergeKey = rb_define_class_under( rb_syck, "MergeKey", rb_cObject ); cMergeKey = rb_define_class_under( rb_syck, "MergeKey", rb_cObject );
/* /*
* Define YAML::Syck::DefaultKey class * Define YAML::Syck::DefaultKey class
*/ */
cDefaultKey = rb_define_class_under( rb_syck, "DefaultKey", rb_cObject ); cDefaultKey = rb_define_class_under( rb_syck, "DefaultKey", rb_cObject );
/* /*
* Define YAML::Syck::Emitter class * Define YAML::Syck::Emitter class
*/ */
cEmitter = rb_define_class_under( rb_syck, "Emitter", rb_cObject ); cEmitter = rb_define_class_under( rb_syck, "Emitter", rb_cObject );
rb_define_singleton_method( cEmitter, "new", syck_emitter_new, -1 ); rb_define_singleton_method( cEmitter, "new", syck_emitter_new, -1 );
rb_define_method( cEmitter, "initialize", syck_emitter_initialize, 1 ); rb_define_method( cEmitter, "initialize", syck_emitter_initialize, 1 );
rb_define_method( cEmitter, "level", syck_emitter_level_m, 0 ); rb_define_method( cEmitter, "level", syck_emitter_level_m, 0 );
rb_define_method( cEmitter, "write", syck_emitter_write_m, 1 ); rb_define_method( cEmitter, "write", syck_emitter_write_m, 1 );

View file

@ -84,6 +84,14 @@ enum map_part {
map_value map_value
}; };
enum scalar_style {
scalar_none,
scalar_plain,
scalar_1quote,
scalar_2quote,
scalar_block
};
/* /*
* Node metadata struct * Node metadata struct
*/ */
@ -112,6 +120,7 @@ struct _syck_node {
} *list; } *list;
/* Storage for string data */ /* Storage for string data */
struct SyckStr { struct SyckStr {
enum scalar_style style;
char *ptr; char *ptr;
long len; long len;
} *str; } *str;
@ -367,8 +376,8 @@ SyckNode *syck_alloc_seq();
SyckNode *syck_alloc_str(); SyckNode *syck_alloc_str();
void syck_free_node( SyckNode * ); void syck_free_node( SyckNode * );
void syck_free_members( SyckNode * ); void syck_free_members( SyckNode * );
SyckNode *syck_new_str( char * ); SyckNode *syck_new_str( char *, enum scalar_style );
SyckNode *syck_new_str2( char *, long ); SyckNode *syck_new_str2( char *, long, enum scalar_style );
void syck_str_blow_away_commas( SyckNode * ); void syck_str_blow_away_commas( SyckNode * );
char *syck_str_read( SyckNode * ); char *syck_str_read( SyckNode * );
SyckNode *syck_new_map( SYMID, SYMID ); SyckNode *syck_new_map( SYMID, SYMID );

View file

@ -1,4 +1,4 @@
/* Generated by re2c 0.5 on Tue Nov 25 12:10:28 2003 */ /* Generated by re2c 0.5 on Thu May 13 01:45:26 2004 */
#line 1 "token.re" #line 1 "token.re"
/* /*
* token.re * token.re
@ -122,6 +122,7 @@
YYCURSOR = YYTOKEN; \ YYCURSOR = YYTOKEN; \
n->data.str->ptr = qstr; \ n->data.str->ptr = qstr; \
n->data.str->len = qidx; \ n->data.str->len = qidx; \
n->data.str->style = scalar_plain; \
sycklval->nodeData = n; \ sycklval->nodeData = n; \
if ( parser->implicit_typing == 1 ) \ if ( parser->implicit_typing == 1 ) \
{ \ { \
@ -140,6 +141,7 @@
n->type_id = syck_strndup( "str", 3 ); \ n->type_id = syck_strndup( "str", 3 ); \
n->data.str->ptr = qstr; \ n->data.str->ptr = qstr; \
n->data.str->len = qidx; \ n->data.str->len = qidx; \
n->data.str->style = scalar_block; \
if ( qidx > 0 ) \ if ( qidx > 0 ) \
{ \ { \
if ( nlDoWhat != NL_KEEP ) \ if ( nlDoWhat != NL_KEEP ) \
@ -257,7 +259,7 @@ sycklex_yaml_utf8( YYSTYPE *sycklval, SyckParser *parser )
return t; return t;
} }
#line 276 #line 278
if ( YYLINEPTR != YYCURSOR ) if ( YYLINEPTR != YYCURSOR )
@ -294,7 +296,7 @@ yy2: yyaccept = 0;
default: goto yy3; default: goto yy3;
} }
yy3: yy3:
#line 335 #line 337
{ YYPOS(0); { YYPOS(0);
goto Document; goto Document;
} }
@ -306,13 +308,13 @@ yy4: yyaccept = 0;
} }
yy5: yych = *++YYCURSOR; yy5: yych = *++YYCURSOR;
yy6: yy6:
#line 317 #line 319
{ eat_comments( parser ); { eat_comments( parser );
goto Header; goto Header;
} }
yy7: yych = *++YYCURSOR; yy7: yych = *++YYCURSOR;
yy8: yy8:
#line 321 #line 323
{ SyckLevel *lvl = CURRENT_LEVEL(); { SyckLevel *lvl = CURRENT_LEVEL();
ENSURE_YAML_IEND(lvl, -1); ENSURE_YAML_IEND(lvl, -1);
YYPOS(0); YYPOS(0);
@ -322,7 +324,7 @@ yy9: yyaccept = 1;
yych = *(YYMARKER = ++YYCURSOR); yych = *(YYMARKER = ++YYCURSOR);
goto yy18; goto yy18;
yy10: yy10:
#line 327 #line 329
{ GOBBLE_UP_YAML_INDENT( doc_level, YYTOKEN ); { GOBBLE_UP_YAML_INDENT( doc_level, YYTOKEN );
goto Header; goto Header;
} }
@ -334,7 +336,7 @@ yy11: yych = *++YYCURSOR;
yy12: yych = *++YYCURSOR; yy12: yych = *++YYCURSOR;
goto yy16; goto yy16;
yy13: yy13:
#line 331 #line 333
{ doc_level = YYCURSOR - YYLINEPTR; { doc_level = YYCURSOR - YYLINEPTR;
goto Header; goto Header;
} }
@ -382,7 +384,7 @@ yy22: yych = *++YYCURSOR;
} }
yy23: yych = *++YYCURSOR; yy23: yych = *++YYCURSOR;
yy24: yy24:
#line 303 #line 305
{ SyckLevel *lvl = CURRENT_LEVEL(); { SyckLevel *lvl = CURRENT_LEVEL();
if ( lvl->status == syck_lvl_header ) if ( lvl->status == syck_lvl_header )
{ {
@ -422,7 +424,7 @@ yy29: yych = *++YYCURSOR;
} }
yy30: yych = *++YYCURSOR; yy30: yych = *++YYCURSOR;
yy31: yy31:
#line 289 #line 291
{ SyckLevel *lvl = CURRENT_LEVEL(); { SyckLevel *lvl = CURRENT_LEVEL();
if ( lvl->status == syck_lvl_header ) if ( lvl->status == syck_lvl_header )
{ {
@ -449,7 +451,7 @@ yy34: yych = *++YYCURSOR;
default: goto yy20; default: goto yy20;
} }
} }
#line 339 #line 341
Document: Document:
@ -492,7 +494,7 @@ yy37: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR); yych = *(YYMARKER = ++YYCURSOR);
goto yy90; goto yy90;
yy38: yy38:
#line 353 #line 355
{ /* Isolate spaces */ { /* Isolate spaces */
int indt_len; int indt_len;
GOBBLE_UP_YAML_INDENT( indt_len, YYTOKEN ); GOBBLE_UP_YAML_INDENT( indt_len, YYTOKEN );
@ -520,13 +522,13 @@ yy39: yych = *++YYCURSOR;
default: goto yy40; default: goto yy40;
} }
yy40: yy40:
#line 445 #line 447
{ ENSURE_YAML_IOPEN(lvl, doc_level, 1); { ENSURE_YAML_IOPEN(lvl, doc_level, 1);
goto Plain; goto Plain;
} }
yy41: yych = *++YYCURSOR; yy41: yych = *++YYCURSOR;
yy42: yy42:
#line 375 #line 377
{ ENSURE_YAML_IOPEN(lvl, doc_level, 1); { ENSURE_YAML_IOPEN(lvl, doc_level, 1);
lvl = CURRENT_LEVEL(); lvl = CURRENT_LEVEL();
ADD_LEVEL(lvl->spaces + 1, syck_lvl_inline); ADD_LEVEL(lvl->spaces + 1, syck_lvl_inline);
@ -534,7 +536,7 @@ yy42:
} }
yy43: yych = *++YYCURSOR; yy43: yych = *++YYCURSOR;
yy44: yy44:
#line 381 #line 383
{ POP_LEVEL(); { POP_LEVEL();
return YYTOKEN[0]; return YYTOKEN[0];
} }
@ -684,16 +686,16 @@ yy48: yych = *++YYCURSOR;
} }
yy49: yych = *++YYCURSOR; yy49: yych = *++YYCURSOR;
yy50: yy50:
#line 419 #line 421
{ goto TransferMethod; } { goto TransferMethod; }
yy51: yych = *++YYCURSOR; yy51: yych = *++YYCURSOR;
yy52: yy52:
#line 421 #line 423
{ ENSURE_YAML_IOPEN(lvl, doc_level, 1); { ENSURE_YAML_IOPEN(lvl, doc_level, 1);
goto SingleQuote; } goto SingleQuote; }
yy53: yych = *++YYCURSOR; yy53: yych = *++YYCURSOR;
yy54: yy54:
#line 424 #line 426
{ ENSURE_YAML_IOPEN(lvl, doc_level, 1); { ENSURE_YAML_IOPEN(lvl, doc_level, 1);
goto DoubleQuote; } goto DoubleQuote; }
yy55: yyaccept = 1; yy55: yyaccept = 1;
@ -716,18 +718,18 @@ yy55: yyaccept = 1;
} }
yy56: yych = *++YYCURSOR; yy56: yych = *++YYCURSOR;
yy57: yy57:
#line 434 #line 436
{ eat_comments( parser ); { eat_comments( parser );
goto Document; goto Document;
} }
yy58: yych = *++YYCURSOR; yy58: yych = *++YYCURSOR;
goto yy64; goto yy64;
yy59: yy59:
#line 438 #line 440
{ goto Document; } { goto Document; }
yy60: yych = *++YYCURSOR; yy60: yych = *++YYCURSOR;
yy61: yy61:
#line 440 #line 442
{ ENSURE_YAML_IEND(lvl, -1); { ENSURE_YAML_IEND(lvl, -1);
YYPOS(0); YYPOS(0);
return 0; return 0;
@ -767,7 +769,7 @@ yy67: YYCURSOR = YYMARKER;
} }
yy68: yych = *++YYCURSOR; yy68: yych = *++YYCURSOR;
yy69: yy69:
#line 427 #line 429
{ if ( is_newline( YYCURSOR - 1 ) ) { if ( is_newline( YYCURSOR - 1 ) )
{ {
YYCURSOR--; YYCURSOR--;
@ -853,7 +855,7 @@ yy74: switch(yych){
default: goto yy75; default: goto yy75;
} }
yy75: yy75:
#line 414 #line 416
{ ENSURE_YAML_IOPEN(lvl, doc_level, 1); { ENSURE_YAML_IOPEN(lvl, doc_level, 1);
sycklval->name = syck_strndup( YYTOKEN + 1, YYCURSOR - YYTOKEN - 1 ); sycklval->name = syck_strndup( YYTOKEN + 1, YYCURSOR - YYTOKEN - 1 );
return YAML_ALIAS; return YAML_ALIAS;
@ -925,7 +927,7 @@ yy77: switch(yych){
default: goto yy78; default: goto yy78;
} }
yy78: yy78:
#line 403 #line 405
{ sycklval->name = syck_strndup( YYTOKEN + 1, YYCURSOR - YYTOKEN - 1 ); { sycklval->name = syck_strndup( YYTOKEN + 1, YYCURSOR - YYTOKEN - 1 );
/* /*
@ -938,7 +940,7 @@ yy78:
} }
yy79: yych = *++YYCURSOR; yy79: yych = *++YYCURSOR;
yy80: yy80:
#line 389 #line 391
{ ENSURE_YAML_IOPEN(lvl, YYTOKEN - YYLINEPTR, 1); { ENSURE_YAML_IOPEN(lvl, YYTOKEN - YYLINEPTR, 1);
FORCE_NEXT_TOKEN(YAML_IOPEN); FORCE_NEXT_TOKEN(YAML_IOPEN);
if ( is_newline( YYCURSOR ) || is_newline( YYCURSOR - 1 ) ) if ( is_newline( YYCURSOR ) || is_newline( YYCURSOR - 1 ) )
@ -966,7 +968,7 @@ yy83: yych = *++YYCURSOR;
} }
yy84: yych = *++YYCURSOR; yy84: yych = *++YYCURSOR;
yy85: yy85:
#line 385 #line 387
{ YYPOS(1); { YYPOS(1);
return YYTOKEN[0]; return YYTOKEN[0];
} }
@ -999,7 +1001,7 @@ yy91: ++YYCURSOR;
default: goto yy67; default: goto yy67;
} }
} }
#line 449 #line 451
} }
@ -1106,14 +1108,14 @@ yy95: yyaccept = 0;
default: goto yy96; default: goto yy96;
} }
yy96: yy96:
#line 462 #line 464
{ YYCURSOR = YYTOKTMP; { YYCURSOR = YYTOKTMP;
return YAML_DOCSEP; return YAML_DOCSEP;
} }
yy97: yych = *++YYCURSOR; yy97: yych = *++YYCURSOR;
goto yy101; goto yy101;
yy98: yy98:
#line 460 #line 462
{ goto Directive; } { goto Directive; }
yy99: yych = *++YYCURSOR; yy99: yych = *++YYCURSOR;
goto yy96; goto yy96;
@ -1365,10 +1367,10 @@ yy106: switch(yych){
default: goto yy107; default: goto yy107;
} }
yy107: yy107:
#line 458 #line 460
{ goto Directive; } { goto Directive; }
} }
#line 465 #line 467
} }
@ -1412,7 +1414,7 @@ yy110: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR); yych = *(YYMARKER = ++YYCURSOR);
goto yy136; goto yy136;
yy111: yy111:
#line 488 #line 490
{ int indt_len, nl_count = 0; { int indt_len, nl_count = 0;
SyckLevel *lvl; SyckLevel *lvl;
char *tok = YYTOKEN; char *tok = YYTOKEN;
@ -1450,7 +1452,7 @@ yy112: yych = *++YYCURSOR;
default: goto yy113; default: goto yy113;
} }
yy113: yy113:
#line 542 #line 544
{ QUOTECATS(qstr, qcapa, qidx, YYTOKEN, YYCURSOR - YYTOKEN); { QUOTECATS(qstr, qcapa, qidx, YYTOKEN, YYCURSOR - YYTOKEN);
goto Plain2; goto Plain2;
} }
@ -1464,7 +1466,7 @@ yy114: yyaccept = 1;
} }
yy115: yych = *++YYCURSOR; yy115: yych = *++YYCURSOR;
yy116: yy116:
#line 522 #line 524
{ if ( plvl->status != syck_lvl_inline ) { if ( plvl->status != syck_lvl_inline )
{ {
if ( *(YYCURSOR - 1) == ' ' || is_newline( YYCURSOR - 1 ) ) if ( *(YYCURSOR - 1) == ' ' || is_newline( YYCURSOR - 1 ) )
@ -1490,17 +1492,17 @@ yy118: yych = *++YYCURSOR;
default: goto yy119; default: goto yy119;
} }
yy119: yy119:
#line 540 #line 542
{ goto Plain3; } { goto Plain3; }
yy120: yych = *++YYCURSOR; yy120: yych = *++YYCURSOR;
yy121: yy121:
#line 538 #line 540
{ RETURN_IMPLICIT(); } { RETURN_IMPLICIT(); }
yy122: yych = *++YYCURSOR; yy122: yych = *++YYCURSOR;
goto yy113; goto yy113;
yy123: yych = *++YYCURSOR; yy123: yych = *++YYCURSOR;
yy124: yy124:
#line 534 #line 536
{ eat_comments( parser ); { eat_comments( parser );
RETURN_IMPLICIT(); RETURN_IMPLICIT();
} }
@ -1525,7 +1527,7 @@ yy129: YYCURSOR = YYMARKER;
} }
yy130: yych = *++YYCURSOR; yy130: yych = *++YYCURSOR;
yy131: yy131:
#line 520 #line 522
{ RETURN_IMPLICIT(); } { RETURN_IMPLICIT(); }
yy132: ++YYCURSOR; yy132: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1); if(YYLIMIT == YYCURSOR) YYFILL(1);
@ -1556,7 +1558,7 @@ yy137: ++YYCURSOR;
default: goto yy129; default: goto yy129;
} }
} }
#line 546 #line 548
} }
@ -1588,7 +1590,7 @@ yy140: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR); yych = *(YYMARKER = ++YYCURSOR);
goto yy151; goto yy151;
yy141: yy141:
#line 560 #line 562
{ int indt_len; { int indt_len;
int nl_count = 0; int nl_count = 0;
SyckLevel *lvl; SyckLevel *lvl;
@ -1630,7 +1632,7 @@ yy142: yych = *++YYCURSOR;
default: goto yy143; default: goto yy143;
} }
yy143: yy143:
#line 615 #line 618
{ QUOTECAT(qstr, qcapa, qidx, *(YYCURSOR - 1)); { QUOTECAT(qstr, qcapa, qidx, *(YYCURSOR - 1));
goto SingleQuote2; goto SingleQuote2;
} }
@ -1640,7 +1642,7 @@ yy144: yych = *++YYCURSOR;
default: goto yy145; default: goto yy145;
} }
yy145: yy145:
#line 600 #line 602
{ SyckLevel *lvl; { SyckLevel *lvl;
SyckNode *n = syck_alloc_str(); SyckNode *n = syck_alloc_str();
lvl = CURRENT_LEVEL(); lvl = CURRENT_LEVEL();
@ -1652,6 +1654,7 @@ yy145:
n->type_id = syck_strndup( "str", 3 ); n->type_id = syck_strndup( "str", 3 );
n->data.str->ptr = qstr; n->data.str->ptr = qstr;
n->data.str->len = qidx; n->data.str->len = qidx;
n->data.str->style = scalar_1quote;
sycklval->nodeData = n; sycklval->nodeData = n;
return YAML_PLAIN; return YAML_PLAIN;
} }
@ -1661,7 +1664,7 @@ yy147: yych = *++YYCURSOR;
goto yy143; goto yy143;
yy148: yych = *++YYCURSOR; yy148: yych = *++YYCURSOR;
yy149: yy149:
#line 596 #line 598
{ QUOTECAT(qstr, qcapa, qidx, '\''); { QUOTECAT(qstr, qcapa, qidx, '\'');
goto SingleQuote2; goto SingleQuote2;
} }
@ -1686,7 +1689,7 @@ yy153: YYCURSOR = YYMARKER;
case 0: goto yy141; case 0: goto yy141;
} }
} }
#line 619 #line 622
} }
@ -1723,7 +1726,7 @@ yy156: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR); yych = *(YYMARKER = ++YYCURSOR);
goto yy178; goto yy178;
yy157: yy157:
#line 637 #line 640
{ int indt_len; { int indt_len;
int nl_count = 0; int nl_count = 0;
SyckLevel *lvl; SyckLevel *lvl;
@ -1769,7 +1772,7 @@ yy158: yych = *++YYCURSOR;
default: goto yy159; default: goto yy159;
} }
yy159: yy159:
#line 711 #line 715
{ QUOTECAT(qstr, qcapa, qidx, *(YYCURSOR - 1)); { QUOTECAT(qstr, qcapa, qidx, *(YYCURSOR - 1));
goto DoubleQuote2; goto DoubleQuote2;
} }
@ -1787,7 +1790,7 @@ yy160: yyaccept = 1;
} }
yy161: yych = *++YYCURSOR; yy161: yych = *++YYCURSOR;
yy162: yy162:
#line 696 #line 699
{ SyckLevel *lvl; { SyckLevel *lvl;
SyckNode *n = syck_alloc_str(); SyckNode *n = syck_alloc_str();
lvl = CURRENT_LEVEL(); lvl = CURRENT_LEVEL();
@ -1799,6 +1802,7 @@ yy162:
n->type_id = syck_strndup( "str", 3 ); n->type_id = syck_strndup( "str", 3 );
n->data.str->ptr = qstr; n->data.str->ptr = qstr;
n->data.str->len = qidx; n->data.str->len = qidx;
n->data.str->style = scalar_2quote;
sycklval->nodeData = n; sycklval->nodeData = n;
return YAML_PLAIN; return YAML_PLAIN;
} }
@ -1822,7 +1826,7 @@ yy167: YYCURSOR = YYMARKER;
} }
yy168: yych = *++YYCURSOR; yy168: yych = *++YYCURSOR;
yy169: yy169:
#line 691 #line 694
{ keep_nl = 0; { keep_nl = 0;
YYCURSOR--; YYCURSOR--;
goto DoubleQuote2; goto DoubleQuote2;
@ -1858,7 +1862,7 @@ yy171: yych = *++YYCURSOR;
} }
yy172: yych = *++YYCURSOR; yy172: yych = *++YYCURSOR;
yy173: yy173:
#line 677 #line 680
{ char ch = *( YYCURSOR - 1 ); { char ch = *( YYCURSOR - 1 );
QUOTECAT(qstr, qcapa, qidx, escape_seq( ch )); QUOTECAT(qstr, qcapa, qidx, escape_seq( ch ));
goto DoubleQuote2; goto DoubleQuote2;
@ -1889,7 +1893,7 @@ yy174: yych = *++YYCURSOR;
} }
yy175: yych = *++YYCURSOR; yy175: yych = *++YYCURSOR;
yy176: yy176:
#line 682 #line 685
{ long ch; { long ch;
char *chr_text = syck_strndup( YYTOKEN, 4 ); char *chr_text = syck_strndup( YYTOKEN, 4 );
chr_text[0] = '0'; chr_text[0] = '0';
@ -1915,7 +1919,7 @@ yy179: ++YYCURSOR;
default: goto yy167; default: goto yy167;
} }
} }
#line 715 #line 719
} }
@ -1950,7 +1954,7 @@ yy182: YYCURSOR = YYMARKER;
} }
yy183: yych = *++YYCURSOR; yy183: yych = *++YYCURSOR;
yy184: yy184:
#line 729 #line 733
{ SyckLevel *lvl; { SyckLevel *lvl;
YYCURSOR = YYTOKTMP; YYCURSOR = YYTOKTMP;
if ( YYCURSOR == YYTOKEN + 1 ) if ( YYCURSOR == YYTOKEN + 1 )
@ -2008,7 +2012,7 @@ yy186: yych = *++YYCURSOR;
default: goto yy187; default: goto yy187;
} }
yy187: yy187:
#line 796 #line 800
{ QUOTECAT(qstr, qcapa, qidx, *(YYCURSOR - 1)); { QUOTECAT(qstr, qcapa, qidx, *(YYCURSOR - 1));
goto TransferMethod2; goto TransferMethod2;
} }
@ -2049,7 +2053,7 @@ yy190: yych = *++YYCURSOR;
} }
yy191: yych = *++YYCURSOR; yy191: yych = *++YYCURSOR;
yy192: yy192:
#line 782 #line 786
{ char ch = *( YYCURSOR - 1 ); { char ch = *( YYCURSOR - 1 );
QUOTECAT(qstr, qcapa, qidx, escape_seq( ch )); QUOTECAT(qstr, qcapa, qidx, escape_seq( ch ));
goto TransferMethod2; goto TransferMethod2;
@ -2080,7 +2084,7 @@ yy193: yych = *++YYCURSOR;
} }
yy194: yych = *++YYCURSOR; yy194: yych = *++YYCURSOR;
yy195: yy195:
#line 787 #line 791
{ long ch; { long ch;
char *chr_text = syck_strndup( YYTOKTMP, 4 ); char *chr_text = syck_strndup( YYTOKTMP, 4 );
chr_text[0] = '0'; chr_text[0] = '0';
@ -2099,7 +2103,7 @@ yy198: switch(yych){
default: goto yy184; default: goto yy184;
} }
} }
#line 801 #line 805
} }
@ -2165,7 +2169,7 @@ yy201: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR); yych = *(YYMARKER = ++YYCURSOR);
goto yy220; goto yy220;
yy202: yy202:
#line 848 #line 852
{ char *pacer; { char *pacer;
char *tok = YYTOKEN; char *tok = YYTOKEN;
int indt_len = 0, nl_count = 0, fold_nl = 0, nl_begin = 0; int indt_len = 0, nl_count = 0, fold_nl = 0, nl_begin = 0;
@ -2237,13 +2241,13 @@ yy203: yych = *++YYCURSOR;
default: goto yy204; default: goto yy204;
} }
yy204: yy204:
#line 953 #line 957
{ QUOTECAT(qstr, qcapa, qidx, *YYTOKEN); { QUOTECAT(qstr, qcapa, qidx, *YYTOKEN);
goto ScalarBlock2; goto ScalarBlock2;
} }
yy205: yych = *++YYCURSOR; yy205: yych = *++YYCURSOR;
yy206: yy206:
#line 915 #line 919
{ lvl = CURRENT_LEVEL(); { lvl = CURRENT_LEVEL();
if ( lvl->status != syck_lvl_block ) if ( lvl->status != syck_lvl_block )
{ {
@ -2258,7 +2262,7 @@ yy206:
} }
yy207: yych = *++YYCURSOR; yy207: yych = *++YYCURSOR;
yy208: yy208:
#line 929 #line 933
{ YYCURSOR--; { YYCURSOR--;
POP_LEVEL(); POP_LEVEL();
RETURN_YAML_BLOCK(); RETURN_YAML_BLOCK();
@ -2290,7 +2294,7 @@ yy213: yych = *++YYCURSOR;
} }
yy214: yych = *++YYCURSOR; yy214: yych = *++YYCURSOR;
yy215: yy215:
#line 934 #line 938
{ if ( YYTOKEN == YYLINEPTR ) { if ( YYTOKEN == YYLINEPTR )
{ {
if ( blockType == BLOCK_FOLD ) if ( blockType == BLOCK_FOLD )
@ -2338,7 +2342,7 @@ yy221: ++YYCURSOR;
default: goto yy212; default: goto yy212;
} }
} }
#line 958 #line 962
} }
@ -2369,7 +2373,7 @@ yy222:
} }
yy224: yych = *++YYCURSOR; yy224: yych = *++YYCURSOR;
yy225: yy225:
#line 974 #line 978
{ YYCURSOR = YYTOKEN; { YYCURSOR = YYTOKEN;
return; return;
} }
@ -2382,7 +2386,7 @@ yy227: yych = *++YYCURSOR;
default: goto yy228; default: goto yy228;
} }
yy228: yy228:
#line 978 #line 982
{ goto Comment; { goto Comment;
} }
yy229: yych = *++YYCURSOR; yy229: yych = *++YYCURSOR;
@ -2408,7 +2412,7 @@ yy233: YYCURSOR = YYMARKER;
case 0: goto yy225; case 0: goto yy225;
} }
} }
#line 981 #line 985
} }

View file

@ -5,21 +5,12 @@
# #
# Loads the parser/loader and emitter/writer. # Loads the parser/loader and emitter/writer.
# #
module YAML module YAML
begin require 'yaml/syck'
require 'yaml/syck' @@parser = YAML::Syck::Parser
@@parser = YAML::Syck::Parser @@loader = YAML::Syck::DefaultLoader
@@loader = YAML::Syck::DefaultLoader @@emitter = YAML::Syck::Emitter
@@emitter = YAML::Syck::Emitter
rescue LoadError
require 'yaml/parser'
@@parser = YAML::Parser
@@loader = YAML::DefaultLoader
require 'yaml/emitter'
@@emitter = YAML::Emitter
end
require 'yaml/loader' require 'yaml/loader'
require 'yaml/stream' require 'yaml/stream'
@ -148,7 +139,7 @@ module YAML
end end
# #
# Method to extract colon-separated type and class, returning # Method to extract colon-seperated type and class, returning
# the type and the constant of the class # the type and the constant of the class
# #
def YAML.read_type_class( type, obj_class ) def YAML.read_type_class( type, obj_class )
@ -160,20 +151,12 @@ module YAML
# #
# Allocate blank object # Allocate blank object
# #
def YAML.object_maker( obj_class, val, is_attr = false ) def YAML.object_maker( obj_class, val )
if Hash === val if Hash === val
# name = obj_class.name
# ostr = sprintf( "%c%co:%c%s\000", ::Marshal::MAJOR_VERSION, ::Marshal::MINOR_VERSION,
# name.length + 5, name )
# if is_attr
# ostr[ -1, 1 ] = ::Marshal.dump( val ).sub( /^[^{]+\{/, '' )
# end
o = obj_class.allocate o = obj_class.allocate
unless is_attr val.each_pair { |k,v|
val.each_pair { |k,v| o.instance_variable_set("@#{k}", v)
o.instance_variable_set("@#{k}", v) }
}
end
o o
else else
raise YAML::Error, "Invalid object explicitly tagged !ruby/Object: " + val.inspect raise YAML::Error, "Invalid object explicitly tagged !ruby/Object: " + val.inspect

View file

@ -30,114 +30,121 @@ module YAML
self.node_text( [value].pack("m"), '|' ) self.node_text( [value].pack("m"), '|' )
end end
# #
# Emit plain, normal flowing text # Emit plain, normal flowing text
# #
def node_text( value, block = '>' ) def node_text( value, block = '>' )
@seq_map = false @seq_map = false
valx = value.dup valx = value.dup
unless block unless block
block = block =
if options(:UseBlock) if options(:UseBlock)
'|' '|'
elsif not options(:UseFold) and valx =~ /\n[ \t]/ and not valx =~ /#{YAML::ESCAPE_CHAR}/ elsif not options(:UseFold) and valx =~ /\n[ \t]/ and not valx =~ /#{YAML::ESCAPE_CHAR}/
'|' '|'
else else
'>' '>'
end end
block +=
if valx =~ /\n\Z\n/
"+"
elsif valx =~ /\Z\n/
""
else
"-"
end
if valx =~ /\A[ \t#]/ if valx =~ /\A[ \t#]/
block += options(:Indent).to_s block += options(:Indent).to_s
end end
block +=
if valx =~ /\n\Z\n/
"+"
elsif valx =~ /\Z\n/
""
else
"-"
end
end
if valx =~ /#{YAML::ESCAPE_CHAR}/
valx = YAML::escape( valx )
end
if block[0] == ?>
valx = fold( valx )
end end
if valx =~ /#{YAML::ESCAPE_CHAR}/
valx = YAML::escape( valx )
end
if block[0] == ?>
valx = fold( valx )
end
indt = nil indt = nil
indt = $&.to_i if block =~ /\d+/ indt = $&.to_i if block =~ /\d+/
self << block + indent_text( valx, indt ) + "\n" self << block + indent_text( valx, indt ) + "\n"
end end
# #
# Emit a simple, unqouted string # Emit a simple, unqouted string
# #
def simple( value ) def simple( value )
@seq_map = false @seq_map = false
self << value.to_s self << value.to_s
end end
# #
# Emit double-quoted string # Emit double-quoted string
# #
def double( value ) def double( value )
"\"#{YAML.escape( value )}\"" "\"#{YAML.escape( value )}\""
end end
# #
# Emit single-quoted string # Emit single-quoted string
# #
def single( value ) def single( value )
"'#{value}'" "'#{value}'"
end end
# #
# Write a text block with the current indent # Write a text block with the current indent
# #
def indent_text( text, indt = nil ) def indent_text( text, indt = nil )
return "" if text.to_s.empty? return "" if text.to_s.empty?
spacing = " " * ( level * ( indt || options(:Indent) ) ) indt ||= 0
return "\n" + text.gsub( /^([^\n])/, "#{spacing}\\1" ) spacing = indent( indt )
end return "\n" + text.gsub( /^([^\n])/, "#{spacing}\\1" )
end
# #
# Write a current indent # Write a current indent
# #
def indent def indent( mod = nil )
#p [ self.id, @level, :INDENT ] #p [ self.id, @level, :INDENT ]
return " " * ( level * options(:Indent) ) if level.zero?
end mod ||= 0
else
mod ||= options(:Indent)
mod += ( level - 1 ) * options(:Indent)
end
return " " * mod
end
# #
# Add indent to the buffer # Add indent to the buffer
# #
def indent! def indent!
self << indent self << indent
end end
# #
# Folding paragraphs within a column # Folding paragraphs within a column
# #
def fold( value ) def fold( value )
value.gsub!( /\A\n+/, '' ) value.gsub!( /\A\n+/, '' )
folded = $&.to_s folded = $&.to_s
width = (0..options(:BestWidth)) width = (0..options(:BestWidth))
while not value.empty? while not value.empty?
last = value.index( /(\n+)/ ) last = value.index( /(\n+)/ )
chop_s = false chop_s = false
if width.include?( last ) if width.include?( last )
last += $1.length - 1 last += $1.length - 1
elsif width.include?( value.length ) elsif width.include?( value.length )
last = value.length last = value.length
else else
last = value.rindex( /[ \t]/, options(:BestWidth) ) last = value.rindex( /[ \t]/, options(:BestWidth) )
chop_s = true chop_s = true
end end
folded += value.slice!( 0, width.include?( last ) ? last + 1 : options(:BestWidth) ) folded += value.slice!( 0, width.include?( last ) ? last + 1 : options(:BestWidth) )
folded.chop! if chop_s folded.chop! if chop_s
folded += "\n" unless value.empty? folded += "\n" unless value.empty?
end end
folded folded
end end
# #
# Quick mapping # Quick mapping
@ -145,18 +152,18 @@ module YAML
def map( type, &e ) def map( type, &e )
val = Mapping.new val = Mapping.new
e.call( val ) e.call( val )
self << "#{type} " if type.length.nonzero? self << "#{type} " if type.length.nonzero?
# #
# Empty hashes # Empty hashes
# #
if val.length.zero? if val.length.zero?
self << "{}" self << "{}"
@seq_map = false @seq_map = false
else else
# FIXME # FIXME
# if @buffer.length == 1 and options(:UseHeader) == false and type.length.zero? # if @buffer.length == 1 and options(:UseHeader) == false and type.length.zero?
# @headless = 1 # @headless = 1
# end # end
defkey = @options.delete( :DefaultKey ) defkey = @options.delete( :DefaultKey )
@ -166,9 +173,9 @@ module YAML
defkey.to_yaml( :Emitter => self ) defkey.to_yaml( :Emitter => self )
end end
# #
# Emit the key and value # Emit the key and value
# #
val.each { |v| val.each { |v|
seq_map_shortcut seq_map_shortcut
if v[0].is_complex_yaml? if v[0].is_complex_yaml?
@ -182,7 +189,7 @@ module YAML
self << ": " self << ": "
v[1].to_yaml( :Emitter => self ) v[1].to_yaml( :Emitter => self )
} }
end end
end end
def seq_map_shortcut def seq_map_shortcut
@ -203,22 +210,22 @@ module YAML
@seq_map = false @seq_map = false
val = Sequence.new val = Sequence.new
e.call( val ) e.call( val )
self << "#{type} " if type.length.nonzero? self << "#{type} " if type.length.nonzero?
# #
# Empty arrays # Empty arrays
# #
if val.length.zero? if val.length.zero?
self << "[]" self << "[]"
else else
# FIXME # FIXME
# if @buffer.length == 1 and options(:UseHeader) == false and type.length.zero? # if @buffer.length == 1 and options(:UseHeader) == false and type.length.zero?
# @headless = 1 # @headless = 1
# end # end
# #
# Emit the key and value # Emit the key and value
# #
val.each { |v| val.each { |v|
self << "\n" self << "\n"
indent! indent!
@ -226,7 +233,7 @@ module YAML
@seq_map = true if v.class == Hash @seq_map = true if v.class == Hash
v.to_yaml( :Emitter => self ) v.to_yaml( :Emitter => self )
} }
end end
end end
end end

View file

@ -290,7 +290,7 @@ class String
( self.count( "^ -~", "^\r\n" ) / self.size > 0.3 || self.count( "\x00" ) > 0 ) ( self.count( "^ -~", "^\r\n" ) / self.size > 0.3 || self.count( "\x00" ) > 0 )
end end
def to_yaml_type def to_yaml_type
"!ruby/string#{ if self.class != ::String; ":#{ self.class }"; end }" "!ruby/string#{ ":#{ self.class }" if self.class != ::String }"
end end
def to_yaml_fold def to_yaml_fold
nil nil
@ -315,8 +315,8 @@ class String
} }
elsif self.is_binary_data? elsif self.is_binary_data?
out.binary_base64( self ) out.binary_base64( self )
elsif self =~ /^ |#{YAML::ESCAPE_CHAR}| $/ # elsif self =~ /^ |#{YAML::ESCAPE_CHAR}| $/
complex = false # complex = false
else else
out.node_text( self, to_yaml_fold ) out.node_text( self, to_yaml_fold )
end end
@ -326,7 +326,7 @@ class String
self self
elsif empty? elsif empty?
"''" "''"
elsif self =~ /^[^#{YAML::WORD_CHAR}]| \#|#{YAML::ESCAPE_CHAR}|[#{YAML::SPACE_INDICATORS}]( |$)| $|\n|\'/ elsif self =~ /^[^#{YAML::WORD_CHAR}\/]| \#|#{YAML::ESCAPE_CHAR}|[#{YAML::SPACE_INDICATORS}]( |$)| $|\n|\'/
"\"#{YAML.escape( self )}\"" "\"#{YAML.escape( self )}\""
elsif YAML.detect_implicit( self ) != 'str' elsif YAML.detect_implicit( self ) != 'str'
"\"#{YAML.escape( self )}\"" "\"#{YAML.escape( self )}\""

View file

@ -1045,8 +1045,8 @@ EOY
assert_parse_only( assert_parse_only(
[ /bozo$/i ], <<EOY [ /bozo$/i ], <<EOY
- !perl/regexp: - !perl/regexp:
REGEXP: bozo$ regexp: bozo$
MODIFIERS: i mods: i
EOY EOY
) )
end end