mirror of
https://gitea.psi.ch/ELOG/elog.git
synced 2026-09-14 20:33:48 +00:00
Implemented node type
SVN revision: 1283
This commit is contained in:
parent
64c593ac26
commit
7065552421
78
src/mxml.c
78
src/mxml.c
@ -502,20 +502,21 @@ int mxml_close_file(MXML_WRITER *writer)
|
|||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
|
|
||||||
PMXML_NODE mxml_create_root_node(char *name)
|
PMXML_NODE mxml_create_root_node()
|
||||||
/* 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, name);
|
strcpy(root->name, "root");
|
||||||
|
root->node_type = DOCUMENT_NODE;
|
||||||
|
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
|
|
||||||
PMXML_NODE mxml_add_node_at(PMXML_NODE parent, char *node_name, char *value, int index)
|
PMXML_NODE mxml_add_node_at(PMXML_NODE parent, int node_type, char *node_name, char *value, int index)
|
||||||
/* add a subnode (child) to an existing parent node as a specific position */
|
/* add a subnode (child) to an existing parent node as a specific position */
|
||||||
{
|
{
|
||||||
PMXML_NODE pnode, pchild;
|
PMXML_NODE pnode, pchild;
|
||||||
@ -548,6 +549,7 @@ PMXML_NODE mxml_add_node_at(PMXML_NODE parent, char *node_name, char *value, int
|
|||||||
pnode = &parent->child[index];
|
pnode = &parent->child[index];
|
||||||
memset(pnode, 0, sizeof(MXML_NODE));
|
memset(pnode, 0, sizeof(MXML_NODE));
|
||||||
strlcpy(pnode->name, node_name, sizeof(pnode->name));
|
strlcpy(pnode->name, node_name, sizeof(pnode->name));
|
||||||
|
pnode->node_type = node_type;
|
||||||
pnode->parent = parent;
|
pnode->parent = parent;
|
||||||
|
|
||||||
parent->n_children++;
|
parent->n_children++;
|
||||||
@ -563,10 +565,10 @@ PMXML_NODE mxml_add_node_at(PMXML_NODE parent, char *node_name, char *value, int
|
|||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
|
|
||||||
PMXML_NODE mxml_add_node(PMXML_NODE parent, char *node_name, char *value)
|
PMXML_NODE mxml_add_node(PMXML_NODE parent, int node_type, char *node_name, char *value)
|
||||||
/* add a subnode (child) to an existing parent node at the end */
|
/* add a subnode (child) to an existing parent node at the end */
|
||||||
{
|
{
|
||||||
return mxml_add_node_at(parent, node_name, value, parent->n_children);
|
return mxml_add_node_at(parent, node_type, node_name, value, parent->n_children);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
@ -655,29 +657,10 @@ int mxml_find_nodes1(PMXML_NODE tree, char *xml_path, PMXML_NODE **nodelist, int
|
|||||||
p1 = xml_path;
|
p1 = xml_path;
|
||||||
pnode = tree;
|
pnode = tree;
|
||||||
|
|
||||||
if (*p1 && *p1 == '/') {
|
/* skip leading '/' */
|
||||||
|
if (*p1 && *p1 == '/')
|
||||||
/* if path starts with '/', compare root node */
|
|
||||||
p1++;
|
p1++;
|
||||||
|
|
||||||
p2 = p1;
|
|
||||||
while (*p2 && *p2 != '/')
|
|
||||||
p2++;
|
|
||||||
len = (size_t)p2 - (size_t)p1;
|
|
||||||
if (len >= sizeof(node_name))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
memcpy(node_name, p1, len);
|
|
||||||
node_name[len] = 0;
|
|
||||||
|
|
||||||
if (strcmp(pnode->name, node_name) != 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
p1 = p2;
|
|
||||||
if (*p1 == '/')
|
|
||||||
p1++;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
p2 = p1;
|
p2 = p1;
|
||||||
while (*p2 && *p2 != '/' && *p2 != '[')
|
while (*p2 && *p2 != '/' && *p2 != '[')
|
||||||
@ -1026,7 +1009,8 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size)
|
|||||||
p = buf;
|
p = buf;
|
||||||
line_number = 1;
|
line_number = 1;
|
||||||
|
|
||||||
root = ptree = NULL;
|
root = mxml_create_root_node();
|
||||||
|
ptree = root;
|
||||||
|
|
||||||
/* parse file contents */
|
/* parse file contents */
|
||||||
do {
|
do {
|
||||||
@ -1047,6 +1031,12 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size)
|
|||||||
if (strncmp(p, "!--", 3) == 0) {
|
if (strncmp(p, "!--", 3) == 0) {
|
||||||
|
|
||||||
/* found comment */
|
/* found comment */
|
||||||
|
|
||||||
|
pnew = mxml_add_node(ptree, COMMENT_NODE, "Comment", NULL);
|
||||||
|
pv = p+3;
|
||||||
|
while (*pv == ' ')
|
||||||
|
pv++;
|
||||||
|
|
||||||
p += 3;
|
p += 3;
|
||||||
if (strstr(p, "-->") == NULL)
|
if (strstr(p, "-->") == NULL)
|
||||||
return read_error(HERE, "Unterminated comment");
|
return read_error(HERE, "Unterminated comment");
|
||||||
@ -1056,11 +1046,21 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size)
|
|||||||
line_number++;
|
line_number++;
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
len = (size_t)p - (size_t)pv;
|
||||||
|
pnew->value = (char *)malloc(len+1);
|
||||||
|
memcpy(pnew->value, pv, len);
|
||||||
|
pnew->value[len] = 0;
|
||||||
|
mxml_decode(pnew->value);
|
||||||
|
|
||||||
p += 3;
|
p += 3;
|
||||||
|
|
||||||
} else if (*p == '?') {
|
} else if (*p == '?') {
|
||||||
|
|
||||||
/* found ?...? element */
|
/* found ?...? element */
|
||||||
|
pnew = mxml_add_node(ptree, PROCESSING_INSTRUCTION_NODE, "PI", NULL);
|
||||||
|
pv = p+1;
|
||||||
|
|
||||||
p++;
|
p++;
|
||||||
if (strstr(p, "?>") == NULL)
|
if (strstr(p, "?>") == NULL)
|
||||||
return read_error(HERE, "Unterminated ?...? element");
|
return read_error(HERE, "Unterminated ?...? element");
|
||||||
@ -1070,6 +1070,13 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size)
|
|||||||
line_number++;
|
line_number++;
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
len = (size_t)p - (size_t)pv;
|
||||||
|
pnew->value = (char *)malloc(len+1);
|
||||||
|
memcpy(pnew->value, pv, len);
|
||||||
|
pnew->value[len] = 0;
|
||||||
|
mxml_decode(pnew->value);
|
||||||
|
|
||||||
p += 2;
|
p += 2;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -1114,14 +1121,11 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size)
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (root != NULL && ptree == NULL)
|
if (ptree == NULL)
|
||||||
return read_error(HERE, "Unexpected second top level node");
|
return read_error(HERE, "Unexpected second top level node");
|
||||||
|
|
||||||
/* allocate new element structure in parent tree */
|
/* allocate new element structure in parent tree */
|
||||||
if (root == NULL) {
|
pnew = mxml_add_node(ptree, ELEMENT_NODE, node_name, 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')
|
||||||
@ -1342,14 +1346,17 @@ 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;
|
||||||
|
|
||||||
if (!mxml_write_subtree(writer, tree))
|
for (i=0 ; i<tree->n_children ; i++)
|
||||||
return FALSE;
|
if (tree->child[i].node_type == ELEMENT_NODE) // skip PI and comments
|
||||||
|
if (!mxml_write_subtree(writer, &tree->child[i]))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (!mxml_close_file(writer))
|
if (!mxml_close_file(writer))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -1370,6 +1377,9 @@ 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 (i=0 ; i<level ; i++)
|
||||||
|
printf(" ");
|
||||||
|
printf("Type: %d\n", tree->node_type);
|
||||||
|
|
||||||
for (j=0 ; j<tree->n_attributes ; j++) {
|
for (j=0 ; j<tree->n_attributes ; j++) {
|
||||||
for (i=0 ; i<level ; i++)
|
for (i=0 ; i<level ; i++)
|
||||||
|
|||||||
13
src/mxml.h
13
src/mxml.h
@ -11,6 +11,12 @@
|
|||||||
|
|
||||||
#define MXML_NAME_LENGTH 64
|
#define MXML_NAME_LENGTH 64
|
||||||
|
|
||||||
|
#define ELEMENT_NODE 1
|
||||||
|
#define TEXT_NODE 2
|
||||||
|
#define PROCESSING_INSTRUCTION_NODE 3
|
||||||
|
#define COMMENT_NODE 4
|
||||||
|
#define DOCUMENT_NODE 5
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int fh;
|
int fh;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
@ -26,6 +32,7 @@ typedef struct mxml_struct *PMXML_NODE;
|
|||||||
|
|
||||||
typedef struct mxml_struct {
|
typedef struct mxml_struct {
|
||||||
char name[MXML_NAME_LENGTH]; // name of element <[name]>[value]</[name]>
|
char name[MXML_NAME_LENGTH]; // name of element <[name]>[value]</[name]>
|
||||||
|
int node_type; // type of node XXX_NODE
|
||||||
char *value; // value of element
|
char *value; // value of element
|
||||||
int n_attributes; // list of attributes
|
int n_attributes; // list of attributes
|
||||||
char *attribute_name;
|
char *attribute_name;
|
||||||
@ -56,8 +63,8 @@ char *mxml_get_value(PMXML_NODE pnode);
|
|||||||
char *mxml_get_attribute(PMXML_NODE pnode, char *name);
|
char *mxml_get_attribute(PMXML_NODE pnode, char *name);
|
||||||
|
|
||||||
int mxml_add_attribute(PMXML_NODE pnode, char *attrib_name, char *attrib_value);
|
int mxml_add_attribute(PMXML_NODE pnode, char *attrib_name, char *attrib_value);
|
||||||
PMXML_NODE mxml_add_node(PMXML_NODE parent, char *node_name, char *value);
|
PMXML_NODE mxml_add_node(PMXML_NODE parent, int node_type, char *node_name, char *value);
|
||||||
PMXML_NODE mxml_add_node_at(PMXML_NODE parent, char *node_name, char *value, int index);
|
PMXML_NODE mxml_add_node_at(PMXML_NODE parent, int node_type, char *node_name, char *value, int index);
|
||||||
|
|
||||||
int mxml_replace_node_name(PMXML_NODE pnode, char *new_name);
|
int mxml_replace_node_name(PMXML_NODE pnode, char *new_name);
|
||||||
int mxml_replace_node_value(PMXML_NODE pnode, char *value);
|
int mxml_replace_node_value(PMXML_NODE pnode, char *value);
|
||||||
@ -68,7 +75,7 @@ int mxml_replace_attribute_value(PMXML_NODE pnode, char *attrib_name, char *attr
|
|||||||
int mxml_delete_node(PMXML_NODE pnode);
|
int mxml_delete_node(PMXML_NODE pnode);
|
||||||
int mxml_delete_attribute(PMXML_NODE, char *attrib_name);
|
int mxml_delete_attribute(PMXML_NODE, char *attrib_name);
|
||||||
|
|
||||||
PMXML_NODE mxml_create_root_node(char *name);
|
PMXML_NODE mxml_create_root_node();
|
||||||
PMXML_NODE mxml_parse_file(char *file_name, char *error, int error_size);
|
PMXML_NODE mxml_parse_file(char *file_name, char *error, int error_size);
|
||||||
PMXML_NODE mxml_parse_buffer(char *buffer, char *error, int error_size);
|
PMXML_NODE mxml_parse_buffer(char *buffer, char *error, int error_size);
|
||||||
int mxml_write_tree(char *file_name, PMXML_NODE tree);
|
int mxml_write_tree(char *file_name, PMXML_NODE tree);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user