59 xpath10_print_token(
const char *token, uint16_t tok_len,
ly_bool is_nametest,
const struct lys_module **context_mod,
64 const char *str_begin, *str_next, *prefix;
65 ly_bool is_prefix, has_prefix = 0;
68 uint32_t len, str_len = 0, pref_len;
73 while (!(ret = ly_value_prefix_next(str_begin, token + tok_len, &len, &is_prefix, &str_next)) && len) {
75 if (!has_prefix && is_nametest && (get_format ==
LY_VALUE_XML) && *context_mod) {
84 mem = realloc(str, str_len + strlen(
prefix) + 1 + len + 1);
87 str_len += sprintf(str + str_len,
"%s:%.*s",
prefix, len, str_begin);
91 mem = realloc(str, str_len + len + 1);
94 str_len += sprintf(str + str_len,
"%.*s", len, str_begin);
102 if (!mod && is_nametest) {
117 pref_len = strlen(
prefix);
125 mem = realloc(str, str_len + pref_len + 2);
128 str_len += sprintf(str + str_len,
"%.*s:", (
int)pref_len,
prefix);
137 str_begin = str_next;
165 xpath10_print_subexpr_r(uint16_t *cur_idx,
enum lyxp_token end_tok,
const struct lys_module *context_mod,
169 enum lyxp_token cur_tok, sub_end_tok;
172 const char *cur_exp_ptr;
174 const struct lys_module *orig_context_mod = context_mod;
176 while (*cur_idx < xp_val->exp->used) {
177 cur_tok = xp_val->
exp->tokens[*cur_idx];
178 cur_exp_ptr = xp_val->
exp->expr + xp_val->
exp->tok_pos[*cur_idx];
180 if ((cur_tok == LYXP_TOKEN_NAMETEST) || (cur_tok == LYXP_TOKEN_LITERAL)) {
182 is_nt = (cur_tok == LYXP_TOKEN_NAMETEST) ? 1 : 0;
183 LY_CHECK_RET(xpath10_print_token(cur_exp_ptr, xp_val->
exp->tok_len[*cur_idx], is_nt, &context_mod,
187 mem = realloc(*str_value, *str_len + strlen(str_tok) + 1);
188 LY_CHECK_ERR_GOTO(!mem, free(str_tok), error_mem);
190 *str_len += sprintf(*str_value + *str_len,
"%s", str_tok);
196 if ((cur_tok == LYXP_TOKEN_OPER_LOG) || (cur_tok == LYXP_TOKEN_OPER_UNI) || (cur_tok == LYXP_TOKEN_OPER_MATH)) {
198 mem = realloc(*str_value, *str_len + 1 + xp_val->
exp->tok_len[*cur_idx] + 2);
199 LY_CHECK_GOTO(!mem, error_mem);
201 *str_len += sprintf(*str_value + *str_len,
" %.*s ", (
int)xp_val->
exp->tok_len[*cur_idx], cur_exp_ptr);
204 context_mod = orig_context_mod;
207 mem = realloc(*str_value, *str_len + xp_val->
exp->tok_len[*cur_idx] + 1);
208 LY_CHECK_GOTO(!mem, error_mem);
210 *str_len += sprintf(*str_value + *str_len,
"%.*s", (
int)xp_val->
exp->tok_len[*cur_idx], cur_exp_ptr);
216 if (end_tok && (cur_tok == end_tok)) {
219 }
else if ((cur_tok == LYXP_TOKEN_BRACK1) || (cur_tok == LYXP_TOKEN_PAR1)) {
220 sub_end_tok = (cur_tok == LYXP_TOKEN_BRACK1) ? LYXP_TOKEN_BRACK2 : LYXP_TOKEN_PAR2;
223 LY_CHECK_RET(xpath10_print_subexpr_r(cur_idx, sub_end_tok, context_mod, xp_val, format, prefix_data,
224 str_value, str_len, err));
250 uint16_t expr_idx = 0;
251 uint32_t str_len = 0;
256 ret = xpath10_print_subexpr_r(&expr_idx, 0, NULL, xp_val, format, prefix_data, str_value, &str_len, err);
275 memset(storage, 0,
sizeof *storage);
277 LY_CHECK_ERR_GOTO(!val, ret =
LY_EMEM, cleanup);
282 LY_CHECK_GOTO(ret, cleanup);
288 LY_CHECK_GOTO(ret, cleanup);
293 LY_CHECK_GOTO(ret, cleanup);
296 ret = lyxp_expr_parse(
ctx, value_len ? value :
"", value_len, 1, &val->
exp);
297 LY_CHECK_GOTO(ret, cleanup);
300 if (ctx_node && !strcmp(ctx_node->
name,
"parent-reference") && !strcmp(ctx_node->
module->
name,
"ietf-yang-schema-mount")) {
304 LY_CHECK_GOTO(ret, cleanup);
308 LY_CHECK_GOTO(ret, cleanup);
320 LY_CHECK_GOTO(ret, cleanup);
323 LY_CHECK_GOTO(ret, cleanup);
330 ret = xpath10_print_value(val,
LY_VALUE_JSON, NULL, &canon, err);
331 LY_CHECK_GOTO(ret, cleanup);
334 LY_CHECK_GOTO(ret, cleanup);
356 lyplg_type_validate_xpath10(
const struct ly_ctx *UNUSED(
ctx),
const struct lysc_type *UNUSED(type),
362 struct ly_set *set = NULL;
364 const char *pref, *uri;
379 assert(!strcmp(
LYD_NAME(ctx_node),
"parent-reference") &&
383 if ((ret =
lyd_find_xpath(ctx_node,
"../../../namespace", &set))) {
387 for (i = 0; i < set->
count; ++i) {
388 assert(!strcmp(
LYD_NAME(lyd_child(set->dnodes[i])),
"prefix"));
389 pref = lyd_get_value(lyd_child(set->dnodes[i]));
391 if (!lyd_child(set->dnodes[i])->next) {
395 assert(!strcmp(
LYD_NAME(lyd_child(set->dnodes[i])->next),
"uri"));
396 uri = lyd_get_value(lyd_child(set->dnodes[i])->next);
399 ns = calloc(1,
sizeof *ns);
404 ns->prefix = strdup(pref);
405 ns->uri = strdup(uri);
406 if (!ns->prefix || !ns->uri) {
434 LIBYANG_API_DEF
const void *
436 void *prefix_data,
ly_bool *dynamic,
size_t *value_len)
458 if (xpath10_print_value(val, format, prefix_data, &ret, &err)) {
460 LOGVAL_ERRITEM(ctx, err);
468 *value_len = strlen(ret);
480 memset(dup, 0,
sizeof *dup);
484 LY_CHECK_GOTO(ret, cleanup);
491 ret = lyxp_expr_dup(
ctx, orig_val->
exp, &dup_val->
exp);
492 LY_CHECK_GOTO(ret, cleanup);
495 LY_CHECK_GOTO(ret, cleanup);
514 lyxp_expr_free(
ctx, val->
exp);
530 .
module =
"ietf-yang-types",
531 .revision =
"2013-07-15",
534 .plugin.id =
"libyang 2 - xpath1.0, version 1",
536 .plugin.validate = lyplg_type_validate_xpath10,
542 .plugin.lyb_data_len = -1,