diff options
author | why <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-06-17 16:55:54 +0000 |
---|---|---|
committer | why <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-06-17 16:55:54 +0000 |
commit | ae28f1b6b3b22afb529f599385d1f2af258624e9 (patch) | |
tree | 718fc605c85aa7d3c2b05fbfbc46c41320b74db9 /ext/syck/handler.c | |
parent | 77e941269fcddc8f5af6e553592fc3ef0132727c (diff) | |
download | ruby-ae28f1b6b3b22afb529f599385d1f2af258624e9.tar.gz |
* ext/syck/gram.c: added grammar for certain empty sequence entries.
* ext/syck/handler.c, ext/syck/syck.c, ext/syck/syck.h: track bad anchors.
* ext/syck/token.c: added pause token, tag possible circular references.
* lib/yaml/rubytypes.rb: parsing YMD time as Date instance.
* ext/syck/rubyext.c: ditto. DomainType, PrivateType, BadAlias classes.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3954 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/syck/handler.c')
-rw-r--r-- | ext/syck/handler.c | 59 |
1 files changed, 49 insertions, 10 deletions
diff --git a/ext/syck/handler.c b/ext/syck/handler.c index d5a4895c5e..aba6a628ff 100644 --- a/ext/syck/handler.c +++ b/ext/syck/handler.c @@ -31,6 +31,18 @@ SyckNode * syck_hdlr_add_anchor( SyckParser *p, char *a, SyckNode *n ) { n->anchor = a; + if ( p->bad_anchors != NULL ) + { + SyckNode *bad; + if ( st_lookup( p->bad_anchors, (st_data_t)a, (st_data_t *)&bad ) ) + { + if ( n->kind != syck_str_kind ) + { + n->id = bad->id; + (p->handler)( p, n ); + } + } + } if ( p->anchors == NULL ) { p->anchors = st_init_strtable(); @@ -39,23 +51,50 @@ syck_hdlr_add_anchor( SyckParser *p, char *a, SyckNode *n ) return n; } +void +syck_hdlr_remove_anchor( SyckParser *p, char *a ) +{ + if ( p->anchors == NULL ) + { + p->anchors = st_init_strtable(); + } + st_insert( p->anchors, (st_data_t)a, (st_data_t)1 ); +} + SyckNode * -syck_hdlr_add_alias( SyckParser *p, char *a ) +syck_hdlr_get_anchor( SyckParser *p, char *a ) { - SyckNode *n; + SyckNode *n = NULL; if ( p->anchors != NULL ) { - if ( st_lookup( p->anchors, (st_data_t)a, (st_data_t *)&n ) ) - { - return n; - } + if ( st_lookup( p->anchors, (st_data_t)a, (st_data_t *)&n ) ) + { + if ( n != (void *)1 ) + { + return n; + } + else + { + if ( p->bad_anchors == NULL ) + { + p->bad_anchors = st_init_strtable(); + } + if ( ! st_lookup( p->bad_anchors, (st_data_t)a, (st_data_t *)&n ) ) + { + n = (p->bad_anchor_handler)( p, a ); + st_insert( p->bad_anchors, (st_data_t)a, (st_data_t)n ); + } + } + } } - // - // FIXME: Return an InvalidAnchor object - // - return syck_new_str( "..." ); + if ( n == NULL ) + { + n = (p->bad_anchor_handler)( p, a ); + } + n->anchor = a; + return n; } void |