cLoader (Class)

In:

Public Class methods

YAML::Syck::Loader.initialize

[Source]

/*
 * 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;
}

Public Instance methods

YAML::Syck::Loader.add_builtin_type

[Source]

/*
 * 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

[Source]

/*
 * 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

[Source]

/*
 * 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

[Source]

/*
 * 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

[Source]

/*
 * 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

[Source]

/*
 * 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

[Source]

/*
 * 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

[Source]

/*
 * 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;
}

[Validate]