Omit root node

SVN revision: 1279
This commit is contained in:
Stefan Ritt 2005-03-24 22:56:06 +00:00
parent 3642174a39
commit 2954197c2e

View File

@ -71,6 +71,8 @@
#include "mxml.h" #include "mxml.h"
#define XML_INDENT " "
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
#ifdef HAVE_STRLCPY #ifdef HAVE_STRLCPY
@ -343,7 +345,7 @@ int mxml_start_element(MXML_WRITER *writer, const char *name)
line[0] = 0; line[0] = 0;
for (i=0 ; i<writer->level ; i++) for (i=0 ; i<writer->level ; i++)
strlcat(line, " ", sizeof(line)); strlcat(line, XML_INDENT, sizeof(line));
strlcat(line, "<", sizeof(line)); strlcat(line, "<", sizeof(line));
strlcpy(name_enc, name, sizeof(name_enc)); strlcpy(name_enc, name, sizeof(name_enc));
mxml_encode(name_enc, sizeof(name_enc)); mxml_encode(name_enc, sizeof(name_enc));
@ -390,7 +392,7 @@ int mxml_end_element(MXML_WRITER *writer)
line[0] = 0; line[0] = 0;
if (!writer->data_was_written) { if (!writer->data_was_written) {
for (i=0 ; i<writer->level ; i++) for (i=0 ; i<writer->level ; i++)
strlcat(line, " ", sizeof(line)); strlcat(line, XML_INDENT, sizeof(line));
} }
strlcat(line, "</", sizeof(line)); strlcat(line, "</", sizeof(line));
@ -500,13 +502,13 @@ int mxml_close_file(MXML_WRITER *writer)
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
PMXML_NODE mxml_create_root_node() PMXML_NODE mxml_create_root_node(char *name)
/* create root node of an XML tree */ /* create root node of an XML tree */
{ {
PMXML_NODE root; PMXML_NODE root;
root = (PMXML_NODE)calloc(sizeof(MXML_NODE), 1); root = (PMXML_NODE)calloc(sizeof(MXML_NODE), 1);
strcpy(root->name, "root"); strcpy(root->name, name);
return root; 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) char *mxml_get_value(PMXML_NODE pnode)
{ {
assert(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]; char *msg, str[1000];
va_list argptr; 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); msg = (char *)malloc(error_size);
strlcpy(error, str, 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 /* 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 in case of an error, return error description. Optional file_name is used
for error reporting if called from mxml_parse_file() */ 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; PMXML_NODE root, ptree, pnew;
int end_element; int end_element;
size_t len; size_t len;
char *file_name = NULL; // dummy for 'HERE'
p = buf; p = buf;
line_number = 1; line_number = 1;
root = mxml_create_root_node(); root = ptree = NULL;
ptree = root;
/* store filename in attribute */
mxml_add_attribute(root, "filename", file_name);
/* parse file contents */ /* parse file contents */
do { do {
@ -1073,6 +1083,9 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size, char *file_
if (end_element) { if (end_element) {
if (!ptree)
return read_error(HERE, "Found unexpected </%s>", node_name);
/* close previously opened element */ /* close previously opened element */
if (strcmp(ptree->name, node_name) != 0) if (strcmp(ptree->name, node_name) != 0)
return read_error(HERE, "Found </%s>, expected </%s>", node_name, ptree->name); return read_error(HERE, "Found </%s>, expected </%s>", node_name, ptree->name);
@ -1082,8 +1095,14 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size, char *file_
} else { } else {
if (root != NULL && ptree == NULL)
return read_error(HERE, "Unexpected second top level node");
/* allocate new element structure in parent tree */ /* 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)) { while (*p && isspace(*p)) {
if (*p == '\n') if (*p == '\n')
@ -1268,7 +1287,7 @@ PMXML_NODE mxml_parse_file(char *file_name, char *error, int error_size)
buf[length] = 0; buf[length] = 0;
close(fh); close(fh);
root = mxml_parse_buffer(buf, error, error_size, file_name); root = mxml_parse_buffer(buf, error, error_size);
free(buf); free(buf);
@ -1304,16 +1323,14 @@ int mxml_write_tree(char *file_name, PMXML_NODE tree)
/* write a complete XML tree to a file */ /* write a complete XML tree to a file */
{ {
MXML_WRITER *writer; MXML_WRITER *writer;
int i;
assert(tree); assert(tree);
writer = mxml_open_file(file_name); writer = mxml_open_file(file_name);
if (!writer) if (!writer)
return FALSE; return FALSE;
for (i=0 ; i<tree->n_children ; i++) if (!mxml_write_subtree(writer, tree))
if (!mxml_write_subtree(writer, &tree->child[i])) return FALSE;
return FALSE;
if (!mxml_close_file(writer)) if (!mxml_close_file(writer))
return FALSE; 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) void mxml_debug_tree(PMXML_NODE tree, int level)
/* print XML tree for debugging */ /* print XML tree for debugging */
{ {
int i; int i, j;
for (i=0 ; i<level ; i++) for (i=0 ; i<level ; i++)
printf(" "); printf(" ");
@ -1334,6 +1351,14 @@ void mxml_debug_tree(PMXML_NODE tree, int level)
for (i=0 ; i<level ; i++) for (i=0 ; i<level ; i++)
printf(" "); printf(" ");
printf("Valu: %s\n", tree->value); printf("Valu: %s\n", tree->value);
for (j=0 ; j<tree->n_attributes ; j++) {
for (i=0 ; i<level ; i++)
printf(" ");
printf("%s: %s\n", tree->attribute_name+j*MXML_NAME_LENGTH,
tree->attribute_value[j]);
}
for (i=0 ; i<level ; i++) for (i=0 ; i<level ; i++)
printf(" "); printf(" ");
printf("Addr: %08X\n", (size_t)tree); printf("Addr: %08X\n", (size_t)tree);