rb_cObject
YAML::Syck::Emitter.reset( options )
VALUE
syck_emitter_reset(int argc, VALUE *argv, VALUE self)
{
VALUE options, tmp;
SyckEmitter *emitter;
struct emitter_xtra *bonus;
Data_Get_Struct(self, SyckEmitter, emitter);
bonus = (struct emitter_xtra *)emitter->bonus;
bonus->oid = Qnil;
bonus->port = rb_str_new2( "" );
bonus->data = id_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 = 0;
rb_ivar_set(self, s_level, INT2FIX(0));
rb_ivar_set(self, s_resolver, Qnil);
return self;
}
YAML::Syck::Emitter.emit( object_id ) { |out| … }
VALUE
syck_emitter_emit(int argc, VALUE *argv, VALUE self)
{
VALUE oid, proc;
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
VALUE
syck_emitter_node_export(VALUE self, VALUE node)
{
return rb_funcall( node, s_to_yaml, 1, self );
}
YAML::Syck::Emitter.reset( options )
VALUE
syck_emitter_reset(int argc, VALUE *argv, VALUE self)
{
VALUE options, tmp;
SyckEmitter *emitter;
struct emitter_xtra *bonus;
Data_Get_Struct(self, SyckEmitter, emitter);
bonus = (struct emitter_xtra *)emitter->bonus;
bonus->oid = Qnil;
bonus->port = rb_str_new2( "" );
bonus->data = id_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 = 0;
rb_ivar_set(self, s_level, INT2FIX(0));
rb_ivar_set(self, s_resolver, Qnil);
return self;
}