diff --git a/mxml.c b/mxml.c index b297e5b..10284fe 100755 --- a/mxml.c +++ b/mxml.c @@ -1073,6 +1073,22 @@ char *mxml_get_value(PMXML_NODE pnode) /*------------------------------------------------------------------*/ +int mxml_get_line_number_start(PMXML_NODE pnode) +{ + assert(pnode); + return pnode->line_number_start; +} + +/*------------------------------------------------------------------*/ + +int mxml_get_line_number_end(PMXML_NODE pnode) +{ + assert(pnode); + return pnode->line_number_end; +} + +/*------------------------------------------------------------------*/ + char *mxml_get_attribute(PMXML_NODE pnode, const char *name) { int i; @@ -1316,6 +1332,7 @@ PMXML_NODE mxml_parse_buffer(const char *buf, char *error, int error_size) /* found comment */ pnew = mxml_add_special_node(ptree, COMMENT_NODE, "Comment", NULL); + pnew->line_number_start = line_number; pv = p+3; while (*pv == ' ') pv++; @@ -1334,6 +1351,7 @@ PMXML_NODE mxml_parse_buffer(const char *buf, char *error, int error_size) pnew->value = (char *)mxml_malloc(len+1); memcpy(pnew->value, pv, len); pnew->value[len] = 0; + pnew->line_number_end = line_number; mxml_decode(pnew->value); p += 3; @@ -1342,6 +1360,7 @@ PMXML_NODE mxml_parse_buffer(const char *buf, char *error, int error_size) /* found ?...? element */ pnew = mxml_add_special_node(ptree, PROCESSING_INSTRUCTION_NODE, "PI", NULL); + pnew->line_number_start = line_number; pv = p+1; p++; @@ -1358,6 +1377,7 @@ PMXML_NODE mxml_parse_buffer(const char *buf, char *error, int error_size) pnew->value = (char *)mxml_malloc(len+1); memcpy(pnew->value, pv, len); pnew->value[len] = 0; + pnew->line_number_end = line_number; mxml_decode(pnew->value); p += 2; @@ -1420,7 +1440,8 @@ PMXML_NODE mxml_parse_buffer(const char *buf, char *error, int error_size) /* close previously opened element */ if (strcmp(ptree->name, node_name) != 0) return read_error(HERE, "Found , expected ", node_name, ptree->name); - + ptree->line_number_end = line_number; + /* go up one level on the tree */ ptree = ptree->parent; @@ -1431,6 +1452,8 @@ PMXML_NODE mxml_parse_buffer(const char *buf, char *error, int error_size) /* allocate new element structure in parent tree */ pnew = mxml_add_node(ptree, node_name, NULL); + pnew->line_number_start = line_number; + pnew->line_number_end = line_number; while (*p && isspace((unsigned char)*p)) { if (*p == '\n') @@ -2130,6 +2153,12 @@ void mxml_debug_tree(PMXML_NODE tree, int level) for (i=0 ; inode_type); + for (i=0 ; iline_number_start); + for (i=0 ; iline_number_end); for (j=0 ; jn_attributes ; j++) { for (i=0 ; iline_number_start == line_number) + return tree; + + for (i=0 ; in_children ; i++) { + pn = mxml_get_node_at_line(&tree->child[i], line_number); + if (pn) + return pn; + } + + return NULL; +} + diff --git a/mxml.h b/mxml.h index c7177f8..ee9ef5c 100755 --- a/mxml.h +++ b/mxml.h @@ -55,7 +55,8 @@ typedef struct mxml_struct { int n_attributes; // list of attributes char *attribute_name; char **attribute_value; - int line_number; // line number for source file + int line_number_start; // first line number in XML file, starting from 1 + int line_number_end; // last line number in XML file, starting from 1 PMXML_NODE parent; // pointer to parent element int n_children; // list of children PMXML_NODE child; @@ -97,6 +98,9 @@ PMXML_NODE mxml_find_node(PMXML_NODE tree, const char *xml_path); int mxml_find_nodes(PMXML_NODE tree, const char *xml_path, PMXML_NODE **nodelist); char *mxml_get_name(PMXML_NODE pnode); char *mxml_get_value(PMXML_NODE pnode); +int mxml_get_line_number_start(PMXML_NODE pnode); +int mxml_get_line_number_end(PMXML_NODE pnode); +PMXML_NODE mxml_get_node_at_line(PMXML_NODE tree, int linenumber); char *mxml_get_attribute(PMXML_NODE pnode, const char *name); int mxml_add_attribute(PMXML_NODE pnode, const char *attrib_name, const char *attrib_value);