ext/syck/handler.c

Go to the documentation of this file.
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 

Generated on Wed Aug 10 09:17:05 2011 for Ruby by  doxygen 1.4.7