X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=utils.c;h=59d02f1292574c60cd1fffa77b9bcd45bf5f9f84;hb=b803c65259b426a2b2ba14d342bec4de598734b8;hp=88ed8c1d4d3f8e1eb5032db6eee97c94aa3c84e2;hpb=063b8c2b5301646335dac66f1167bc8f128537a7;p=project%2Fprocd.git diff --git a/utils.c b/utils.c index 88ed8c1..59d02f1 100644 --- a/utils.c +++ b/utils.c @@ -1,17 +1,32 @@ +/* + * Copyright (C) 2013 Felix Fietkau + * Copyright (C) 2013 John Crispin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 + * as published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + #include #include #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 +36,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 +44,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); @@ -49,7 +67,7 @@ blobmsg_list_move(struct blobmsg_list *list, struct blobmsg_list *src) void *ptr; avl_remove_all_elements(&src->avl, node, avl, tmp) { - if (!avl_insert(&list->avl, &node->avl)) { + if (avl_insert(&list->avl, &node->avl)) { ptr = ((char *) node - list->node_offset); free(ptr); } @@ -90,6 +108,9 @@ blobmsg_list_equal(struct blobmsg_list *l1, struct blobmsg_list *l2) if (memcmp(n1->data, n2->data, len) != 0) return false; + if (l1->cmp && !l1->cmp(n1, n2)) + return false; + if (!count) break;