From 2954197c2e645ba6c56840ebc8bc68631c9eaedd Mon Sep 17 00:00:00 2001 From: Stefan Ritt Date: Thu, 24 Mar 2005 22:56:06 +0000 Subject: [PATCH] Omit root node SVN revision: 1279 --- src/mxml.c | 61 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/src/mxml.c b/src/mxml.c index 86a44f84..d0356deb 100755 --- a/src/mxml.c +++ b/src/mxml.c @@ -71,6 +71,8 @@ #include "mxml.h" +#define XML_INDENT " " + /*------------------------------------------------------------------*/ #ifdef HAVE_STRLCPY @@ -343,7 +345,7 @@ int mxml_start_element(MXML_WRITER *writer, const char *name) line[0] = 0; for (i=0 ; ilevel ; i++) - strlcat(line, " ", sizeof(line)); + strlcat(line, XML_INDENT, sizeof(line)); strlcat(line, "<", sizeof(line)); strlcpy(name_enc, name, sizeof(name_enc)); mxml_encode(name_enc, sizeof(name_enc)); @@ -390,7 +392,7 @@ int mxml_end_element(MXML_WRITER *writer) line[0] = 0; if (!writer->data_was_written) { for (i=0 ; ilevel ; i++) - strlcat(line, " ", sizeof(line)); + strlcat(line, XML_INDENT, sizeof(line)); } strlcat(line, "name, "root"); + strcpy(root->name, name); return root; } @@ -784,6 +786,14 @@ PMXML_NODE mxml_find_node(PMXML_NODE tree, char *xml_path) /*------------------------------------------------------------------*/ +char *mxml_get_name(PMXML_NODE pnode) +{ + assert(pnode); + return pnode->name; +} + +/*------------------------------------------------------------------*/ + char *mxml_get_value(PMXML_NODE pnode) { assert(pnode); @@ -961,7 +971,10 @@ PMXML_NODE read_error(PMXML_NODE root, char *file_name, int line_number, char *e char *msg, str[1000]; va_list argptr; - sprintf(str, "XML read error in file \"%s\", line %d: ", file_name, line_number); + if (file_name && file_name[0]) + sprintf(str, "XML read error in file \"%s\", line %d: ", file_name, line_number); + else + sprintf(str, "XML read error, line %d: ", line_number); msg = (char *)malloc(error_size); strlcpy(error, str, error_size); @@ -978,7 +991,7 @@ PMXML_NODE read_error(PMXML_NODE root, char *file_name, int line_number, char *e /*------------------------------------------------------------------*/ -PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size, char *file_name) +PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size) /* parse a XML buffer and convert it into a tree of MXML_NODE's. Return NULL in case of an error, return error description. Optional file_name is used for error reporting if called from mxml_parse_file() */ @@ -989,15 +1002,12 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size, char *file_ PMXML_NODE root, ptree, pnew; int end_element; size_t len; + char *file_name = NULL; // dummy for 'HERE' p = buf; line_number = 1; - root = mxml_create_root_node(); - ptree = root; - - /* store filename in attribute */ - mxml_add_attribute(root, "filename", file_name); + root = ptree = NULL; /* parse file contents */ do { @@ -1073,6 +1083,9 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size, char *file_ if (end_element) { + if (!ptree) + return read_error(HERE, "Found unexpected ", node_name); + /* close previously opened element */ if (strcmp(ptree->name, node_name) != 0) return read_error(HERE, "Found , expected ", node_name, ptree->name); @@ -1082,8 +1095,14 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size, char *file_ } else { + if (root != NULL && ptree == NULL) + return read_error(HERE, "Unexpected second top level node"); + /* allocate new element structure in parent tree */ - pnew = mxml_add_node(ptree, node_name, NULL); + if (root == NULL) { + pnew = ptree = root = mxml_create_root_node(node_name); + } else + pnew = mxml_add_node(ptree, node_name, NULL); while (*p && isspace(*p)) { if (*p == '\n') @@ -1268,7 +1287,7 @@ PMXML_NODE mxml_parse_file(char *file_name, char *error, int error_size) buf[length] = 0; close(fh); - root = mxml_parse_buffer(buf, error, error_size, file_name); + root = mxml_parse_buffer(buf, error, error_size); free(buf); @@ -1304,16 +1323,14 @@ int mxml_write_tree(char *file_name, PMXML_NODE tree) /* write a complete XML tree to a file */ { MXML_WRITER *writer; - int i; assert(tree); writer = mxml_open_file(file_name); if (!writer) return FALSE; - for (i=0 ; in_children ; i++) - if (!mxml_write_subtree(writer, &tree->child[i])) - return FALSE; + if (!mxml_write_subtree(writer, tree)) + return FALSE; if (!mxml_close_file(writer)) return FALSE; @@ -1326,7 +1343,7 @@ int 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; + int i, j; for (i=0 ; ivalue); + + for (j=0 ; jn_attributes ; j++) { + for (i=0 ; iattribute_name+j*MXML_NAME_LENGTH, + tree->attribute_value[j]); + } + for (i=0 ; i