summaryrefslogtreecommitdiff
path: root/ext/syck/handler.c
diff options
context:
space:
mode:
authorwhy <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-06-17 16:55:54 +0000
committerwhy <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-06-17 16:55:54 +0000
commitae28f1b6b3b22afb529f599385d1f2af258624e9 (patch)
tree718fc605c85aa7d3c2b05fbfbc46c41320b74db9 /ext/syck/handler.c
parent77e941269fcddc8f5af6e553592fc3ef0132727c (diff)
* 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.c59
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