Implemented tree cloning and adding

This commit is contained in:
2005-04-19 21:43:33 +00:00
parent 7365c4b122
commit 71f64d36a7
2 changed files with 131 additions and 2 deletions
+124 -2
View File
@@ -37,6 +37,9 @@
deleting nodes.
$Log$
Revision 1.8 2005/04/19 21:43:33 ritt
Implemented tree cloning and adding
Revision 1.7 2005/04/06 11:17:02 ritt
Nodes can now have values AND subnodes
@@ -681,6 +684,69 @@ PMXML_NODE mxml_add_node_at(PMXML_NODE parent, char *node_name, char *value, int
/*------------------------------------------------------------------*/
int mxml_add_tree_at(PMXML_NODE parent, PMXML_NODE tree, int index)
/* add a whole node tree to an existing parent node at a specific position */
{
PMXML_NODE pchild;
int i, j;
assert(parent);
assert(tree);
if (parent->n_children == 0)
parent->child = (PMXML_NODE)malloc(sizeof(MXML_NODE));
else {
pchild = parent->child;
parent->child = (PMXML_NODE)realloc(parent->child, sizeof(MXML_NODE)*(parent->n_children+1));
if (parent->child != pchild) {
/* correct parent pointer for children */
for (i=0 ; i<parent->n_children ; i++) {
pchild = parent->child+i;
for (j=0 ; j<pchild->n_children ; j++)
pchild->child[j].parent = pchild;
}
}
}
assert(parent->child);
if (index < parent->n_children)
for (i=parent->n_children ; i > index ; i--) {
/* move following nodes one down */
memcpy(&parent->child[i], &parent->child[i-1], sizeof(MXML_NODE));
/* correct parent pointer for children */
for (i=0 ; i<parent->n_children ; i++) {
pchild = parent->child+i;
for (j=0 ; j<pchild->n_children ; j++)
pchild->child[j].parent = pchild;
}
}
/* initialize new node */
memcpy(parent->child+index, tree, sizeof(MXML_NODE));
parent->n_children++;
parent->child[index].parent = parent;
/* correct parent pointer for children */
for (i=0 ; i<parent->n_children ; i++) {
pchild = parent->child+i;
for (j=0 ; j<pchild->n_children ; j++)
pchild->child[j].parent = pchild;
}
return TRUE;
}
/*------------------------------------------------------------------*/
int mxml_add_tree(PMXML_NODE parent, PMXML_NODE tree)
/* add a whole node tree to an existing parent node at the end */
{
return mxml_add_tree_at(parent, tree, parent->n_children);
}
/*------------------------------------------------------------------*/
int mxml_add_attribute(PMXML_NODE pnode, char *attrib_name, char *attrib_value)
/* add an attribute to an existing node */
{
@@ -954,10 +1020,14 @@ int mxml_replace_node_value(PMXML_NODE pnode, char *value)
{
if (pnode->value)
pnode->value = (char *)realloc(pnode->value, strlen(value)+1);
else
else if (value)
pnode->value = (char *)malloc(strlen(value)+1);
else
pnode->value = NULL;
strcpy(pnode->value, value);
if (value)
strcpy(pnode->value, value);
return TRUE;
}
@@ -1490,6 +1560,34 @@ int mxml_write_tree(char *file_name, PMXML_NODE tree)
/*------------------------------------------------------------------*/
PMXML_NODE mxml_clone_tree(PMXML_NODE tree)
{
PMXML_NODE clone;
int i;
clone = (PMXML_NODE)calloc(sizeof(MXML_NODE), 1);
/* copy name, node_type, n_attributes and n_children */
memcpy(clone, tree, sizeof(MXML_NODE));
clone->value = NULL;
mxml_replace_node_value(clone, tree->value);
clone->attribute_name = NULL;
clone->attribute_value = NULL;
for (i=0 ; i<tree->n_attributes ; i++)
mxml_add_attribute(clone, tree->attribute_name+i*MXML_NAME_LENGTH, tree->attribute_value[i]);
clone->child = NULL;
clone->n_children = 0;
for (i=0 ; i<tree->n_children ; i++)
mxml_add_tree(clone, mxml_clone_tree(mxml_subnode(tree, i)));
return clone;
}
/*------------------------------------------------------------------*/
void mxml_debug_tree(PMXML_NODE tree, int level)
/* print XML tree for debugging */
{
@@ -1561,3 +1659,27 @@ void mxml_free_tree(PMXML_NODE tree)
}
/*------------------------------------------------------------------*/
/*
void mxml_test()
{
char err[256];
PMXML_NODE tree, tree2, node;
tree = mxml_parse_file("c:\\tmp\\test.xml", err, sizeof(err));
tree2 = mxml_clone_tree(tree);
printf("Orig:\n");
mxml_debug_tree(tree, 0);
printf("\nClone:\n");
mxml_debug_tree(tree2, 0);
printf("\nCombined:\n");
node = mxml_find_node(tree2, "cddb");
mxml_add_tree(tree, node);
mxml_debug_tree(tree, 0);
mxml_free_tree(tree);
}
*/
+7
View File
@@ -6,6 +6,9 @@
Contents: Header file for mxml.c
$Log$
Revision 1.5 2005/04/19 21:43:33 ritt
Implemented tree cloning and adding
Revision 1.4 2005/04/06 11:17:02 ritt
Nodes can now have values AND subnodes
@@ -85,6 +88,10 @@ PMXML_NODE mxml_add_special_node_at(PMXML_NODE parent, int node_type, char *node
PMXML_NODE mxml_add_node(PMXML_NODE parent, char *node_name, char *value);
PMXML_NODE mxml_add_node_at(PMXML_NODE parent, char *node_name, char *value, int index);
PMXML_NODE mxml_clone_tree(PMXML_NODE tree);
int mxml_add_tree(PMXML_NODE parent, PMXML_NODE tree);
int mxml_add_tree_at(PMXML_NODE parent, PMXML_NODE tree, int index);
int mxml_replace_node_name(PMXML_NODE pnode, char *new_name);
int mxml_replace_node_value(PMXML_NODE pnode, char *value);
int mxml_replace_subvalue(PMXML_NODE pnode, char *name, char *value);