diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2010-05-14 15:24:53 +0200 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2010-05-14 15:24:53 +0200 |
commit | 0267f49fb2e44525aa2777bcb9900c4bb2db41e1 (patch) | |
tree | 57dc6bdb468c0a35063a297af7ce04d05f0b47b0 | |
parent | ee7408c2be2cd514ba6eefc5589e57a6056198dc (diff) | |
download | bird-0267f49fb2e44525aa2777bcb9900c4bb2db41e1.tar bird-0267f49fb2e44525aa2777bcb9900c4bb2db41e1.zip |
Do not add community if it is already in clist.
-rw-r--r-- | nest/a-set.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/nest/a-set.c b/nest/a-set.c index fad4481..f41b163 100644 --- a/nest/a-set.c +++ b/nest/a-set.c @@ -42,21 +42,12 @@ int_set_format(struct adata *set, int way, byte *buf, unsigned int size) *buf = 0; } -struct adata * -int_set_add(struct linpool *pool, struct adata *list, u32 val) -{ - int len = list ? list->length : 0; - struct adata *res = lp_alloc(pool, len + sizeof(struct adata) + 4); - res->length = len + 4; - * (u32 *) res->data = val; - if (list) - memcpy((char *) res->data + 4, list->data, list->length); - return res; -} - int int_set_contains(struct adata *list, u32 val) { + if (!list) + return 0; + u32 *l = (u32 *) list->data; unsigned int i; for (i=0; i<list->length/4; i++) @@ -66,6 +57,24 @@ int_set_contains(struct adata *list, u32 val) } struct adata * +int_set_add(struct linpool *pool, struct adata *list, u32 val) +{ + struct adata *res; + int len; + + if (int_set_contains(list, val)) + return list; + + len = list ? list->length : 0; + res = lp_alloc(pool, len + sizeof(struct adata) + 4); + res->length = len + 4; + * (u32 *) res->data = val; + if (list) + memcpy((char *) res->data + 4, list->data, list->length); + return res; +} + +struct adata * int_set_del(struct linpool *pool, struct adata *list, u32 val) { struct adata *res; |