#include "debug_utils.h" #include "log_utils.h" #include void debug_print_sr_val(const sr_val_t *value) { if (NULL == value) { return; } log_add(1, "%s ", value->xpath); switch (value->type) { case SR_CONTAINER_T: case SR_CONTAINER_PRESENCE_T: log_add(1, "(container)"); break; case SR_LIST_T: log_add(1, "(list instance)"); break; case SR_STRING_T: log_add(1, "= %s", value->data.string_val); break; case SR_BOOL_T: log_add(1, "= %s", value->data.bool_val ? "true" : "false"); break; case SR_DECIMAL64_T: log_add(1, "= %g", value->data.decimal64_val); break; case SR_INT8_T: log_add(1, "= %" PRId8, value->data.int8_val); break; case SR_INT16_T: log_add(1, "= %" PRId16, value->data.int16_val); break; case SR_INT32_T: log_add(1, "= %" PRId32, value->data.int32_val); break; case SR_INT64_T: log_add(1, "= %" PRId64, value->data.int64_val); break; case SR_UINT8_T: log_add(1, "= %" PRIu8, value->data.uint8_val); break; case SR_UINT16_T: log_add(1, "= %" PRIu16, value->data.uint16_val); break; case SR_UINT32_T: log_add(1, "= %" PRIu32, value->data.uint32_val); break; case SR_UINT64_T: log_add(1, "= %" PRIu64, value->data.uint64_val); break; case SR_IDENTITYREF_T: log_add(1, "= %s", value->data.identityref_val); break; case SR_INSTANCEID_T: log_add(1, "= %s", value->data.instanceid_val); break; case SR_BITS_T: log_add(1, "= %s", value->data.bits_val); break; case SR_BINARY_T: log_add(1, "= %s", value->data.binary_val); break; case SR_ENUM_T: log_add(1, "= %s", value->data.enum_val); break; case SR_LEAF_EMPTY_T: log_add(1, "(empty leaf)"); break; default: log_add(1, "(unprintable)"); break; } switch (value->type) { case SR_UNKNOWN_T: case SR_CONTAINER_T: case SR_CONTAINER_PRESENCE_T: case SR_LIST_T: case SR_LEAF_EMPTY_T: break; default: log_add(1, "%s", value->dflt ? " [default]" : ""); break; } } void debug_print_sr_change(sr_change_oper_t op, sr_val_t *old_val, sr_val_t *new_val) { switch (op) { case SR_OP_CREATED: log_add_verbose(1, "CREATED: "); debug_print_sr_val(new_val); break; case SR_OP_DELETED: log_add_verbose(1, "DELETED: "); debug_print_sr_val(old_val); break; case SR_OP_MODIFIED: log_add_verbose(1, "MODIFIED: "); debug_print_sr_val(old_val); log_add(1, "to "); debug_print_sr_val(new_val); break; case SR_OP_MOVED: log_add_verbose(1, "MOVED: %s\n", new_val->xpath); break; } log_add(1, "\n"); } void debug_print_lyd_value(struct lyd_node *node) { switch(node->schema->nodetype) { case LYS_UNKNOWN: case LYS_CONTAINER: case LYS_CHOICE: case LYS_LIST: case LYS_ANYXML: case LYS_CASE: case LYS_NOTIF: case LYS_RPC: case LYS_INPUT: case LYS_OUTPUT: case LYS_GROUPING: case LYS_USES: case LYS_AUGMENT: case LYS_ACTION: case LYS_ANYDATA: case LYS_EXT: default: log_add(1, "[unprintable]"); break; case LYS_LEAF: case LYS_LEAFLIST: log_add(1, LOG_COLOR_BOLD_MAGENTA"%s"LOG_COLOR_RESET, ((struct lyd_node_leaf_list *)node)->value_str); break; } } void debug_print_lyd_node(struct lyd_node *node) { struct lyd_node *start = node; struct lyd_node *elem = 0; struct lyd_node *next = 0; debug_print_dfs: LY_TREE_DFS_BEGIN(start, next, elem) { char elemtype = ((elem->schema->flags & LYS_CONFIG_W) == 0) ? 'O' : 'R'; char *xpath = lyd_path(elem); log_add_verbose(1, "[%c] %s: ", elemtype, xpath); free(xpath); debug_print_lyd_value(elem); log_add(1, "\n"); LY_TREE_DFS_END(start, next, elem); } if(start->next) { start = start->next; goto debug_print_dfs; } } void debug_print_siblings(const struct lyd_node *node) { struct lyd_node *start = (struct lyd_node *)node; struct lyd_node *elem = 0; elem = start; while(elem) { elem = elem->prev; char elemtype = ((elem->schema->flags & LYS_CONFIG_W) == 0) ? 'O' : 'R'; log_add_verbose(1, "[%c] %s: ", elemtype, lyd_path(elem)); debug_print_lyd_value(elem); log_add(1, "\n"); if(elem == start) { break; } } }