29 #include "plugins_internal.h"
59 union_subvalue_assignment(
const void *value,
size_t value_len,
void **original,
size_t *orig_len, uint32_t *options)
65 *original = (
void *)value;
67 }
else if (value_len) {
69 *original = calloc(1, value_len);
70 LY_CHECK_ERR_RET(!*original, ret =
LY_EMEM, ret);
71 memcpy(*original, value, value_len);
74 *original = strdup(
"");
75 LY_CHECK_ERR_RET(!*original, ret =
LY_EMEM, ret);
77 *orig_len = value_len;
95 uint64_t type_idx = 0;
105 memcpy(&type_idx, lyb_data,
IDX_SIZE);
106 type_idx = le64toh(type_idx);
128 lyb_parse_union(
const void *lyb_data,
size_t lyb_data_len, uint32_t *type_idx,
const void **lyb_value,
size_t *lyb_value_len)
132 assert(lyb_data && !(lyb_value && !lyb_value_len));
141 if (lyb_value && lyb_value_len && lyb_data_len) {
147 *lyb_value_len = lyb_data_len -
IDX_SIZE;
148 *lyb_value = (
char *)lyb_data +
IDX_SIZE;
172 const void *value = NULL;
173 size_t value_len = 0;
176 lyb_parse_union(subvalue->
original, subvalue->
orig_len, NULL, &value, &value_len);
186 memset(&subvalue->
value, 0,
sizeof subvalue->
value);
219 struct lys_glob_unres *unres,
struct ly_err_item **err)
236 ret = union_store_type(ctx, types[u], subvalue, resolve, ctx_node, tree, unres, err);
248 }
else if (type_idx) {
276 lyb_fill_subvalue(
const struct ly_ctx *ctx,
struct lysc_type_union *type_u,
const void *lyb_data,
size_t lyb_data_len,
277 void *prefix_data,
struct lyd_value_union *subvalue, uint32_t *options,
struct lys_glob_unres *unres,
282 const void *lyb_value = NULL;
283 size_t lyb_value_len = 0;
285 ret = lyb_union_validate(lyb_data, lyb_data_len, type_u, err);
289 lyb_parse_union(lyb_data, lyb_data_len, &type_idx, &lyb_value, &lyb_value_len);
293 ret = union_subvalue_assignment(lyb_data, lyb_data_len,
311 ret = union_store_type(ctx, type_u->
types[type_idx], subvalue, 0, NULL, NULL, unres, err);
328 memset(storage, 0,
sizeof *storage);
330 LY_CHECK_ERR_GOTO(!subvalue, ret =
LY_EMEM, cleanup);
336 ret = lyb_fill_subvalue(ctx, type_u,
value, value_len,
341 ret = union_subvalue_assignment(
value, value_len,
343 LY_CHECK_GOTO(ret, cleanup);
348 LY_CHECK_GOTO(ret, cleanup);
351 ret = union_find_type(ctx, type_u->
types, subvalue, 0, NULL, NULL, NULL, unres, err);
357 LY_CHECK_GOTO(ret, cleanup);
401 lyb_parse_union(subvalue->
original, 0, &type_idx, NULL, NULL);
402 ret = union_store_type(ctx, type_u->
types[type_idx], subvalue, 1, ctx_node, tree, NULL, err);
406 ret = union_find_type(ctx, type_u->
types, subvalue, 1, ctx_node, tree, NULL, NULL, err);
411 ret = union_find_type(ctx, type_u->
types, subvalue, 1, ctx_node, tree, NULL, NULL, err);
430 return val1->subvalue->value.
realtype->
plugin->
compare(&val1->subvalue->value, &val2->subvalue->value);
447 void *prefix_data,
size_t *value_len)
467 retval = union_find_type(ctx, type_u->
types, subvalue, 0, NULL, NULL, &type_idx, NULL, &err);
473 LY_CHECK_RET(!pval, NULL);
477 ret = malloc(*value_len);
478 LY_CHECK_RET(!ret, NULL);
483 memcpy((
char *)ret +
IDX_SIZE, pval, pval_len);
492 LIBYANG_API_DEF
const void *
494 void *prefix_data,
ly_bool *dynamic,
size_t *value_len)
499 size_t lyb_data_len = 0;
511 ret = lyb_union_print(ctx, type_u, subvalue, prefix_data, &lyb_data_len);
513 *value_len = lyb_data_len;
535 memset(dup, 0,
sizeof *dup);
539 LY_CHECK_GOTO(ret, cleanup);
541 dup_val = calloc(1,
sizeof *dup_val);
542 LY_CHECK_ERR_GOTO(!dup_val,
LOGMEM(ctx); ret =
LY_EMEM, cleanup);
543 dup->subvalue = dup_val;
546 LY_CHECK_GOTO(ret, cleanup);
549 dup_val->original = calloc(1, orig_val->
orig_len);
550 LY_CHECK_ERR_GOTO(!dup_val->original,
LOGMEM(ctx); ret =
LY_EMEM, cleanup);
553 dup_val->original = strdup(
"");
554 LY_CHECK_ERR_GOTO(!dup_val->original,
LOGMEM(ctx); ret =
LY_EMEM, cleanup);
556 dup_val->orig_len = orig_val->
orig_len;
558 dup_val->format = orig_val->
format;
559 dup_val->ctx_node = orig_val->
ctx_node;
560 dup_val->hints = orig_val->
hints;
562 LY_CHECK_GOTO(ret, cleanup);
601 .name = LY_TYPE_UNION_STR,
603 .plugin.id =
"libyang 2 - union,version 1",
611 .plugin.lyb_data_len = -1,