From 71f29f56d278dacc4739795f603089441f6dca05 Mon Sep 17 00:00:00 2001 From: Stefan Ritt Date: Thu, 3 Mar 2005 15:34:40 +0000 Subject: [PATCH] Implemented mxml_debug_tree() SVN revision: 1234 --- src/mxml.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/mxml.h | 5 +++++ 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/src/mxml.c b/src/mxml.c index bf10ef5f..b3310c92 100755 --- a/src/mxml.c +++ b/src/mxml.c @@ -6,6 +6,9 @@ Contents: Midas XML Library $Log$ + Revision 1.3 2005/03/03 15:34:21 ritt + Implemented mxml_debug_tree() + Revision 1.2 2005/03/01 23:55:43 ritt Fixed compiler warnings @@ -342,13 +345,25 @@ PMXML_NODE mxml_create_root_node() PMXML_NODE mxml_add_node(PMXML_NODE parent, char *node_name, char *value) /* add a subnode (child) to an existing parent node */ { - PMXML_NODE pnode; + PMXML_NODE pnode, pchild; + int i, j; assert(parent); if (parent->n_children == 0) parent->child = malloc(sizeof(MXML_NODE)); - else + else { + pchild = parent->child; parent->child = realloc(parent->child, sizeof(MXML_NODE)*(parent->n_children+1)); + + if (parent->child != pchild) { + /* correct parent pointer for children */ + for (i=0 ; in_children ; i++) { + pchild = parent->child+i; + for (j=0 ; jn_children ; j++) + pchild->child[j].parent = pchild; + } + } + } assert(parent->child); pnode = &parent->child[parent->n_children]; memset(pnode, 0, sizeof(MXML_NODE)); @@ -397,6 +412,17 @@ int mxml_get_number_of_children(PMXML_NODE pnode) /*------------------------------------------------------------------*/ +PMXML_NODE mxml_subnode(PMXML_NODE pnode, int index) +/* return number of subnodes (children) of a node */ +{ + assert(pnode); + if (index < pnode->n_children) + return &pnode->child[index]; + return NULL; +} + +/*------------------------------------------------------------------*/ + PMXML_NODE mxml_find_node(PMXML_NODE tree, char *xml_path) /* Search for a specific XML node with a subset of XPATH specifications. @@ -1025,6 +1051,33 @@ BOOL mxml_write_tree(char *file_name, PMXML_NODE tree) /*------------------------------------------------------------------*/ +void mxml_debug_tree(PMXML_NODE tree, int level) +/* print XML tree for debugging */ +{ + int i; + + for (i=0 ; iname); + for (i=0 ; iparent); + for (i=0 ; in_children); + + for (i=0 ; in_children ; i++) + mxml_debug_tree(tree->child+i, level+1); + + if (level == 0) + printf("\n"); +} + +/*------------------------------------------------------------------*/ + void mxml_free_tree(PMXML_NODE tree) /* free memory of XML tree, must be called after any mxml_create_root_node() or mxml_parse_file() */ diff --git a/src/mxml.h b/src/mxml.h index a5f4dfb6..9cc221e7 100755 --- a/src/mxml.h +++ b/src/mxml.h @@ -6,6 +6,9 @@ Contents: Header file for mxml.c $Log$ + Revision 1.2 2005/03/03 15:34:40 ritt + Implemented mxml_debug_tree() + Revision 1.1 2005/03/01 23:48:18 ritt Implemented MXML for password file @@ -47,6 +50,7 @@ BOOL mxml_write_value(MXML_WRITER *writer, const char *value); BOOL mxml_close_document(MXML_WRITER *writer); int mxml_get_number_of_children(PMXML_NODE pnode); +PMXML_NODE mxml_subnode(PMXML_NODE pnode, int index); PMXML_NODE mxml_find_node(PMXML_NODE tree, char *xml_path); char *mxml_get_value(PMXML_NODE pnode); char *mxml_get_attribute(PMXML_NODE pnode, char *name); @@ -66,6 +70,7 @@ BOOL mxml_delete_attribute(PMXML_NODE, char *attrib_name); PMXML_NODE mxml_create_root_node(); PMXML_NODE mxml_parse_file(char *file_name, char *error, int error_size); BOOL mxml_write_tree(char *file_name, PMXML_NODE tree); +void mxml_debug_tree(PMXML_NODE tree, int level); void mxml_free_tree(PMXML_NODE tree); /*------------------------------------------------------------------*/