| In: |
YAML::Syck::Loader.initialize
/*
* YAML::Syck::Loader.initialize
*/
static VALUE
syck_loader_initialize( self )
VALUE self;
{
VALUE families;
rb_iv_set(self, "@families", rb_hash_new() );
rb_iv_set(self, "@private_types", rb_hash_new() );
rb_iv_set(self, "@anchors", rb_hash_new() );
families = rb_iv_get(self, "@families");
rb_hash_aset(families, rb_str_new2( YAML_DOMAIN ), rb_hash_new());
rb_hash_aset(families, rb_str_new2( RUBY_DOMAIN ), rb_hash_new());
return self;
}
YAML::Syck::Loader.add_builtin_type
/*
* YAML::Syck::Loader.add_builtin_type
*/
VALUE
syck_loader_add_builtin_type( argc, argv, self )
int argc;
VALUE *argv;
VALUE self;
{
VALUE type_re, proc;
rb_scan_args(argc, argv, "1&", &type_re, &proc);
syck_loader_add_type_family( self, rb_str_new2( YAML_DOMAIN ), type_re, proc );
return Qnil;
}
YAML::Syck::Loader.add_domain_type
/*
* YAML::Syck::Loader.add_domain_type
*/
VALUE
syck_loader_add_domain_type( argc, argv, self )
int argc;
VALUE *argv;
VALUE self;
{
VALUE domain, type_re, proc;
rb_scan_args(argc, argv, "2&", &domain, &type_re, &proc);
syck_loader_add_type_family( self, domain, type_re, proc );
return Qnil;
}
YAML::Syck::Loader.add_private_type
/*
* YAML::Syck::Loader.add_private_type
*/
VALUE
syck_loader_add_private_type( argc, argv, self )
int argc;
VALUE *argv;
VALUE self;
{
VALUE type_re, proc, priv_types;
rb_scan_args(argc, argv, "1&", &type_re, &proc);
priv_types = rb_iv_get(self, "@private_types");
rb_hash_aset( priv_types, type_re, proc );
return Qnil;
}
YAML::Syck::Loader.add_ruby_type
/*
* YAML::Syck::Loader.add_ruby_type
*/
VALUE
syck_loader_add_ruby_type( argc, argv, self )
int argc;
VALUE *argv;
VALUE self;
{
VALUE type_re, proc;
rb_scan_args(argc, argv, "1&", &type_re, &proc);
syck_loader_add_type_family( self, rb_str_new2( RUBY_DOMAIN ), type_re, proc );
return Qnil;
}
YAML::Syck::Parser.bufsize => Integer
/*
* YAML::Syck::Parser.bufsize => Integer
*/
static VALUE
syck_parser_bufsize_get( self )
VALUE self;
{
SyckParser *parser;
Data_Get_Struct(self, SyckParser, parser);
return INT2FIX( parser->bufsize );
}
YAML::Syck::Parser.bufsize = Integer
/*
* YAML::Syck::Parser.bufsize = Integer
*/
static VALUE
syck_parser_bufsize_set( self, size )
VALUE self, size;
{
SyckParser *parser;
Data_Get_Struct(self, SyckParser, parser);
if ( rb_respond_to( size, s_to_i ) ) {
parser->bufsize = NUM2INT(rb_funcall(size, s_to_i, 0));
}
return self;
}
YAML::Syck::Loader#detect
/*
* YAML::Syck::Loader#detect
*/
VALUE
syck_loader_detect_implicit( self, val )
VALUE self, val;
{
char *type_id;
if ( TYPE(val) == T_STRING )
{
type_id = syck_match_implicit( RSTRING(val)->ptr, RSTRING(val)->len );
return rb_str_new2( type_id );
}
return rb_str_new2( "" );
}
YAML::Syck::Loader#transfer
/*
* YAML::Syck::Loader#transfer
*/
VALUE
syck_loader_transfer( self, type, val )
VALUE self, type, val;
{
char *taguri = NULL;
if (NIL_P(type) || !RSTRING(type)->ptr || RSTRING(type)->len == 0)
{
/*
* Empty transfer, detect type
*/
if ( TYPE(val) == T_STRING )
{
StringValue(val);
taguri = syck_match_implicit( RSTRING(val)->ptr, RSTRING(val)->len );
taguri = syck_taguri( YAML_DOMAIN, taguri, strlen( taguri ) );
}
}
else
{
taguri = syck_type_id_to_uri( RSTRING(type)->ptr );
}
if ( taguri != NULL )
{
int transferred = 0;
VALUE scheme, name, type_hash, domain = Qnil, type_proc = Qnil;
VALUE type_uri = rb_str_new2( taguri );
VALUE str_taguri = rb_str_new2("tag");
VALUE str_xprivate = rb_str_new2("x-private");
VALUE str_yaml_domain = rb_str_new2(YAML_DOMAIN);
VALUE parts = rb_str_split( type_uri, ":" );
scheme = rb_ary_shift( parts );
if ( rb_str_cmp( scheme, str_xprivate ) == 0 )
{
name = rb_ary_join( parts, rb_str_new2( ":" ) );
type_hash = rb_iv_get(self, "@private_types");
}
else if ( rb_str_cmp( scheme, str_taguri ) == 0 )
{
domain = rb_ary_shift( parts );
name = rb_ary_join( parts, rb_str_new2( ":" ) );
type_hash = rb_iv_get(self, "@families");
type_hash = rb_hash_aref(type_hash, domain);
/*
* Route yaml.org types through the transfer
* method here in this extension
*/
if ( rb_str_cmp( domain, str_yaml_domain ) == 0 )
{
SyckNode *n = rb_new_syck_node(val, name);
if ( n != NULL )
{
transferred = yaml_org_handler(n, &val);
S_FREE( n );
}
}
}
else
{
rb_raise(rb_eTypeError, "invalid typing scheme: %s given",
scheme);
}
if ( ! transferred )
{
if ( rb_obj_is_instance_of( type_hash, rb_cHash ) )
{
type_proc = rb_hash_aref( type_hash, name );
if ( NIL_P( type_proc ) )
{
VALUE col = rb_ary_new();
rb_ary_push( col, name );
rb_iterate(rb_each, type_hash, transfer_find_i, col );
name = rb_ary_shift( col );
type_proc = rb_ary_shift( col );
}
}
if ( rb_respond_to( type_proc, s_call ) )
{
val = rb_funcall(type_proc, s_call, 2, type_uri, val);
}
else if ( rb_str_cmp( scheme, str_xprivate ) == 0 )
{
val = rb_funcall(cPrivateType, s_new, 2, name, val);
}
else
{
val = rb_funcall(cDomainType, s_new, 3, domain, name, val);
}
transferred = 1;
}
}
return val;
}