Class | YAML::Syck::Emitter |
In: |
syck/rubyext.c
|
Parent: | Object |
YAML::Syck::Emitter.reset( options )
/* * YAML::Syck::Emitter.reset( options ) */ VALUE syck_emitter_reset( argc, argv, self ) int argc; VALUE *argv; VALUE self; { VALUE options, tmp; SyckEmitter *emitter; struct emitter_xtra *bonus; volatile VALUE hash; /* protect from GC */ Data_Get_Struct(self, SyckEmitter, emitter); bonus = (struct emitter_xtra *)emitter->bonus; if ( bonus != NULL ) S_FREE( bonus ); bonus = S_ALLOC_N( struct emitter_xtra, 1 ); bonus->port = rb_str_new2( "" ); bonus->data = hash = rb_hash_new(); if (rb_scan_args(argc, argv, "01", &options) == 0) { options = rb_hash_new(); rb_ivar_set(self, s_options, options); } else if ( !NIL_P(tmp = rb_check_string_type(options)) ) { bonus->port = tmp; } else if ( rb_respond_to( options, s_write ) ) { bonus->port = options; } else { Check_Type(options, T_HASH); rb_ivar_set(self, s_options, options); } emitter->headless = 1; emitter->bonus = (void *)bonus; rb_ivar_set(self, s_level, INT2FIX(0)); rb_ivar_set(self, s_resolver, Qnil); return self; }
YAML::Syck::Emitter.emit( object_id ) { |out| … }
/* * YAML::Syck::Emitter.emit( object_id ) { |out| ... } */ VALUE syck_emitter_emit( argc, argv, self ) int argc; VALUE *argv; VALUE self; { VALUE oid, proc; char *anchor_name; SyckEmitter *emitter; struct emitter_xtra *bonus; SYMID symple; int level = FIX2INT(rb_ivar_get(self, s_level)) + 1; rb_ivar_set(self, s_level, INT2FIX(level)); rb_scan_args(argc, argv, "1&", &oid, &proc); Data_Get_Struct(self, SyckEmitter, emitter); bonus = (struct emitter_xtra *)emitter->bonus; /* Calculate anchors, normalize nodes, build a simpler symbol table */ bonus->oid = oid; if ( !NIL_P( oid ) && RTEST( rb_funcall( bonus->data, s_haskey, 1, oid ) ) ) { symple = rb_hash_aref( bonus->data, oid ); } else { symple = rb_funcall( proc, s_call, 1, rb_ivar_get( self, s_out ) ); } syck_emitter_mark_node( emitter, (st_data_t)symple ); /* Second pass, build emitted string */ level -= 1; rb_ivar_set(self, s_level, INT2FIX(level)); if ( level == 0 ) { syck_emit(emitter, (st_data_t)symple); syck_emitter_flush(emitter, 0); return bonus->port; } return symple; }
YAML::Syck::Emitter#node_export
/* * YAML::Syck::Emitter#node_export */ VALUE syck_emitter_node_export( self, node ) VALUE self, node; { return rb_funcall( node, s_to_yaml, 1, self ); }
YAML::Syck::Emitter.reset( options )
/* * YAML::Syck::Emitter.reset( options ) */ VALUE syck_emitter_reset( argc, argv, self ) int argc; VALUE *argv; VALUE self; { VALUE options, tmp; SyckEmitter *emitter; struct emitter_xtra *bonus; volatile VALUE hash; /* protect from GC */ Data_Get_Struct(self, SyckEmitter, emitter); bonus = (struct emitter_xtra *)emitter->bonus; if ( bonus != NULL ) S_FREE( bonus ); bonus = S_ALLOC_N( struct emitter_xtra, 1 ); bonus->port = rb_str_new2( "" ); bonus->data = hash = rb_hash_new(); if (rb_scan_args(argc, argv, "01", &options) == 0) { options = rb_hash_new(); rb_ivar_set(self, s_options, options); } else if ( !NIL_P(tmp = rb_check_string_type(options)) ) { bonus->port = tmp; } else if ( rb_respond_to( options, s_write ) ) { bonus->port = options; } else { Check_Type(options, T_HASH); rb_ivar_set(self, s_options, options); } emitter->headless = 1; emitter->bonus = (void *)bonus; rb_ivar_set(self, s_level, INT2FIX(0)); rb_ivar_set(self, s_resolver, Qnil); return self; }
YAML::Syck::Emitter#set_resolver
/* * YAML::Syck::Emitter#set_resolver */ VALUE syck_emitter_set_resolver( self, resolver ) VALUE self, resolver; { rb_ivar_set( self, s_resolver, resolver ); return self; }