source: libabac/abac_set.c @ 0eb4a8e

abac0-leakabac0-meicompt_changesgec13mei-idmei-rt0-nmei_rt0mei_rt2mei_rt2_fix_1meiyap-rt1meiyap1rt2tvf-new-xml
Last change on this file since 0eb4a8e was 15200be, checked in by Mike Ryan <mikeryan@…>, 14 years ago

move libabac into its own directory

  • Property mode set to 100644
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
8typedef struct _abac_set_element_t {
9    char *key;
10    UT_hash_handle hh;
11} abac_set_element_t;
12
13struct _abac_set_t {
14    abac_set_element_t *elts;
15};
16
17/**
18 * Create a new struct.
19 */
20abac_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 */
29int 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 */
45int 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 */
55abac_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 */
70void 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.