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