Ruby 1.9.3p327(2012-11-10revision37606)
|
00001 /* 00002 * handler.c 00003 * 00004 * $Author: nobu $ 00005 * 00006 * Copyright (C) 2003 why the lucky stiff 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