X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=utils.c;h=628136f6c9862892aa3b085b869250f3af6525a5;hp=cff67bddfa61c875ce68d544b5829dca9c584376;hb=cbf7009718dd00ab1a782532f54ea3f08796f553;hpb=adcfdfd838f54f15ec7f4be6b5e8e5b78ddd3393 diff --git a/utils.c b/utils.c index cff67bd..628136f 100644 --- a/utils.c +++ b/utils.c @@ -3,15 +3,16 @@ #include "utils.h" void -__blobmsg_list_init(struct blobmsg_list *list, int offset, int len) +__blobmsg_list_init(struct blobmsg_list *list, int offset, int len, blobmsg_list_cmp cmp) { avl_init(&list->avl, avl_strcmp, false, NULL); list->node_offset = offset; list->node_len = len; + list->cmp = cmp; } int -blobmsg_list_fill(struct blobmsg_list *list, void *data, int len) +blobmsg_list_fill(struct blobmsg_list *list, void *data, int len, bool array) { struct avl_tree *tree = &list->avl; struct blobmsg_list_node *node; @@ -21,7 +22,7 @@ blobmsg_list_fill(struct blobmsg_list *list, void *data, int len) int rem = len; __blob_for_each_attr(cur, data, rem) { - if (!blobmsg_check_attr(cur, true)) + if (!blobmsg_check_attr(cur, !array)) continue; ptr = calloc(1, list->node_len); @@ -29,7 +30,10 @@ blobmsg_list_fill(struct blobmsg_list *list, void *data, int len) return -1; node = (void *) ((char *)ptr + list->node_offset); - node->avl.key = blobmsg_name(cur); + if (array) + node->avl.key = blobmsg_data(cur); + else + node->avl.key = blobmsg_name(cur); node->data = cur; if (avl_insert(tree, &node->avl)) { free(ptr); @@ -43,6 +47,20 @@ blobmsg_list_fill(struct blobmsg_list *list, void *data, int len) } void +blobmsg_list_move(struct blobmsg_list *list, struct blobmsg_list *src) +{ + struct blobmsg_list_node *node, *tmp; + void *ptr; + + avl_remove_all_elements(&src->avl, node, avl, tmp) { + if (avl_insert(&list->avl, &node->avl)) { + ptr = ((char *) node - list->node_offset); + free(ptr); + } + } +} + +void blobmsg_list_free(struct blobmsg_list *list) { struct blobmsg_list_node *node, *tmp; @@ -53,3 +71,38 @@ blobmsg_list_free(struct blobmsg_list *list) free(ptr); } } + +bool +blobmsg_list_equal(struct blobmsg_list *l1, struct blobmsg_list *l2) +{ + struct blobmsg_list_node *n1, *n2; + int count = l1->avl.count; + + if (count != l2->avl.count) + return false; + + n1 = avl_first_element(&l1->avl, n1, avl); + n2 = avl_first_element(&l2->avl, n2, avl); + + while (count-- > 0) { + int len; + + len = blob_len(n1->data); + if (len != blob_len(n2->data)) + return false; + + if (memcmp(n1->data, n2->data, len) != 0) + return false; + + if (l1->cmp && !l1->cmp(n1, n2)) + return false; + + if (!count) + break; + + n1 = avl_next_element(n1, avl); + n2 = avl_next_element(n2, avl); + } + + return true; +}