parser json FEATURE support for nested ext instances with data
... such as schema-mount.
diff --git a/src/json.c b/src/json.c
index 85368cb..cbe38e9 100644
--- a/src/json.c
+++ b/src/json.c
@@ -24,12 +24,6 @@
#include "json.h"
#include "tree_schema_internal.h"
-#define JSON_PUSH_STATUS_RET(CTX, STATUS) \
- LY_CHECK_RET(ly_set_add(&CTX->status, (void *)(uintptr_t)(STATUS), 1, NULL))
-
-#define JSON_POP_STATUS_RET(CTX) \
- assert(CTX->status.count); CTX->status.count--;
-
const char *
lyjson_token2str(enum LYJSON_PARSER_STATUS status)
{
@@ -78,7 +72,7 @@
ly_in_skip(jsonctx->in, 1);
}
if (*jsonctx->in->current == '\0') {
- JSON_PUSH_STATUS_RET(jsonctx, LYJSON_END);
+ LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_END);
}
return LY_SUCCESS;
@@ -318,7 +312,7 @@
{
LY_CHECK_RET(lyjson_string_(jsonctx));
- JSON_PUSH_STATUS_RET(jsonctx, LYJSON_STRING);
+ LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_STRING);
LY_CHECK_RET(lyjson_check_next(jsonctx));
return LY_SUCCESS;
@@ -718,7 +712,7 @@
}
ly_in_skip(jsonctx->in, offset);
- JSON_PUSH_STATUS_RET(jsonctx, LYJSON_NUMBER);
+ LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_NUMBER);
LY_CHECK_RET(lyjson_check_next(jsonctx));
return LY_SUCCESS;
@@ -758,23 +752,21 @@
/* empty object */
ly_in_skip(jsonctx->in, 1);
lyjson_ctx_set_value(jsonctx, NULL, 0, 0);
- JSON_PUSH_STATUS_RET(jsonctx, LYJSON_OBJECT_EMPTY);
+ LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_OBJECT_EMPTY);
return LY_SUCCESS;
}
LY_CHECK_RET(lyjson_object_name(jsonctx));
/* output data are set by lyjson_string_() */
- JSON_PUSH_STATUS_RET(jsonctx, LYJSON_OBJECT);
+ LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_OBJECT);
return LY_SUCCESS;
}
-/*
+/**
* @brief Process JSON array envelope
*
- *
- *
* @param[in] jsonctx JSON parser context
* @return LY_SUCCESS or LY_EMEM
*/
@@ -786,9 +778,9 @@
if (*jsonctx->in->current == ']') {
/* empty array */
ly_in_skip(jsonctx->in, 1);
- JSON_PUSH_STATUS_RET(jsonctx, LYJSON_ARRAY_EMPTY);
+ LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_ARRAY_EMPTY);
} else {
- JSON_PUSH_STATUS_RET(jsonctx, LYJSON_ARRAY);
+ LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_ARRAY);
}
/* erase previous values, array has no value on its own */
@@ -808,21 +800,21 @@
/* false */
lyjson_ctx_set_value(jsonctx, jsonctx->in->current, ly_strlen_const("false"), 0);
ly_in_skip(jsonctx->in, ly_strlen_const("false"));
- JSON_PUSH_STATUS_RET(jsonctx, LYJSON_FALSE);
+ LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_FALSE);
LY_CHECK_RET(lyjson_check_next(jsonctx));
} else if ((*jsonctx->in->current == 't') && !strncmp(jsonctx->in->current, "true", ly_strlen_const("true"))) {
/* true */
lyjson_ctx_set_value(jsonctx, jsonctx->in->current, ly_strlen_const("true"), 0);
ly_in_skip(jsonctx->in, ly_strlen_const("true"));
- JSON_PUSH_STATUS_RET(jsonctx, LYJSON_TRUE);
+ LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_TRUE);
LY_CHECK_RET(lyjson_check_next(jsonctx));
} else if ((*jsonctx->in->current == 'n') && !strncmp(jsonctx->in->current, "null", ly_strlen_const("null"))) {
/* none */
lyjson_ctx_set_value(jsonctx, "", 0, 0);
ly_in_skip(jsonctx->in, ly_strlen_const("null"));
- JSON_PUSH_STATUS_RET(jsonctx, LYJSON_NULL);
+ LYJSON_STATUS_PUSH_RET(jsonctx, LYJSON_NULL);
LY_CHECK_RET(lyjson_check_next(jsonctx));
} else if (*jsonctx->in->current == '"') {
@@ -861,7 +853,7 @@
}
LY_ERR
-lyjson_ctx_new(const struct ly_ctx *ctx, struct ly_in *in, struct lyjson_ctx **jsonctx_p)
+lyjson_ctx_new(const struct ly_ctx *ctx, struct ly_in *in, ly_bool subtree, struct lyjson_ctx **jsonctx_p)
{
LY_ERR ret = LY_SUCCESS;
struct lyjson_ctx *jsonctx;
@@ -885,8 +877,12 @@
goto cleanup;
}
- ret = lyjson_value(jsonctx);
-
+ if (subtree) {
+ ret = lyjson_object(jsonctx);
+ jsonctx->depth++;
+ } else {
+ ret = lyjson_value(jsonctx);
+ }
if ((jsonctx->status.count > 1) && (lyjson_ctx_status(jsonctx, 0) == LYJSON_END)) {
LOGVAL(jsonctx->ctx, LY_VCODE_EOF);
ret = LY_EVALID;
@@ -950,7 +946,7 @@
goto result;
} else {
/* the previous token is closed and should be completely processed */
- JSON_POP_STATUS_RET(jsonctx);
+ LYJSON_STATUS_POP_RET(jsonctx);
prev = lyjson_ctx_status(jsonctx, 0);
}
@@ -985,14 +981,15 @@
/* ... array - get another complete value */
ret = lyjson_value(jsonctx);
}
- } else if (((prev == LYJSON_OBJECT) && (*jsonctx->in->current == '}')) || ((prev == LYJSON_ARRAY) && (*jsonctx->in->current == ']'))) {
+ } else if (((prev == LYJSON_OBJECT) && (*jsonctx->in->current == '}')) ||
+ ((prev == LYJSON_ARRAY) && (*jsonctx->in->current == ']'))) {
if (*jsonctx->in->current == '}') {
assert(jsonctx->depth);
jsonctx->depth--;
}
ly_in_skip(jsonctx->in, 1);
- JSON_POP_STATUS_RET(jsonctx);
- JSON_PUSH_STATUS_RET(jsonctx, prev + 1);
+ LYJSON_STATUS_POP_RET(jsonctx);
+ LYJSON_STATUS_PUSH_RET(jsonctx, prev + 1);
} else {
/* unexpected value */
LOGVAL(jsonctx->ctx, LY_VCODE_INSTREXP, LY_VCODE_INSTREXP_len(jsonctx->in->current), jsonctx->in->current,