mirror of
https://gitea.psi.ch/ELOG/elog.git
synced 2026-09-08 17:13:56 +00:00
Omit root node
SVN revision: 1279
This commit is contained in:
parent
3642174a39
commit
2954197c2e
61
src/mxml.c
61
src/mxml.c
@ -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);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user