xml parser CHANGE simplify processing of element tag termination
Move detection of > and /> into the lyxml_get_string() to avoid need of
calling lyxml_get_attribute when there is no other attribute. Also fixes
a problem of not removing element name from the stack of opened elements
when /> was reached on empty element with attributes.
diff --git a/tests/src/test_xml.c b/tests/src/test_xml.c
index 33a417f..587fe67 100644
--- a/tests/src/test_xml.c
+++ b/tests/src/test_xml.c
@@ -74,8 +74,11 @@
(void) state; /* unused */
size_t name_len, prefix_len;
+ size_t buf_len, len;
const char *name, *prefix;
+ char *buf = NULL, *out = NULL;
const char *str, *p;
+ int dynamic;
struct lyxml_context ctx;
memset(&ctx, 0, sizeof ctx);
@@ -117,6 +120,21 @@
assert_int_equal(7, name_len);
assert_int_equal(LYXML_ELEMENT, ctx.status);
assert_string_equal("", str);
+ assert_int_equal(0, ctx.elements.count);
+
+ str = " < element attr=\'x\'/>";
+ assert_int_equal(LY_SUCCESS, lyxml_get_element(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
+ assert_int_equal(LYXML_ATTRIBUTE, ctx.status);
+ assert_string_equal("attr=\'x\'/>", str);
+ assert_int_equal(1, ctx.elements.count);
+ assert_int_equal(LY_SUCCESS, lyxml_get_attribute(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
+ assert_int_equal(LYXML_ATTR_CONTENT, ctx.status);
+ assert_string_equal("\'x\'/>", str);
+ assert_int_equal(1, ctx.elements.count);
+ assert_int_equal(LY_SUCCESS, lyxml_get_string(&ctx, &str, &buf, &buf_len, &out, &len, &dynamic));
+ assert_int_equal(LYXML_ELEMENT, ctx.status);
+ assert_string_equal("", str);
+ assert_int_equal(0, ctx.elements.count);
str = "<?xml version=\"1.0\"?> <!-- comment --> <![CDATA[<greeting>Hello, world!</greeting>]]> <?TEST xxx?> <element/>";
assert_int_equal(LY_SUCCESS, lyxml_get_element(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
@@ -200,18 +218,6 @@
str = "";
assert_int_equal(LY_EINVAL, lyxml_get_attribute(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
- /* empty - without element tag termination */
- str = " />";
- assert_int_equal(LY_SUCCESS, lyxml_get_attribute(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
- assert_null(name);
- assert_true(str[0] == '\0');
- assert_int_equal(LYXML_ELEMENT, ctx.status);
- str = ">";
- assert_int_equal(LY_SUCCESS, lyxml_get_attribute(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
- assert_null(name);
- assert_true(str[0] == '\0');
- assert_int_equal(LYXML_ELEM_CONTENT, ctx.status);
-
/* not an attribute */
str = p = "unknown/>";
assert_int_equal(LY_EVALID, lyxml_get_attribute(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
@@ -241,7 +247,7 @@
assert_string_equal("\"urn\">", str);
assert_int_equal(LYXML_ATTR_CONTENT, ctx.status);
- str = "xmlns:nc\n = \'urn\'>";
+ str = "xmlns:nc\n = \'urn\'/>";
assert_int_equal(LY_SUCCESS, lyxml_get_attribute(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
assert_non_null(name);
assert_non_null(prefix);
@@ -250,8 +256,9 @@
assert_int_equal(3, ctx.line);
assert_false(strncmp("xmlns", prefix, prefix_len));
assert_false(strncmp("nc", name, name_len));
- assert_string_equal("\'urn\'>", str);
+ assert_string_equal("\'urn\'/>", str);
assert_int_equal(LYXML_ATTR_CONTENT, ctx.status);
+
}
static void