diff options
Diffstat (limited to 'ext/syck/handler.c')
-rw-r--r-- | ext/syck/handler.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/ext/syck/handler.c b/ext/syck/handler.c index 563feb10ae..d070efa8e5 100644 --- a/ext/syck/handler.c +++ b/ext/syck/handler.c @@ -31,6 +31,9 @@ syck_hdlr_add_node( SyckParser *p, SyckNode *n ) SyckNode * syck_hdlr_add_anchor( SyckParser *p, char *a, SyckNode *n ) { + char *atmp = NULL; + SyckNode *ntmp = NULL; + n->anchor = a; if ( p->bad_anchors != NULL ) { @@ -48,6 +51,13 @@ syck_hdlr_add_anchor( SyckParser *p, char *a, SyckNode *n ) { p->anchors = st_init_strtable(); } + if ( st_lookup( p->anchors, (st_data_t)a, (st_data_t *)&ntmp ) ) + { + if ( ntmp != (void *)1 ) + { + syck_free_node( ntmp ); + } + } st_insert( p->anchors, (st_data_t)a, (st_data_t)n ); return n; } @@ -55,10 +65,19 @@ syck_hdlr_add_anchor( SyckParser *p, char *a, SyckNode *n ) void syck_hdlr_remove_anchor( SyckParser *p, char *a ) { + char *atmp = a; + SyckNode *ntmp; if ( p->anchors == NULL ) { p->anchors = st_init_strtable(); } + if ( st_delete( p->anchors, (st_data_t *)&atmp, (st_data_t *)&ntmp ) ) + { + if ( ntmp != (void *)1 ) + { + syck_free_node( ntmp ); + } + } st_insert( p->anchors, (st_data_t)a, (st_data_t)1 ); } |