mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
d578f9d32e
appearing alone or at the end of plain scalars. [ruby-core:5826] * ext/syck/emitter.c (syck_emit_scalar): treat typed scalar nodes as complex keys. * lib/syck.h: version 0.60. * lib/yaml/basenode.rb (YAML::BaseNode#at): transform keys during key searches. * ext/syck/rubyext.c: loading of binary-typed nodes. prevent emission of plain strings that look like symbols, but which aren't. * ext/syck/emitter.c (syck_emit): passing an int* value to the long* parameter causes unaligned access on LP64 systems. [ruby-dev:27161] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9242 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
174 lines
3.3 KiB
C
174 lines
3.3 KiB
C
/*
|
|
* handler.c
|
|
*
|
|
* $Author$
|
|
* $Date$
|
|
*
|
|
* Copyright (C) 2003 why the lucky stiff
|
|
*/
|
|
|
|
#include "ruby.h"
|
|
#include "syck.h"
|
|
|
|
SYMID
|
|
syck_hdlr_add_node( SyckParser *p, SyckNode *n )
|
|
{
|
|
SYMID id;
|
|
|
|
if ( ! n->id )
|
|
{
|
|
n->id = (p->handler)( p, n );
|
|
}
|
|
id = n->id;
|
|
|
|
if ( n->anchor == NULL )
|
|
{
|
|
syck_free_node( n );
|
|
}
|
|
return id;
|
|
}
|
|
|
|
SyckNode *
|
|
syck_hdlr_add_anchor( SyckParser *p, char *a, SyckNode *n )
|
|
{
|
|
SyckNode *ntmp = NULL;
|
|
|
|
n->anchor = a;
|
|
if ( p->bad_anchors != NULL )
|
|
{
|
|
SyckNode *bad;
|
|
if ( st_lookup( p->bad_anchors, (st_data_t)a, (st_data_t *)&bad ) )
|
|
{
|
|
if ( n->kind != syck_str_kind )
|
|
{
|
|
n->id = bad->id;
|
|
(p->handler)( p, n );
|
|
}
|
|
}
|
|
}
|
|
if ( p->anchors == NULL )
|
|
{
|
|
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;
|
|
}
|
|
|
|
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 );
|
|
}
|
|
|
|
SyckNode *
|
|
syck_hdlr_get_anchor( SyckParser *p, char *a )
|
|
{
|
|
SyckNode *n = NULL;
|
|
|
|
if ( p->anchors != NULL )
|
|
{
|
|
if ( st_lookup( p->anchors, (st_data_t)a, (st_data_t *)&n ) )
|
|
{
|
|
if ( n != (void *)1 )
|
|
{
|
|
S_FREE( a );
|
|
return n;
|
|
}
|
|
else
|
|
{
|
|
if ( p->bad_anchors == NULL )
|
|
{
|
|
p->bad_anchors = st_init_strtable();
|
|
}
|
|
if ( ! st_lookup( p->bad_anchors, (st_data_t)a, (st_data_t *)&n ) )
|
|
{
|
|
n = (p->bad_anchor_handler)( p, a );
|
|
st_insert( p->bad_anchors, (st_data_t)a, (st_data_t)n );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( n == NULL )
|
|
{
|
|
n = (p->bad_anchor_handler)( p, a );
|
|
}
|
|
|
|
if ( n->anchor )
|
|
{
|
|
S_FREE( a );
|
|
}
|
|
else
|
|
{
|
|
n->anchor = a;
|
|
}
|
|
|
|
return n;
|
|
}
|
|
|
|
void
|
|
syck_add_transfer( char *uri, SyckNode *n, int taguri )
|
|
{
|
|
if ( n->type_id != NULL )
|
|
{
|
|
S_FREE( n->type_id );
|
|
}
|
|
|
|
if ( taguri == 0 )
|
|
{
|
|
n->type_id = uri;
|
|
return;
|
|
}
|
|
|
|
n->type_id = syck_type_id_to_uri( uri );
|
|
S_FREE( uri );
|
|
}
|
|
|
|
char *
|
|
syck_xprivate( char *type_id, int type_len )
|
|
{
|
|
char *uri = S_ALLOC_N( char, type_len + 14 );
|
|
uri[0] = '\0';
|
|
strcat( uri, "x-private:" );
|
|
strncat( uri, type_id, type_len );
|
|
return uri;
|
|
}
|
|
|
|
char *
|
|
syck_taguri( char *domain, char *type_id, int type_len )
|
|
{
|
|
char *uri = S_ALLOC_N( char, strlen( domain ) + type_len + 14 );
|
|
uri[0] = '\0';
|
|
strcat( uri, "tag:" );
|
|
strcat( uri, domain );
|
|
strcat( uri, ":" );
|
|
strncat( uri, type_id, type_len );
|
|
return uri;
|
|
}
|
|
|
|
int
|
|
syck_try_implicit( SyckNode *n )
|
|
{
|
|
return 1;
|
|
}
|
|
|