data types BUGFIX several tests and bugfixes for parsing binary values from XML
diff --git a/src/parser_xml.c b/src/parser_xml.c
index 86ae99a..389a8db 100644
--- a/src/parser_xml.c
+++ b/src/parser_xml.c
@@ -200,6 +200,13 @@
}
cur->schema = snode;
cur->parent = parent;
+ if (parent) {
+ parent->child->prev = cur;
+ } else if (prev) {
+ struct lyd_node *iter;
+ for (iter = prev; iter->prev->next; iter = iter->prev);
+ iter->prev = cur;
+ }
if (prev) {
cur->prev = prev;
prev->next = cur;
@@ -223,9 +230,14 @@
LOGVAL(ctx->ctx, LY_VLOG_LINE, &ctx->line, LYVE_SYNTAX, "Child element inside terminal node \"%s\" found.", cur->schema->name);
goto cleanup;
}
- lyd_value_validate((struct lyd_node_term*)cur, value, value_len,
- LY_TYPE_VALIDATE_CANONIZE | (dynamic ? LY_TYPE_VALIDATE_DYNAMIC : 0));
+ } else {
+ /* no content - validate empty value */
+ value = "";
+ value_len = 0;
}
+ ret = lyd_value_validate((struct lyd_node_term*)cur, value, value_len,
+ LY_TYPE_VALIDATE_CANONIZE | (dynamic ? LY_TYPE_VALIDATE_DYNAMIC : 0));
+ LY_CHECK_GOTO(ret, cleanup);
} else if (snode->nodetype & LYD_NODE_INNER) {
int dynamic = 0;
char *buffer = NULL, *value;
@@ -240,6 +252,7 @@
}
if (ctx->status == LYXML_ELEMENT) {
ret = lydxml_nodes(ctx, (struct lyd_node_inner*)cur, data, lyd_node_children_p(cur));
+ LY_CHECK_GOTO(ret, cleanup);
}
}
/* TODO anyxml/anydata */
@@ -261,6 +274,10 @@
xmlctx.line = 1;
ret = lydxml_nodes(&xmlctx, NULL, &data, result);
+ if (ret) {
+ lyd_free_all(*result);
+ *result = NULL;
+ }
lyxml_context_clear((struct lyxml_context*)&xmlctx);
return ret;
}