annotate mcabber/libjabber/xmlnode.c @ 522:fdd1637db7f3

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