comparison src/xmlnode.c @ 8135:8f4ce853e685

[gaim-migrate @ 8840] created a convenience function, and used it. a lot. committer: Tailor Script <tailor@pidgin.im>
author Nathan Walp <nwalp@pidgin.im>
date Sat, 17 Jan 2004 19:36:29 +0000
parents fa6395637e2c
children b55b70aef314
comparison
equal deleted inserted replaced
8134:ea3eb461efc0 8135:8f4ce853e685
33 #include <glib.h> 33 #include <glib.h>
34 34
35 #include "xmlnode.h" 35 #include "xmlnode.h"
36 36
37 static xmlnode* 37 static xmlnode*
38 new_node(const char *name, NodeType type) 38 new_node(const char *name, XMLNodeType type)
39 { 39 {
40 xmlnode *node = g_new0(xmlnode, 1); 40 xmlnode *node = g_new0(xmlnode, 1);
41 if(name) 41 if(name)
42 node->name = g_strdup(name); 42 node->name = g_strdup(name);
43 node->type = type; 43 node->type = type;
48 xmlnode* 48 xmlnode*
49 xmlnode_new(const char *name) 49 xmlnode_new(const char *name)
50 { 50 {
51 g_return_val_if_fail(name != NULL, NULL); 51 g_return_val_if_fail(name != NULL, NULL);
52 52
53 return new_node(name, NODE_TYPE_TAG); 53 return new_node(name, XMLNODE_TYPE_TAG);
54 } 54 }
55 55
56 xmlnode *xmlnode_new_child(xmlnode *parent, const char *name) 56 xmlnode *xmlnode_new_child(xmlnode *parent, const char *name)
57 { 57 {
58 xmlnode *node; 58 xmlnode *node;
59 59
60 g_return_val_if_fail(parent != NULL, NULL); 60 g_return_val_if_fail(parent != NULL, NULL);
61 g_return_val_if_fail(name != NULL, NULL); 61 g_return_val_if_fail(name != NULL, NULL);
62 62
63 node = new_node(name, NODE_TYPE_TAG); 63 node = new_node(name, XMLNODE_TYPE_TAG);
64 64
65 xmlnode_insert_child(parent, node); 65 xmlnode_insert_child(parent, node);
66 66
67 return node; 67 return node;
68 } 68 }
94 g_return_if_fail(data != NULL); 94 g_return_if_fail(data != NULL);
95 g_return_if_fail(size != 0); 95 g_return_if_fail(size != 0);
96 96
97 real_size = size == -1 ? strlen(data) : size; 97 real_size = size == -1 ? strlen(data) : size;
98 98
99 node = new_node(NULL, NODE_TYPE_DATA); 99 node = new_node(NULL, XMLNODE_TYPE_DATA);
100 100
101 node->data = g_memdup(data, real_size); 101 node->data = g_memdup(data, real_size);
102 node->data_sz = real_size; 102 node->data_sz = real_size;
103 103
104 xmlnode_insert_child(parent, node); 104 xmlnode_insert_child(parent, node);
112 g_return_if_fail(node != NULL); 112 g_return_if_fail(node != NULL);
113 g_return_if_fail(attr != NULL); 113 g_return_if_fail(attr != NULL);
114 114
115 for(attr_node = node->child; attr_node; attr_node = attr_node->next) 115 for(attr_node = node->child; attr_node; attr_node = attr_node->next)
116 { 116 {
117 if(attr_node->type == NODE_TYPE_ATTRIB && 117 if(attr_node->type == XMLNODE_TYPE_ATTRIB &&
118 !strcmp(attr_node->name, attr)) { 118 !strcmp(attr_node->name, attr)) {
119 if(node->child == attr_node) { 119 if(node->child == attr_node) {
120 node->child = attr_node->next; 120 node->child = attr_node->next;
121 } else { 121 } else {
122 sibling->next = attr_node->next; 122 sibling->next = attr_node->next;
137 g_return_if_fail(attr != NULL); 137 g_return_if_fail(attr != NULL);
138 g_return_if_fail(value != NULL); 138 g_return_if_fail(value != NULL);
139 139
140 xmlnode_remove_attrib(node, attr); 140 xmlnode_remove_attrib(node, attr);
141 141
142 attrib_node = new_node(attr, NODE_TYPE_ATTRIB); 142 attrib_node = new_node(attr, XMLNODE_TYPE_ATTRIB);
143 143
144 attrib_node->data = g_strdup(value); 144 attrib_node->data = g_strdup(value);
145 145
146 xmlnode_insert_child(node, attrib_node); 146 xmlnode_insert_child(node, attrib_node);
147 } 147 }
152 xmlnode *x; 152 xmlnode *x;
153 153
154 g_return_val_if_fail(node != NULL, NULL); 154 g_return_val_if_fail(node != NULL, NULL);
155 155
156 for(x = node->child; x; x = x->next) { 156 for(x = node->child; x; x = x->next) {
157 if(x->type == NODE_TYPE_ATTRIB && !strcmp(attr, x->name)) { 157 if(x->type == XMLNODE_TYPE_ATTRIB && !strcmp(attr, x->name)) {
158 return x->data; 158 return x->data;
159 } 159 }
160 } 160 }
161 161
162 return NULL; 162 return NULL;
194 names = g_strsplit(name, "/", 2); 194 names = g_strsplit(name, "/", 2);
195 parent_name = names[0]; 195 parent_name = names[0];
196 child_name = names[1]; 196 child_name = names[1];
197 197
198 for(x = parent->child; x; x = x->next) { 198 for(x = parent->child; x; x = x->next) {
199 if(x->type == NODE_TYPE_TAG && name && !strcmp(parent_name, x->name)) { 199 if(x->type == XMLNODE_TYPE_TAG && name && !strcmp(parent_name, x->name)) {
200 ret = x; 200 ret = x;
201 break; 201 break;
202 } 202 }
203 } 203 }
204 204
218 218
219 g_return_val_if_fail(node != NULL, NULL); 219 g_return_val_if_fail(node != NULL, NULL);
220 220
221 221
222 for(c = node->child; c; c = c->next) { 222 for(c = node->child; c; c = c->next) {
223 if(c->type == NODE_TYPE_DATA) { 223 if(c->type == XMLNODE_TYPE_DATA) {
224 if(!str) 224 if(!str)
225 str = g_string_new(""); 225 str = g_string_new("");
226 str = g_string_append_len(str, c->data, c->data_sz); 226 str = g_string_append_len(str, c->data, c->data_sz);
227 } 227 }
228 } 228 }
247 g_string_append_printf(text, "<%s", node_name); 247 g_string_append_printf(text, "<%s", node_name);
248 248
249 249
250 for(c = node->child; c; c = c->next) 250 for(c = node->child; c; c = c->next)
251 { 251 {
252 if(c->type == NODE_TYPE_ATTRIB) { 252 if(c->type == XMLNODE_TYPE_ATTRIB) {
253 esc = g_markup_escape_text(c->name, -1); 253 esc = g_markup_escape_text(c->name, -1);
254 esc2 = g_markup_escape_text(c->data, -1); 254 esc2 = g_markup_escape_text(c->data, -1);
255 g_string_append_printf(text, " %s='%s'", esc, esc2); 255 g_string_append_printf(text, " %s='%s'", esc, esc2);
256 g_free(esc); 256 g_free(esc);
257 g_free(esc2); 257 g_free(esc2);
258 } else if(c->type == NODE_TYPE_TAG || c->type == NODE_TYPE_DATA) { 258 } else if(c->type == XMLNODE_TYPE_TAG || c->type == XMLNODE_TYPE_DATA) {
259 need_end = TRUE; 259 need_end = TRUE;
260 } 260 }
261 } 261 }
262 262
263 if(need_end) { 263 if(need_end) {
264 text = g_string_append_c(text, '>'); 264 text = g_string_append_c(text, '>');
265 265
266 for(c = node->child; c; c = c->next) 266 for(c = node->child; c; c = c->next)
267 { 267 {
268 if(c->type == NODE_TYPE_TAG) { 268 if(c->type == XMLNODE_TYPE_TAG) {
269 int esc_len; 269 int esc_len;
270 esc = xmlnode_to_str(c, &esc_len); 270 esc = xmlnode_to_str(c, &esc_len);
271 text = g_string_append_len(text, esc, esc_len); 271 text = g_string_append_len(text, esc, esc_len);
272 g_free(esc); 272 g_free(esc);
273 } else if(c->type == NODE_TYPE_DATA) { 273 } else if(c->type == XMLNODE_TYPE_DATA) {
274 esc = g_markup_escape_text(c->data, c->data_sz); 274 esc = g_markup_escape_text(c->data, c->data_sz);
275 text = g_string_append(text, esc); 275 text = g_string_append(text, esc);
276 g_free(esc); 276 g_free(esc);
277 } 277 }
278 } 278 }
378 378
379 ret = xpd->current; 379 ret = xpd->current;
380 g_free(xpd); 380 g_free(xpd);
381 return ret; 381 return ret;
382 } 382 }
383
384 xmlnode *xmlnode_copy(xmlnode *src)
385 {
386 xmlnode *ret;
387 xmlnode *child;
388 xmlnode *sibling = NULL;
389
390 if(!src)
391 return NULL;
392
393 ret = new_node(src->name, src->type);
394 if(src->data) {
395 ret->data = g_memdup(src->data, src->data_sz);
396 ret->data_sz = src->data_sz;
397 }
398
399 for(child = src->child; child; child = child->next) {
400 if(sibling) {
401 sibling->next = xmlnode_copy(child);
402 sibling = sibling->next;
403 } else {
404 ret->child = xmlnode_copy(child);
405 sibling = ret->child;
406 }
407 sibling->parent = ret;
408 }
409
410 return ret;
411 }
412
413 xmlnode *xmlnode_get_next_twin(xmlnode *node) {
414 xmlnode *sibling;
415
416 g_return_val_if_fail(node != NULL, NULL);
417 g_return_val_if_fail(node->type == XMLNODE_TYPE_TAG, NULL);
418
419 for(sibling = node->next; sibling; sibling = sibling->next) {
420 if(sibling->type == XMLNODE_TYPE_TAG && !strcmp(node->name, sibling->name))
421 return sibling;
422 }
423
424 return NULL;
425 }
426