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
RevLine 
[cb0f2b2]1#include <stdlib.h>
2
[2fd24c7]3#include "abac_set.h"
[3c251d0]4#include "abac_util.h"
[cb0f2b2]5
6#include "uthash.h"
7
[2fd24c7]8typedef struct _abac_set_element_t {
[fdb4f28]9    char *key;
10    UT_hash_handle hh;
[2fd24c7]11} abac_set_element_t;
[fdb4f28]12
[2fd24c7]13struct _abac_set_t {
14    abac_set_element_t *elts;
[fdb4f28]15};
16
[48f3a37]17/**
18 * Create a new struct.
19 */
[2fd24c7]20abac_set_t *abac_set_new(void) {
[3c251d0]21    abac_set_t *ret = abac_xmalloc(sizeof(abac_set_t));
[cb0f2b2]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 */
[2fd24c7]29int abac_set_add(abac_set_t *set, char *value) {
30    abac_set_element_t *elt;
[cb0f2b2]31
32    HASH_FIND_STR(set->elts, value, elt);
33    if (elt) return 0; // already exists
34
[3c251d0]35    elt = abac_xmalloc(sizeof(abac_set_element_t));
36    elt->key = abac_xstrdup(value);
[cb0f2b2]37    HASH_ADD_KEYPTR(hh, set->elts, elt->key, strlen(elt->key), elt);
38
39    return 1;
40}
[ebde9dd]41
[1fa0621]42/**
43 * Does the set contain the value.
44 */
[2fd24c7]45int abac_set_contains(abac_set_t *set, char *value) {
46    abac_set_element_t *elt;
[1fa0621]47
48    HASH_FIND_STR(set->elts, value, elt);
49    return elt != NULL;
50}
51
[ebde9dd]52/**
53 * Return a list of the set's elements.
54 */
[2fd24c7]55abac_list_t *abac_set_elements(abac_set_t *set) {
56    abac_set_element_t *elt;
[6d5623e]57    abac_list_t *ret = abac_list_new();
[ebde9dd]58
59    for (elt = set->elts; elt != NULL; elt = elt->hh.next) {
60        char *next = elt->key;
[6d5623e]61        abac_list_add(ret, next);
[ebde9dd]62    }
63
64    return ret;
65}
66
67/**
68 * Destroy a set.
69 */
[2fd24c7]70void abac_set_free(abac_set_t *set) {
71    abac_set_element_t *elt;
[ebde9dd]72
[be963dc]73    while ((elt = set->elts) != NULL) {
74        HASH_DEL(set->elts, elt);
[ebde9dd]75        free(elt->key);
[be963dc]76        free(elt);
77    }
[ebde9dd]78
79    free(set);
80}
Note: See TracBrowser for help on using the repository browser.