Implemented node type

SVN revision: 1283
This commit is contained in:
Stefan Ritt 2005-03-27 18:13:32 +00:00
parent 64c593ac26
commit 7065552421
2 changed files with 54 additions and 37 deletions

View File

@ -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++)

View File

@ -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);