diff options
author | why <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-09-20 06:50:20 +0000 |
---|---|---|
committer | why <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-09-20 06:50:20 +0000 |
commit | d578f9d32e4c13df9ebf51873ae335c5e5a795ce (patch) | |
tree | defcbbf25c171d2ef655ea1e0e2df426491ab91e /ext/syck/emitter.c | |
parent | 34b3f481dc2e92aaf477f4ec49a0b3bf0274bbf1 (diff) | |
download | ruby-d578f9d32e4c13df9ebf51873ae335c5e5a795ce.tar.gz |
* ext/syck/emitter.c (syck_scan_scalar): prevent indicators from
appearing alone or at the end of plain scalars. [ruby-core:5826]
* ext/syck/emitter.c (syck_emit_scalar): treat typed scalar nodes
as complex keys.
* lib/syck.h: version 0.60.
* lib/yaml/basenode.rb (YAML::BaseNode#at): transform keys during
key searches.
* ext/syck/rubyext.c: loading of binary-typed nodes. prevent
emission of plain strings that look like symbols, but which aren't.
* ext/syck/emitter.c (syck_emit): passing an int* value to the
long* parameter causes unaligned access on LP64 systems.
[ruby-dev:27161]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9242 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/syck/emitter.c')
-rw-r--r-- | ext/syck/emitter.c | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/ext/syck/emitter.c b/ext/syck/emitter.c index 6a5e43c9ee..f5de4b841a 100644 --- a/ext/syck/emitter.c +++ b/ext/syck/emitter.c @@ -359,7 +359,8 @@ syck_emit( SyckEmitter *e, st_data_t n ) { SYMID oid; char *anchor_name = NULL; - int indent = 0, x = 0; + int indent = 0; + long x = 0; SyckLevel *lvl = syck_emitter_current_level( e ); /* @@ -559,7 +560,8 @@ syck_scan_scalar( int req_width, char *cursor, long len ) } if ( ( cursor[0] == '-' || cursor[0] == ':' || cursor[0] == '?' || cursor[0] == ',' ) && - cursor[1] == ' ' ) { + ( cursor[1] == ' ' || cursor[1] == '\n' || len == 1 ) ) + { flags |= SCAN_INDIC_S; } @@ -618,11 +620,13 @@ syck_scan_scalar( int req_width, char *cursor, long len ) } /* 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] == ':' && + ( cursor[i+1] == ' ' || cursor[i+1] == '\n' || i == len - 1 ) ) ) { flags |= SCAN_INDIC_C; } - else if ( cursor[i] == ',' && cursor[i+1] == ' ' ) + else if ( cursor[i] == ',' && + ( cursor[i+1] == ' ' || cursor[i+1] == '\n' || i == len - 1 ) ) { flags |= SCAN_FLOWMAP; flags |= SCAN_FLOWSEQ; @@ -642,7 +646,7 @@ void syck_emit_scalar( SyckEmitter *e, char *tag, enum scalar_style force_style, enum scalar_style favor_style = scalar_literal; SyckLevel *parent = syck_emitter_parent_level( e ); SyckLevel *lvl = syck_emitter_current_level( e ); - int scan; + int scan = 0; char *implicit; if ( str == NULL ) str = ""; @@ -663,6 +667,14 @@ void syck_emit_scalar( SyckEmitter *e, char *tag, enum scalar_style force_style, 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 ); @@ -710,7 +722,7 @@ void syck_emit_scalar( SyckEmitter *e, char *tag, enum scalar_style force_style, } /* For now, all ambiguous keys are going to be double-quoted */ - if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 ) { + if ( ( parent->status == syck_lvl_map || parent->status == syck_lvl_mapx ) && parent->ncount % 2 == 1 ) { if ( force_style != scalar_plain ) { force_style = scalar_2quote; } @@ -737,6 +749,7 @@ void syck_emit_scalar( SyckEmitter *e, char *tag, enum scalar_style force_style, syck_emit_1quoted( e, force_width, str, len ); break; + case scalar_none: case scalar_2quote: syck_emit_2quoted( e, force_width, str, len ); break; @@ -753,6 +766,11 @@ void syck_emit_scalar( SyckEmitter *e, char *tag, enum scalar_style force_style, syck_emitter_write( e, str, len ); break; } + + if ( parent->status == syck_lvl_mapx ) + { + syck_emitter_write( e, "\n", 1 ); + } } void @@ -1122,6 +1140,8 @@ void syck_emit_item( SyckEmitter *e, st_data_t n ) } } break; + + default: break; } lvl->ncount++; @@ -1162,6 +1182,8 @@ void syck_emit_end( SyckEmitter *e ) case syck_lvl_imap: syck_emitter_write( e, "}\n", 1 ); break; + + default: break; } } |