00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "ruby/ruby.h"
00010 #include "syck.h"
00011
00012 SYMID
00013 syck_hdlr_add_node( SyckParser *p, SyckNode *n )
00014 {
00015 SYMID id;
00016
00017 if ( ! n->id )
00018 {
00019 n->id = (p->handler)( p, n );
00020 }
00021 id = n->id;
00022
00023 if ( n->anchor == NULL )
00024 {
00025 syck_free_node( n );
00026 }
00027 return id;
00028 }
00029
00030 SyckNode *
00031 syck_hdlr_add_anchor( SyckParser *p, char *a, SyckNode *n )
00032 {
00033 SyckNode *ntmp = NULL;
00034
00035 n->anchor = a;
00036 if ( p->bad_anchors != NULL )
00037 {
00038 SyckNode *bad;
00039 if ( st_lookup( p->bad_anchors, (st_data_t)a, (void *)&bad ) )
00040 {
00041 if ( n->kind != syck_str_kind )
00042 {
00043 n->id = bad->id;
00044 (p->handler)( p, n );
00045 }
00046 }
00047 }
00048 if ( p->anchors == NULL )
00049 {
00050 p->anchors = st_init_strtable();
00051 }
00052 if ( st_lookup( p->anchors, (st_data_t)a, (void *)&ntmp ) )
00053 {
00054 if ( ntmp != (void *)1 )
00055 {
00056 syck_free_node( ntmp );
00057 }
00058 }
00059 st_insert( p->anchors, (st_data_t)a, (st_data_t)n );
00060 return n;
00061 }
00062
00063 void
00064 syck_hdlr_remove_anchor( SyckParser *p, char *a )
00065 {
00066 char *atmp = a;
00067 SyckNode *ntmp;
00068 if ( p->anchors == NULL )
00069 {
00070 p->anchors = st_init_strtable();
00071 }
00072 if ( st_delete( p->anchors, (void *)&atmp, (void *)&ntmp ) )
00073 {
00074 if ( ntmp != (void *)1 )
00075 {
00076 syck_free_node( ntmp );
00077 }
00078 }
00079 st_insert( p->anchors, (st_data_t)a, (st_data_t)1 );
00080 }
00081
00082 SyckNode *
00083 syck_hdlr_get_anchor( SyckParser *p, char *a )
00084 {
00085 SyckNode *n = NULL;
00086
00087 if ( p->anchors != NULL )
00088 {
00089 if ( st_lookup( p->anchors, (st_data_t)a, (void *)&n ) )
00090 {
00091 if ( n != (void *)1 )
00092 {
00093 S_FREE( a );
00094 return n;
00095 }
00096 else
00097 {
00098 if ( p->bad_anchors == NULL )
00099 {
00100 p->bad_anchors = st_init_strtable();
00101 }
00102 if ( ! st_lookup( p->bad_anchors, (st_data_t)a, (void *)&n ) )
00103 {
00104 n = (p->bad_anchor_handler)( p, a );
00105 st_insert( p->bad_anchors, (st_data_t)a, (st_data_t)n );
00106 }
00107 }
00108 }
00109 }
00110
00111 if ( n == NULL )
00112 {
00113 n = (p->bad_anchor_handler)( p, a );
00114 }
00115
00116 if ( n->anchor )
00117 {
00118 S_FREE( a );
00119 }
00120 else
00121 {
00122 n->anchor = a;
00123 }
00124
00125 return n;
00126 }
00127
00128 void
00129 syck_add_transfer( char *uri, SyckNode *n, int taguri )
00130 {
00131 if ( n->type_id != NULL )
00132 {
00133 S_FREE( n->type_id );
00134 }
00135
00136 if ( taguri == 0 )
00137 {
00138 n->type_id = uri;
00139 return;
00140 }
00141
00142 n->type_id = syck_type_id_to_uri( uri );
00143 S_FREE( uri );
00144 }
00145
00146 char *
00147 syck_xprivate( const char *type_id, int type_len )
00148 {
00149 char *uri = S_ALLOC_N( char, type_len + 14 );
00150 uri[0] = '\0';
00151 strcat( uri, "x-private:" );
00152 strncat( uri, type_id, type_len );
00153 return uri;
00154 }
00155
00156 char *
00157 syck_taguri( const char *domain, const char *type_id, int type_len )
00158 {
00159 char *uri = S_ALLOC_N( char, strlen( domain ) + type_len + 14 );
00160 uri[0] = '\0';
00161 strcat( uri, "tag:" );
00162 strcat( uri, domain );
00163 strcat( uri, ":" );
00164 strncat( uri, type_id, type_len );
00165 return uri;
00166 }
00167
00168 int
00169 syck_try_implicit( SyckNode *n )
00170 {
00171 return 1;
00172 }
00173
00174