Mercurial > pidgin
diff 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 |
line wrap: on
line diff
--- a/src/xmlnode.c Sat Jan 17 19:21:39 2004 +0000 +++ b/src/xmlnode.c Sat Jan 17 19:36:29 2004 +0000 @@ -35,7 +35,7 @@ #include "xmlnode.h" static xmlnode* -new_node(const char *name, NodeType type) +new_node(const char *name, XMLNodeType type) { xmlnode *node = g_new0(xmlnode, 1); if(name) @@ -50,7 +50,7 @@ { g_return_val_if_fail(name != NULL, NULL); - return new_node(name, NODE_TYPE_TAG); + return new_node(name, XMLNODE_TYPE_TAG); } xmlnode *xmlnode_new_child(xmlnode *parent, const char *name) @@ -60,7 +60,7 @@ g_return_val_if_fail(parent != NULL, NULL); g_return_val_if_fail(name != NULL, NULL); - node = new_node(name, NODE_TYPE_TAG); + node = new_node(name, XMLNODE_TYPE_TAG); xmlnode_insert_child(parent, node); @@ -96,7 +96,7 @@ real_size = size == -1 ? strlen(data) : size; - node = new_node(NULL, NODE_TYPE_DATA); + node = new_node(NULL, XMLNODE_TYPE_DATA); node->data = g_memdup(data, real_size); node->data_sz = real_size; @@ -114,7 +114,7 @@ for(attr_node = node->child; attr_node; attr_node = attr_node->next) { - if(attr_node->type == NODE_TYPE_ATTRIB && + if(attr_node->type == XMLNODE_TYPE_ATTRIB && !strcmp(attr_node->name, attr)) { if(node->child == attr_node) { node->child = attr_node->next; @@ -139,7 +139,7 @@ xmlnode_remove_attrib(node, attr); - attrib_node = new_node(attr, NODE_TYPE_ATTRIB); + attrib_node = new_node(attr, XMLNODE_TYPE_ATTRIB); attrib_node->data = g_strdup(value); @@ -154,7 +154,7 @@ g_return_val_if_fail(node != NULL, NULL); for(x = node->child; x; x = x->next) { - if(x->type == NODE_TYPE_ATTRIB && !strcmp(attr, x->name)) { + if(x->type == XMLNODE_TYPE_ATTRIB && !strcmp(attr, x->name)) { return x->data; } } @@ -196,7 +196,7 @@ child_name = names[1]; for(x = parent->child; x; x = x->next) { - if(x->type == NODE_TYPE_TAG && name && !strcmp(parent_name, x->name)) { + if(x->type == XMLNODE_TYPE_TAG && name && !strcmp(parent_name, x->name)) { ret = x; break; } @@ -220,7 +220,7 @@ for(c = node->child; c; c = c->next) { - if(c->type == NODE_TYPE_DATA) { + if(c->type == XMLNODE_TYPE_DATA) { if(!str) str = g_string_new(""); str = g_string_append_len(str, c->data, c->data_sz); @@ -249,13 +249,13 @@ for(c = node->child; c; c = c->next) { - if(c->type == NODE_TYPE_ATTRIB) { + if(c->type == XMLNODE_TYPE_ATTRIB) { esc = g_markup_escape_text(c->name, -1); esc2 = g_markup_escape_text(c->data, -1); g_string_append_printf(text, " %s='%s'", esc, esc2); g_free(esc); g_free(esc2); - } else if(c->type == NODE_TYPE_TAG || c->type == NODE_TYPE_DATA) { + } else if(c->type == XMLNODE_TYPE_TAG || c->type == XMLNODE_TYPE_DATA) { need_end = TRUE; } } @@ -265,12 +265,12 @@ for(c = node->child; c; c = c->next) { - if(c->type == NODE_TYPE_TAG) { + if(c->type == XMLNODE_TYPE_TAG) { int esc_len; esc = xmlnode_to_str(c, &esc_len); text = g_string_append_len(text, esc, esc_len); g_free(esc); - } else if(c->type == NODE_TYPE_DATA) { + } else if(c->type == XMLNODE_TYPE_DATA) { esc = g_markup_escape_text(c->data, c->data_sz); text = g_string_append(text, esc); g_free(esc); @@ -380,3 +380,47 @@ g_free(xpd); return ret; } + +xmlnode *xmlnode_copy(xmlnode *src) +{ + xmlnode *ret; + xmlnode *child; + xmlnode *sibling = NULL; + + if(!src) + return NULL; + + ret = new_node(src->name, src->type); + if(src->data) { + ret->data = g_memdup(src->data, src->data_sz); + ret->data_sz = src->data_sz; + } + + for(child = src->child; child; child = child->next) { + if(sibling) { + sibling->next = xmlnode_copy(child); + sibling = sibling->next; + } else { + ret->child = xmlnode_copy(child); + sibling = ret->child; + } + sibling->parent = ret; + } + + return ret; +} + +xmlnode *xmlnode_get_next_twin(xmlnode *node) { + xmlnode *sibling; + + g_return_val_if_fail(node != NULL, NULL); + g_return_val_if_fail(node->type == XMLNODE_TYPE_TAG, NULL); + + for(sibling = node->next; sibling; sibling = sibling->next) { + if(sibling->type == XMLNODE_TYPE_TAG && !strcmp(node->name, sibling->name)) + return sibling; + } + + return NULL; +} +