1/* 2 * handler.c 3 * 4 * $Author: why $ 5 * $Date: 2005-09-20 13:21:06 +0800 (二, 20 9 2005) $ 6 * 7 * Copyright (C) 2003 why the lucky stiff 8 */ 9 10#include "syck.h" 11 12SYMID 13syck_hdlr_add_node( SyckParser *p, SyckNode *n ) 14{ 15 SYMID id; 16 17 if ( ! n->id ) 18 { 19 n->id = (p->handler)( p, n ); 20 } 21 id = n->id; 22 23 if ( n->anchor == NULL ) 24 { 25 syck_free_node( n ); 26 } 27 return id; 28} 29 30SyckNode * 31syck_hdlr_add_anchor( SyckParser *p, char *a, SyckNode *n ) 32{ 33 SyckNode *ntmp = NULL; 34 35 n->anchor = a; 36 if ( p->bad_anchors != NULL ) 37 { 38 SyckNode *bad; 39 if ( st_lookup( p->bad_anchors, (st_data_t)a, (st_data_t *)&bad ) ) 40 { 41 if ( n->kind != syck_str_kind ) 42 { 43 n->id = bad->id; 44 (p->handler)( p, n ); 45 } 46 } 47 } 48 if ( p->anchors == NULL ) 49 { 50 p->anchors = st_init_strtable(); 51 } 52 if ( st_lookup( p->anchors, (st_data_t)a, (st_data_t *)&ntmp ) ) 53 { 54 if ( ntmp != (void *)1 ) 55 { 56 syck_free_node( ntmp ); 57 } 58 } 59 st_insert( p->anchors, (st_data_t)a, (st_data_t)n ); 60 return n; 61} 62 63void 64syck_hdlr_remove_anchor( SyckParser *p, char *a ) 65{ 66 char *atmp = a; 67 SyckNode *ntmp; 68 if ( p->anchors == NULL ) 69 { 70 p->anchors = st_init_strtable(); 71 } 72 if ( st_delete( p->anchors, (st_data_t *)&atmp, (st_data_t *)&ntmp ) ) 73 { 74 if ( ntmp != (void *)1 ) 75 { 76 syck_free_node( ntmp ); 77 } 78 } 79 st_insert( p->anchors, (st_data_t)a, (st_data_t)1 ); 80} 81 82SyckNode * 83syck_hdlr_get_anchor( SyckParser *p, char *a ) 84{ 85 SyckNode *n = NULL; 86 87 if ( p->anchors != NULL ) 88 { 89 if ( st_lookup( p->anchors, (st_data_t)a, (st_data_t *)&n ) ) 90 { 91 if ( n != (void *)1 ) 92 { 93 S_FREE( a ); 94 return n; 95 } 96 else 97 { 98 if ( p->bad_anchors == NULL ) 99 { 100 p->bad_anchors = st_init_strtable(); 101 } 102 if ( ! st_lookup( p->bad_anchors, (st_data_t)a, (st_data_t *)&n ) ) 103 { 104 n = (p->bad_anchor_handler)( p, a ); 105 st_insert( p->bad_anchors, (st_data_t)a, (st_data_t)n ); 106 } 107 } 108 } 109 } 110 111 if ( n == NULL ) 112 { 113 n = (p->bad_anchor_handler)( p, a ); 114 } 115 116 if ( n->anchor ) 117 { 118 S_FREE( a ); 119 } 120 else 121 { 122 n->anchor = a; 123 } 124 125 return n; 126} 127 128void 129syck_add_transfer( char *uri, SyckNode *n, int taguri ) 130{ 131 if ( n->type_id != NULL ) 132 { 133 S_FREE( n->type_id ); 134 } 135 136 if ( taguri == 0 ) 137 { 138 n->type_id = uri; 139 return; 140 } 141 142 n->type_id = syck_type_id_to_uri( uri ); 143 S_FREE( uri ); 144} 145 146char * 147syck_xprivate( char *type_id, int type_len ) 148{ 149 char *uri = S_ALLOC_N( char, type_len + 14 ); 150 uri[0] = '\0'; 151 strcat( uri, "x-private:" ); 152 strncat( uri, type_id, type_len ); 153 return uri; 154} 155 156char * 157syck_taguri( const char *domain, const char *type_id, int type_len ) 158{ 159 char *uri = S_ALLOC_N( char, strlen( domain ) + type_len + 14 ); 160 uri[0] = '\0'; 161 strcat( uri, "tag:" ); 162 strcat( uri, domain ); 163 strcat( uri, ":" ); 164 strncat( uri, type_id, type_len ); 165 return uri; 166} 167 168int 169syck_try_implicit( SyckNode *n ) 170{ 171 return 1; 172} 173 174