annotate mcabber/libjabber/xmlnode.c @ 211:0627546a21fe

[/trunk] Changeset 223 by mikael * pinginterval was set to 0, but should IMHO be keeped at the default value...
author mikael
date Sun, 08 May 2005 11:24:01 +0000
parents bf3d6e241714
children c3ae9251c197
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2 * This program is free software; you can redistribute it and/or modify
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3 * it under the terms of the GNU General Public License as published by
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
4 * the Free Software Foundation; either version 2 of the License, or
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
5 * (at your option) any later version.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
6 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
7 * This program is distributed in the hope that it will be useful,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
10 * GNU General Public License for more details.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
11 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
12 * You should have received a copy of the GNU General Public License
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
13 * along with this program; if not, write to the Free Software
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
14 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
15 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
16 * Jabber
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
17 * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
18 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
19
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
20 #include "libxode.h"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
21
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
22 /* Internal routines */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
23 xmlnode _xmlnode_new(pool p, const char* name, unsigned int type)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
24 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
25 xmlnode result = NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
26 if (type > NTYPE_LAST)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
27 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
28
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
29 if (type != NTYPE_CDATA && name == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
30 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
31
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
32 if (p == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
33 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
34 p = pool_heap(1*1024);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
35 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
36
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
37 /* Allocate & zero memory */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
38 result = (xmlnode)pmalloc(p, sizeof(_xmlnode));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
39 memset(result, '\0', sizeof(_xmlnode));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
40
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
41 /* Initialize fields */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
42 if (type != NTYPE_CDATA)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
43 result->name = pstrdup(p,name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
44 result->type = type;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
45 result->p = p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
46 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
47 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
48
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
49 static xmlnode _xmlnode_append_sibling(xmlnode lastsibling, const char* name, unsigned int type)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
50 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
51 xmlnode result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
52
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
53 result = _xmlnode_new(xmlnode_pool(lastsibling), name, type);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
54 if (result != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
55 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
56 /* Setup sibling pointers */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
57 result->prev = lastsibling;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
58 lastsibling->next = result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
59 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
60 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
61 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
62
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
63 static xmlnode _xmlnode_insert(xmlnode parent, const char* name, unsigned int type)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
64 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
65 xmlnode result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
66
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
67 if(parent == NULL || name == NULL) return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
68
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
69 /* If parent->firstchild is NULL, simply create a new node for the first child */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
70 if (parent->firstchild == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
71 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
72 result = _xmlnode_new(parent->p, name, type);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
73 parent->firstchild = result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
74 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
75 /* Otherwise, append this to the lastchild */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
76 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
77 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
78 result= _xmlnode_append_sibling(parent->lastchild, name, type);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
79 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
80 result->parent = parent;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
81 parent->lastchild = result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
82 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
83
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
84 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
85
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
86 static xmlnode _xmlnode_search(xmlnode firstsibling, const char* name, unsigned int type)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
87 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
88 xmlnode current;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
89
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
90 /* Walk the sibling list, looking for a NTYPE_TAG xmlnode with
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
91 the specified name */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
92 current = firstsibling;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
93 while (current != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
94 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
95 if ((current->type == type) && (j_strcmp(current->name, name) == 0))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
96 return current;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
97 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
98 current = current->next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
99 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
100 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
101 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
102
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
103 static char* _xmlnode_merge(pool p, char* dest, unsigned int destsize, const char* src, unsigned int srcsize)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
104 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
105 char* result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
106 result = (char*)pmalloc(p, destsize + srcsize + 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
107 memcpy(result, dest, destsize);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
108 memcpy(result+destsize, src, srcsize);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
109 result[destsize + srcsize] = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
110
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
111 /* WARNING: major ugly hack: since we're throwing the old data away, let's jump in the pool and subtract it from the size, this is for xmlstream's big-node checking */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
112 p->size -= destsize;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
113
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
114 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
115 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
116
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
117 static void _xmlnode_hide_sibling(xmlnode child)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
118 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
119 if(child == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
120 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
121
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
122 if(child->prev != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
123 child->prev->next = child->next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
124 if(child->next != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
125 child->next->prev = child->prev;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
126 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
127
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
128 void _xmlnode_tag2str(spool s, xmlnode node, int flag)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
129 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
130 xmlnode tmp;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
131
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
132 if(flag==0 || flag==1)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
133 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
134 spooler(s,"<",xmlnode_get_name(node),s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
135 tmp = xmlnode_get_firstattrib(node);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
136 while(tmp) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
137 spooler(s," ",xmlnode_get_name(tmp),"='",strescape(xmlnode_pool(node),xmlnode_get_data(tmp)),"'",s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
138 tmp = xmlnode_get_nextsibling(tmp);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
139 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
140 if(flag==0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
141 spool_add(s,"/>");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
142 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
143 spool_add(s,">");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
144 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
145 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
146 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
147 spooler(s,"</",xmlnode_get_name(node),">",s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
148 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
149 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
150
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
151 spool _xmlnode2spool(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
152 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
153 spool s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
154 int level=0,dir=0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
155 xmlnode tmp;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
156
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
157 if(!node || xmlnode_get_type(node)!=NTYPE_TAG)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
158 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
159
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
160 s = spool_new(xmlnode_pool(node));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
161 if(!s) return(NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
162
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
163 while(1)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
164 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
165 if(dir==0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
166 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
167 if(xmlnode_get_type(node) == NTYPE_TAG)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
168 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
169 if(xmlnode_has_children(node))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
170 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
171 _xmlnode_tag2str(s,node,1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
172 node = xmlnode_get_firstchild(node);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
173 level++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
174 continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
175 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
176 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
177 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
178 _xmlnode_tag2str(s,node,0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
179 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
180 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
181 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
182 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
183 spool_add(s,strescape(xmlnode_pool(node),xmlnode_get_data(node)));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
184 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
185 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
186
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
187 tmp = xmlnode_get_nextsibling(node);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
188 if(!tmp)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
189 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
190 node = xmlnode_get_parent(node);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
191 level--;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
192 if(level>=0) _xmlnode_tag2str(s,node,2);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
193 if(level<1) break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
194 dir = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
195 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
196 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
197 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
198 node = tmp;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
199 dir = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
200 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
201 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
202
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
203 return s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
204 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
205
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
206
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
207 /* External routines */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
208
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
209
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
210 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
211 * xmlnode_new_tag -- create a tag node
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
212 * Automatically creates a memory pool for the node.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
213 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
214 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
215 * name -- name of the tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
216 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
217 * returns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
218 * a pointer to the tag node
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
219 * or NULL if it was unsuccessfull
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
220 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
221 xmlnode xmlnode_new_tag(const char* name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
222 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
223 return _xmlnode_new(NULL, name, NTYPE_TAG);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
224 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
225
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
226
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
227 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
228 * xmlnode_new_tag_pool -- create a tag node within given pool
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
229 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
230 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
231 * p -- previously created memory pool
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
232 * name -- name of the tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
233 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
234 * returns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
235 * a pointer to the tag node
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
236 * or NULL if it was unsuccessfull
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
237 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
238 xmlnode xmlnode_new_tag_pool(pool p, const char* name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
239 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
240 return _xmlnode_new(p, name, NTYPE_TAG);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
241 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
242
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
243
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
244 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
245 * xmlnode_insert_tag -- append a child tag to a tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
246 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
247 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
248 * parent -- pointer to the parent tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
249 * name -- name of the child tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
250 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
251 * returns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
252 * a pointer to the child tag node
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
253 * or NULL if it was unsuccessfull
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
254 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
255 xmlnode xmlnode_insert_tag(xmlnode parent, const char* name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
256 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
257 return _xmlnode_insert(parent, name, NTYPE_TAG);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
258 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
259
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
260
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
261 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
262 * xmlnode_insert_cdata -- append character data to a tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
263 * If last child of the parent is CDATA, merges CDATA nodes. Otherwise
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
264 * creates a CDATA node, and appends it to the parent's child list.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
265 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
266 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
267 * parent -- parent tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
268 * CDATA -- character data
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
269 * size -- size of CDATA
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
270 * or -1 for null-terminated CDATA strings
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
271 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
272 * returns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
273 * a pointer to the child CDATA node
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
274 * or NULL if it was unsuccessfull
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
275 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
276 xmlnode xmlnode_insert_cdata(xmlnode parent, const char* CDATA, unsigned int size)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
277 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
278 xmlnode result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
279
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
280 if(CDATA == NULL || parent == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
281 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
282
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
283 if(size == -1)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
284 size = strlen(CDATA);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
285
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
286 if ((parent->lastchild != NULL) && (parent->lastchild->type == NTYPE_CDATA))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
287 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
288 result = parent->lastchild;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
289 result->data = _xmlnode_merge(result->p, result->data, result->data_sz, CDATA, size);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
290 result->data_sz = result->data_sz + size;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
291 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
292 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
293 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
294 result = _xmlnode_insert(parent, "", NTYPE_CDATA);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
295 if (result != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
296 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
297 result->data = (char*)pmalloc(result->p, size + 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
298 memcpy(result->data, CDATA, size);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
299 result->data[size] = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
300 result->data_sz = size;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
301 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
302 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
303
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
304 return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
305 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
306
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
307
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
308 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
309 * xmlnode_get_tag -- find given tag in an xmlnode tree
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
310 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
311 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
312 * parent -- pointer to the parent tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
313 * name -- "name" for the child tag of that name
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
314 * "name/name" for a sub child (recurses)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
315 * "?attrib" to match the first tag with that attrib defined
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
316 * "?attrib=value" to match the first tag with that attrib and value
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
317 * or any combination: "name/name/?attrib", etc
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
318 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
319 * results
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
320 * a pointer to the tag matching search criteria
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
321 * or NULL if search was unsuccessfull
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
322 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
323 xmlnode xmlnode_get_tag(xmlnode parent, const char* name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
324 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
325 char *str, *slash, *qmark, *equals;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
326 xmlnode step, ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
327
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
328 if(parent == NULL || parent->firstchild == NULL || name == NULL || name == '\0') return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
329
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
330 if(strstr(name, "/") == NULL && strstr(name,"?") == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
331 return _xmlnode_search(parent->firstchild, name, NTYPE_TAG);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
332
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
333 /* jer's note: why can't I modify the name directly, why do I have to strdup it? damn c grrr! */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
334 str = strdup(name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
335 slash = strstr(str, "/");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
336 qmark = strstr(str, "?");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
337 equals = strstr(str, "=");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
338
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
339 if(qmark != NULL && (slash == NULL || qmark < slash))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
340 { /* of type ?attrib */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
341
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
342 *qmark = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
343 qmark++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
344 if(equals != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
345 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
346 *equals = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
347 equals++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
348 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
349
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
350 for(step = parent->firstchild; step != NULL; step = xmlnode_get_nextsibling(step))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
351 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
352 if(xmlnode_get_type(step) != NTYPE_TAG)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
353 continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
354
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
355 if(*str != '\0')
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
356 if(j_strcmp(xmlnode_get_name(step),str) != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
357 continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
358
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
359 if(xmlnode_get_attrib(step,qmark) == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
360 continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
361
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
362 if(equals != NULL && j_strcmp(xmlnode_get_attrib(step,qmark),equals) != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
363 continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
364
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
365 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
366 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
367
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
368 free(str);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
369 return step;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
370 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
371
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
372
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
373 *slash = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
374 ++slash;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
375
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
376 for(step = parent->firstchild; step != NULL; step = xmlnode_get_nextsibling(step))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
377 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
378 if(xmlnode_get_type(step) != NTYPE_TAG) continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
379
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
380 if(j_strcmp(xmlnode_get_name(step),str) != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
381 continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
382
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
383 ret = xmlnode_get_tag(step, slash);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
384 if(ret != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
385 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
386 free(str);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
387 return ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
388 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
389 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
390
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
391 free(str);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
392 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
393 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
394
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
395
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
396 /* return the cdata from any tag */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
397 char *xmlnode_get_tag_data(xmlnode parent, const char *name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
398 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
399 xmlnode tag;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
400
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
401 tag = xmlnode_get_tag(parent, name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
402 if(tag == NULL) return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
403
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
404 return xmlnode_get_data(tag);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
405 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
406
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
407
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
408 void xmlnode_put_attrib(xmlnode owner, const char* name, const char* value)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
409 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
410 xmlnode attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
411
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
412 if(owner == NULL || name == NULL || value == NULL) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
413
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
414 /* If there are no existing attributs, allocate a new one to start
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
415 the list */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
416 if (owner->firstattrib == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
417 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
418 attrib = _xmlnode_new(owner->p, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
419 owner->firstattrib = attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
420 owner->lastattrib = attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
421 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
422 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
423 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
424 attrib = _xmlnode_search(owner->firstattrib, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
425 if(attrib == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
426 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
427 attrib = _xmlnode_append_sibling(owner->lastattrib, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
428 owner->lastattrib = attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
429 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
430 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
431 /* Update the value of the attribute */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
432 attrib->data_sz = strlen(value);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
433 attrib->data = pstrdup(owner->p, value);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
434
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
435 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
436
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
437 char* xmlnode_get_attrib(xmlnode owner, const char* name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
438 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
439 xmlnode attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
440
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
441 if (owner != NULL && owner->firstattrib != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
442 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
443 attrib = _xmlnode_search(owner->firstattrib, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
444 if (attrib != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
445 return (char*)attrib->data;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
446 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
447 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
448 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
449
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
450 void xmlnode_put_vattrib(xmlnode owner, const char* name, void *value)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
451 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
452 xmlnode attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
453
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
454 if (owner != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
455 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
456 attrib = _xmlnode_search(owner->firstattrib, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
457 if (attrib == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
458 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
459 xmlnode_put_attrib(owner, name, "");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
460 attrib = _xmlnode_search(owner->firstattrib, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
461 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
462 if (attrib != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
463 attrib->firstchild = (xmlnode)value;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
464 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
465 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
466
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
467 void* xmlnode_get_vattrib(xmlnode owner, const char* name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
468 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
469 xmlnode attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
470
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
471 if (owner != NULL && owner->firstattrib != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
472 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
473 attrib = _xmlnode_search(owner->firstattrib, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
474 if (attrib != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
475 return (void*)attrib->firstchild;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
476 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
477 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
478 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
479
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
480 xmlnode xmlnode_get_firstattrib(xmlnode parent)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
481 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
482 if (parent != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
483 return parent->firstattrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
484 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
485 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
486
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
487 xmlnode xmlnode_get_firstchild(xmlnode parent)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
488 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
489 if (parent != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
490 return parent->firstchild;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
491 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
492 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
493
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
494 xmlnode xmlnode_get_lastchild(xmlnode parent)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
495 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
496 if (parent != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
497 return parent->lastchild;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
498 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
499 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
500
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
501 xmlnode xmlnode_get_nextsibling(xmlnode sibling)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
502 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
503 if (sibling != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
504 return sibling->next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
505 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
506 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
507
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
508 xmlnode xmlnode_get_prevsibling(xmlnode sibling)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
509 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
510 if (sibling != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
511 return sibling->prev;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
512 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
513 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
514
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
515 xmlnode xmlnode_get_parent(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
516 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
517 if (node != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
518 return node->parent;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
519 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
520 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
521
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
522 char* xmlnode_get_name(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
523 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
524 if (node != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
525 return node->name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
526 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
527 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
528
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
529 char* xmlnode_get_data(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
530 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
531 xmlnode cur;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
532
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
533 if(node == NULL) return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
534
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
535 if(xmlnode_get_type(node) == NTYPE_TAG) /* loop till we find a CDATA */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
536 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
537 for(cur = xmlnode_get_firstchild(node); cur != NULL; cur = xmlnode_get_nextsibling(cur))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
538 if(xmlnode_get_type(cur) == NTYPE_CDATA)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
539 return cur->data;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
540 }else{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
541 return node->data;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
542 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
543 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
544 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
545
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
546 int xmlnode_get_datasz(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
547 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
548 if (node != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
549 return node->data_sz;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
550 return (int)NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
551 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
552
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
553 int xmlnode_get_type(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
554 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
555 if (node != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
556 return node->type;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
557 return (int)NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
558 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
559
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
560 int xmlnode_has_children(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
561 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
562 if ((node != NULL) && (node->firstchild != NULL))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
563 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
564 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
565 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
566
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
567 int xmlnode_has_attribs(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
568 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
569 if ((node != NULL) && (node->firstattrib != NULL))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
570 return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
571 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
572 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
573
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
574 pool xmlnode_pool(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
575 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
576 if (node != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
577 return node->p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
578 return (pool)NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
579 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
580
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
581 void xmlnode_hide(xmlnode child)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
582 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
583 xmlnode parent;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
584
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
585 if(child == NULL || child->parent == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
586 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
587
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
588 parent = child->parent;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
589
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
590 /* first fix up at the child level */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
591 _xmlnode_hide_sibling(child);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
592
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
593 /* next fix up at the parent level */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
594 if(parent->firstchild == child)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
595 parent->firstchild = child->next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
596 if(parent->lastchild == child)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
597 parent->lastchild = child->prev;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
598 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
599
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
600 void xmlnode_hide_attrib(xmlnode parent, const char *name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
601 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
602 xmlnode attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
603
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
604 if(parent == NULL || parent->firstattrib == NULL || name == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
605 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
606
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
607 attrib = _xmlnode_search(parent->firstattrib, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
608 if(attrib == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
609 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
610
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
611 /* first fix up at the child level */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
612 _xmlnode_hide_sibling(attrib);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
613
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
614 /* next fix up at the parent level */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
615 if(parent->firstattrib == attrib)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
616 parent->firstattrib = attrib->next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
617 if(parent->lastattrib == attrib)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
618 parent->lastattrib = attrib->prev;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
619 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
620
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
621
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
622
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
623 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
624 * xmlnode2str -- convert given xmlnode tree into a string
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
625 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
626 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
627 * node -- pointer to the xmlnode structure
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
628 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
629 * results
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
630 * a pointer to the created string
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
631 * or NULL if it was unsuccessfull
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
632 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
633 char *xmlnode2str(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
634 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
635 return spool_print(_xmlnode2spool(node));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
636 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
637
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
638 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
639 * xmlnode2tstr -- convert given xmlnode tree into a newline terminated string
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
640 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
641 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
642 * node -- pointer to the xmlnode structure
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
643 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
644 * results
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
645 * a pointer to the created string
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
646 * or NULL if it was unsuccessfull
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
647 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
648 char* xmlnode2tstr(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
649 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
650 spool s = _xmlnode2spool(node);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
651 if (s != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
652 spool_add(s, "\n");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
653 return spool_print(s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
654 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
655
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
656
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
657 /* loop through both a and b comparing everything, attribs, cdata, children, etc */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
658 int xmlnode_cmp(xmlnode a, xmlnode b)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
659 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
660 int ret = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
661
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
662 while(1)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
663 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
664 if(a == NULL && b == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
665 return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
666
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
667 if(a == NULL || b == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
668 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
669
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
670 if(xmlnode_get_type(a) != xmlnode_get_type(b))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
671 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
672
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
673 switch(xmlnode_get_type(a))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
674 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
675 case NTYPE_ATTRIB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
676 ret = j_strcmp(xmlnode_get_name(a), xmlnode_get_name(b));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
677 if(ret != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
678 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
679 ret = j_strcmp(xmlnode_get_data(a), xmlnode_get_data(b));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
680 if(ret != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
681 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
682 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
683 case NTYPE_TAG:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
684 ret = j_strcmp(xmlnode_get_name(a), xmlnode_get_name(b));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
685 if(ret != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
686 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
687 ret = xmlnode_cmp(xmlnode_get_firstattrib(a), xmlnode_get_firstattrib(b));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
688 if(ret != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
689 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
690 ret = xmlnode_cmp(xmlnode_get_firstchild(a), xmlnode_get_firstchild(b));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
691 if(ret != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
692 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
693 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
694 case NTYPE_CDATA:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
695 ret = j_strcmp(xmlnode_get_data(a), xmlnode_get_data(b));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
696 if(ret != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
697 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
698 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
699 a = xmlnode_get_nextsibling(a);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
700 b = xmlnode_get_nextsibling(b);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
701 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
702 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
703
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
704
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
705 xmlnode xmlnode_insert_tag_node(xmlnode parent, xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
706 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
707 xmlnode child;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
708
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
709 child = xmlnode_insert_tag(parent, xmlnode_get_name(node));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
710 if (xmlnode_has_attribs(node))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
711 xmlnode_insert_node(child, xmlnode_get_firstattrib(node));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
712 if (xmlnode_has_children(node))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
713 xmlnode_insert_node(child, xmlnode_get_firstchild(node));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
714
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
715 return child;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
716 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
717
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
718 /* places copy of node and node's siblings in parent */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
719 void xmlnode_insert_node(xmlnode parent, xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
720 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
721 if(node == NULL || parent == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
722 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
723
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
724 while(node != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
725 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
726 switch(xmlnode_get_type(node))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
727 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
728 case NTYPE_ATTRIB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
729 xmlnode_put_attrib(parent, xmlnode_get_name(node), xmlnode_get_data(node));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
730 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
731 case NTYPE_TAG:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
732 xmlnode_insert_tag_node(parent, node);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
733 break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
734 case NTYPE_CDATA:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
735 xmlnode_insert_cdata(parent, xmlnode_get_data(node), xmlnode_get_datasz(node));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
736 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
737 node = xmlnode_get_nextsibling(node);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
738 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
739 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
740
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
741
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
742 /* produce full duplicate of x with a new pool, x must be a tag! */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
743 xmlnode xmlnode_dup(xmlnode x)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
744 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
745 xmlnode x2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
746
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
747 if(x == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
748 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
749
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
750 x2 = xmlnode_new_tag(xmlnode_get_name(x));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
751
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
752 if (xmlnode_has_attribs(x))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
753 xmlnode_insert_node(x2, xmlnode_get_firstattrib(x));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
754 if (xmlnode_has_children(x))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
755 xmlnode_insert_node(x2, xmlnode_get_firstchild(x));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
756
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
757 return x2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
758 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
759
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
760 xmlnode xmlnode_dup_pool(pool p, xmlnode x)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
761 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
762 xmlnode x2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
763
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
764 if(x == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
765 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
766
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
767 x2 = xmlnode_new_tag_pool(p, xmlnode_get_name(x));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
768
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
769 if (xmlnode_has_attribs(x))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
770 xmlnode_insert_node(x2, xmlnode_get_firstattrib(x));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
771 if (xmlnode_has_children(x))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
772 xmlnode_insert_node(x2, xmlnode_get_firstchild(x));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
773
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
774 return x2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
775 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
776
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
777 xmlnode xmlnode_wrap(xmlnode x,const char *wrapper)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
778 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
779 xmlnode wrap;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
780 if(x==NULL||wrapper==NULL) return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
781 wrap=xmlnode_new_tag_pool(xmlnode_pool(x),wrapper);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
782 if(wrap==NULL) return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
783 wrap->firstchild=x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
784 wrap->lastchild=x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
785 x->parent=wrap;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
786 return wrap;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
787 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
788
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
789 void xmlnode_free(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
790 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
791 if(node == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
792 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
793
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
794 pool_free(node->p);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
795 }