source:
libabac/abac_set.c
@
314869f
Last change on this file since 314869f was 15200be, checked in by , 14 years ago | |
---|---|
|
|
File size: 1.5 KB |
Line | |
---|---|
1 | #include <stdlib.h> |
2 | |
3 | #include "abac_set.h" |
4 | #include "abac_util.h" |
5 | |
6 | #include "uthash.h" |
7 | |
8 | typedef struct _abac_set_element_t { |
9 | char *key; |
10 | UT_hash_handle hh; |
11 | } abac_set_element_t; |
12 | |
13 | struct _abac_set_t { |
14 | abac_set_element_t *elts; |
15 | }; |
16 | |
17 | /** |
18 | * Create a new struct. |
19 | */ |
20 | abac_set_t *abac_set_new(void) { |
21 | abac_set_t *ret = abac_xmalloc(sizeof(abac_set_t)); |
22 | ret->elts = NULL; |
23 | return ret; |
24 | } |
25 | |
26 | /** |
27 | * Add an item to the set, returns true if it doesn't exist. |
28 | */ |
29 | int abac_set_add(abac_set_t *set, char *value) { |
30 | abac_set_element_t *elt; |
31 | |
32 | HASH_FIND_STR(set->elts, value, elt); |
33 | if (elt) return 0; // already exists |
34 | |
35 | elt = abac_xmalloc(sizeof(abac_set_element_t)); |
36 | elt->key = abac_xstrdup(value); |
37 | HASH_ADD_KEYPTR(hh, set->elts, elt->key, strlen(elt->key), elt); |
38 | |
39 | return 1; |
40 | } |
41 | |
42 | /** |
43 | * Does the set contain the value. |
44 | */ |
45 | int abac_set_contains(abac_set_t *set, char *value) { |
46 | abac_set_element_t *elt; |
47 | |
48 | HASH_FIND_STR(set->elts, value, elt); |
49 | return elt != NULL; |
50 | } |
51 | |
52 | /** |
53 | * Return a list of the set's elements. |
54 | */ |
55 | abac_list_t *abac_set_elements(abac_set_t *set) { |
56 | abac_set_element_t *elt; |
57 | abac_list_t *ret = abac_list_new(); |
58 | |
59 | for (elt = set->elts; elt != NULL; elt = elt->hh.next) { |
60 | char *next = elt->key; |
61 | abac_list_add(ret, next); |
62 | } |
63 | |
64 | return ret; |
65 | } |
66 | |
67 | /** |
68 | * Destroy a set. |
69 | */ |
70 | void abac_set_free(abac_set_t *set) { |
71 | abac_set_element_t *elt; |
72 | |
73 | while ((elt = set->elts) != NULL) { |
74 | HASH_DEL(set->elts, elt); |
75 | free(elt->key); |
76 | free(elt); |
77 | } |
78 | |
79 | free(set); |
80 | } |
Note: See TracBrowser
for help on using the repository browser.