summaryrefslogtreecommitdiff
path: root/ext/syck/handler.c
diff options
context:
space:
mode:
authorwhy <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-09-13 03:58:33 +0000
committerwhy <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-09-13 03:58:33 +0000
commit176a7ab72a9bb763a97ad2dadc4ce3bf357b5976 (patch)
tree43d2fe12e0eb86c4a688a22cd043f898c7683872 /ext/syck/handler.c
parent19dbb4c3c17e1ec458b02587fce49950dfca0648 (diff)
* lib/yaml.rb: reworking YAML::Stream to use the new
emitter. * lib/yaml/stream.rb: ditto. * lib/yaml/rubytypes.rb: added Object#yaml_new. * lib/yaml/tag.rb: the tag_subclasses? method now shows up in the class. allow taguri to be set using an accessor. continue support of Object#to_yaml_type. * ext/syck/rubyext.c: new emitter code. yaml_new and yaml_initialize get called, should they be present. consolidated all the diaspora of internal node types into the family below YAML::Syck::Node -- Map, Seq, Scalar -- all of whom are SyckNode structs pointing to Ruby data. moved Object#yaml_new into the node_import and made it the default behavior. the target_class is always called wih yaml_new, prepended a parameter, which is the klass. loaded nodes through GenericResolver show their style. new Resolver#tagurize converts type ids to taguris. * ext/syck/implicit.re: were 'y' and 'n' seriously omitted?? * ext/syck/emitter.c: renovated emitter, walks the tree in advance. consolidated redundant block_styles struct into the scalar_style struct. (this means loaded nodes can now be sent back to emitter and preserve at least its very basic formatting.) * ext/syck/gram.c: headless documents of any kind allowed. * ext/syck/node.c: new syck_replace_str methods and syck_empty_* methods for rewriting node contents, while keeping the ID and other setup info. added syck_seq_assign. * ext/syck/syck.h: reflect block_styles and new node functions. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@9141 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/syck/handler.c')
-rw-r--r--ext/syck/handler.c19
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 );
}