From a118653dc23cd2af52563a29fd3df1cfd00f68ad Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Sat, 22 Dec 2007 08:11:24 -0500 Subject: [PATCH] Fixed finding elements that were outside the current element tree. For example: value STORE a b c new_value Would store "new_value" in and not . --- src/xml.c | 27 +++++++++++++++++++++------ src/xml.h | 2 +- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/xml.c b/src/xml.c index a4b62305..4fc2cbc8 100644 --- a/src/xml.c +++ b/src/xml.c @@ -280,6 +280,18 @@ static gchar **append_element_path(gchar **dst, gchar **src) return d; } +static xmlNodePtr find_stop_node(xmlNodePtr node) +{ + xmlNodePtr n; + + for (n = node->parent->children; n; n = n->next) { + if (n == node) + return n->next; + } + + return NULL; +} + /* * Alot like create_elements_cb() but doesn't use the last element of 'req' as * content but as an element. @@ -296,7 +308,7 @@ xmlNodePtr create_target_elements_cb(xmlNodePtr node, gchar **path, for (i = 0; req[i]; i++) { xmlNodePtr n; - if ((n = find_element(node, req[i])) == NULL) { + if ((n = find_element(node, req[i], find_stop_node(node))) == NULL) { is_literal_element(&req[i]); n = xmlNewNode(NULL, (xmlChar *)req[i]); @@ -375,7 +387,7 @@ xmlNodePtr create_elements_cb(xmlNodePtr node, gchar **elements, break; } - n = find_element(node, req[i]); + n = find_element(node, req[i], find_stop_node(node)); if (!n) { n = xmlNewNode(NULL, (xmlChar *)req[i]); @@ -511,7 +523,7 @@ xmlNodePtr find_account(xmlDocPtr doc, gchar ***req, gpg_error_t *error, return NULL; } -xmlNodePtr find_sibling(xmlNodePtr node, gchar *element) +xmlNodePtr find_sibling(xmlNodePtr node, gchar *element, xmlNodePtr stop) { xmlNodePtr n; @@ -522,6 +534,9 @@ xmlNodePtr find_sibling(xmlNodePtr node, gchar *element) if (n->type != XML_ELEMENT_NODE) continue; + if (n == stop) + break; + if (xmlStrEqual(n->name, (xmlChar *)element)) return n; } @@ -529,12 +544,12 @@ xmlNodePtr find_sibling(xmlNodePtr node, gchar *element) return NULL; } -xmlNodePtr find_element(xmlNodePtr node, gchar *element) +xmlNodePtr find_element(xmlNodePtr node, gchar *element, xmlNodePtr stop) { if (!node || !element) return NULL; - return find_sibling(node, element); + return find_sibling(node, element, stop); } xmlChar *node_has_attribute(xmlNodePtr n, xmlChar *attr) @@ -592,7 +607,7 @@ xmlNodePtr find_elements(xmlDocPtr doc, xmlNodePtr node, } literal = is_literal_element(&t); - n = find_element(last, t); + n = find_element(last, t, NULL); g_free(t); if (!n) { diff --git a/src/xml.h b/src/xml.h index 485f41b4..5d6fbbd9 100644 --- a/src/xml.h +++ b/src/xml.h @@ -37,7 +37,7 @@ xmlNodePtr find_elements(xmlDocPtr doc, xmlNodePtr node, xmlNodePtr (*found_fn)(xmlNodePtr, gchar **, gpg_error_t *, void *), xmlNodePtr (*not_found_fn)(xmlNodePtr, gchar **, gpg_error_t *, void *), gboolean is_list_command, gint recursion_depth, void *data); -xmlNodePtr find_element(xmlNodePtr node, gchar *element); +xmlNodePtr find_element(xmlNodePtr node, gchar *element, xmlNodePtr stop); xmlNodePtr find_account(xmlDocPtr doc, gchar ***req, gpg_error_t *error, gboolean *target, gint recursion_depth); xmlNodePtr create_elements_cb(xmlNodePtr node, gchar **elements, -- 2.11.4.GIT