Blame


1 8d1b399b 2021-07-22 op /*
2 8d1b399b 2021-07-22 op * Copyright (c) 2021 Omar Polo <op@omarpolo.com>
3 8d1b399b 2021-07-22 op *
4 8d1b399b 2021-07-22 op * Permission to use, copy, modify, and distribute this software for any
5 8d1b399b 2021-07-22 op * purpose with or without fee is hereby granted, provided that the above
6 8d1b399b 2021-07-22 op * copyright notice and this permission notice appear in all copies.
7 8d1b399b 2021-07-22 op *
8 8d1b399b 2021-07-22 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 8d1b399b 2021-07-22 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 8d1b399b 2021-07-22 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 8d1b399b 2021-07-22 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 8d1b399b 2021-07-22 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 8d1b399b 2021-07-22 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 8d1b399b 2021-07-22 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 8d1b399b 2021-07-22 op */
16 8d1b399b 2021-07-22 op
17 8d1b399b 2021-07-22 op #include "compat.h"
18 8d1b399b 2021-07-22 op
19 8d1b399b 2021-07-22 op #include <ohash.h>
20 8d1b399b 2021-07-22 op #include <stdlib.h>
21 8d1b399b 2021-07-22 op
22 8d1b399b 2021-07-22 op #include "kamid.h"
23 8d1b399b 2021-07-22 op #include "utils.h"
24 8d1b399b 2021-07-22 op
25 8d1b399b 2021-07-22 op static void *hash_alloc(size_t, void *);
26 8d1b399b 2021-07-22 op static void *hash_calloc(size_t, size_t, void *);
27 8d1b399b 2021-07-22 op static void hash_free(void *, void *);
28 8d1b399b 2021-07-22 op
29 8d1b399b 2021-07-22 op static int table_static_open(struct table *);
30 8d1b399b 2021-07-22 op static int table_static_add(struct table *, const char *, const char *);
31 8d1b399b 2021-07-22 op static int table_static_lookup(struct table *, const char *, char **);
32 8d1b399b 2021-07-22 op static void table_static_close(struct table *);
33 8d1b399b 2021-07-22 op
34 8d1b399b 2021-07-22 op struct table_backend table_static = {
35 8d1b399b 2021-07-22 op "static",
36 8d1b399b 2021-07-22 op table_static_open,
37 8d1b399b 2021-07-22 op table_static_add,
38 8d1b399b 2021-07-22 op table_static_lookup,
39 8d1b399b 2021-07-22 op table_static_close,
40 8d1b399b 2021-07-22 op };
41 8d1b399b 2021-07-22 op
42 8d1b399b 2021-07-22 op struct kp {
43 8d1b399b 2021-07-22 op char *key;
44 8d1b399b 2021-07-22 op char *val;
45 8d1b399b 2021-07-22 op };
46 8d1b399b 2021-07-22 op
47 8d1b399b 2021-07-22 op static void *
48 8d1b399b 2021-07-22 op hash_alloc(size_t len, void *d)
49 8d1b399b 2021-07-22 op {
50 8d1b399b 2021-07-22 op return xmalloc(len);
51 8d1b399b 2021-07-22 op }
52 8d1b399b 2021-07-22 op
53 8d1b399b 2021-07-22 op static void *
54 8d1b399b 2021-07-22 op hash_calloc(size_t nmemb, size_t size, void *d)
55 8d1b399b 2021-07-22 op {
56 8d1b399b 2021-07-22 op return xcalloc(nmemb, size);
57 8d1b399b 2021-07-22 op }
58 8d1b399b 2021-07-22 op
59 8d1b399b 2021-07-22 op static void
60 8d1b399b 2021-07-22 op hash_free(void *ptr, void *d)
61 8d1b399b 2021-07-22 op {
62 8d1b399b 2021-07-22 op free(ptr);
63 8d1b399b 2021-07-22 op }
64 8d1b399b 2021-07-22 op
65 8d1b399b 2021-07-22 op static int
66 8d1b399b 2021-07-22 op table_static_open(struct table *t)
67 8d1b399b 2021-07-22 op {
68 8d1b399b 2021-07-22 op struct ohash_info info = {
69 8d1b399b 2021-07-22 op .key_offset = offsetof(struct kp, key),
70 8d1b399b 2021-07-22 op .calloc = hash_calloc,
71 8d1b399b 2021-07-22 op .free = hash_free,
72 8d1b399b 2021-07-22 op .alloc = hash_alloc,
73 8d1b399b 2021-07-22 op };
74 8d1b399b 2021-07-22 op
75 8d1b399b 2021-07-22 op t->t_handle = xmalloc(sizeof(struct ohash));
76 8d1b399b 2021-07-22 op ohash_init(t->t_handle, 5, &info);
77 8d1b399b 2021-07-22 op return 0;
78 8d1b399b 2021-07-22 op }
79 8d1b399b 2021-07-22 op
80 8d1b399b 2021-07-22 op int
81 8d1b399b 2021-07-22 op table_static_add(struct table *t, const char *key, const char *val)
82 8d1b399b 2021-07-22 op {
83 8d1b399b 2021-07-22 op struct kp *kp;
84 8d1b399b 2021-07-22 op unsigned int slot;
85 8d1b399b 2021-07-22 op
86 8d1b399b 2021-07-22 op kp = xcalloc(1, sizeof(*kp));
87 8d1b399b 2021-07-22 op kp->key = xstrdup(key);
88 8d1b399b 2021-07-22 op if (val != NULL)
89 8d1b399b 2021-07-22 op kp->val = xstrdup(val);
90 8d1b399b 2021-07-22 op
91 8d1b399b 2021-07-22 op slot = ohash_qlookup(t->t_handle, kp->key);
92 8d1b399b 2021-07-22 op ohash_insert(t->t_handle, slot, kp);
93 8d1b399b 2021-07-22 op
94 8d1b399b 2021-07-22 op return 0;
95 8d1b399b 2021-07-22 op }
96 8d1b399b 2021-07-22 op
97 8d1b399b 2021-07-22 op int
98 8d1b399b 2021-07-22 op table_static_lookup(struct table *t, const char *key, char **ret_val)
99 8d1b399b 2021-07-22 op {
100 8d1b399b 2021-07-22 op struct kp *kp;
101 8d1b399b 2021-07-22 op unsigned int slot;
102 8d1b399b 2021-07-22 op
103 8d1b399b 2021-07-22 op slot = ohash_qlookup(t->t_handle, key);
104 8d1b399b 2021-07-22 op if ((kp = ohash_find(t->t_handle, slot)) == NULL)
105 8d1b399b 2021-07-22 op return -1;
106 8d1b399b 2021-07-22 op
107 8d1b399b 2021-07-22 op *ret_val = xstrdup(kp->val);
108 8d1b399b 2021-07-22 op return 0;
109 8d1b399b 2021-07-22 op }
110 8d1b399b 2021-07-22 op
111 8d1b399b 2021-07-22 op static void
112 8d1b399b 2021-07-22 op table_static_close(struct table *t)
113 8d1b399b 2021-07-22 op {
114 8d1b399b 2021-07-22 op struct kp *kp;
115 8d1b399b 2021-07-22 op unsigned int i;
116 8d1b399b 2021-07-22 op
117 8d1b399b 2021-07-22 op for (kp = ohash_first(t->t_handle, &i);
118 8d1b399b 2021-07-22 op kp != NULL;
119 8d1b399b 2021-07-22 op kp = ohash_next(t->t_handle, &i)) {
120 8d1b399b 2021-07-22 op ohash_remove(t->t_handle, i);
121 8d1b399b 2021-07-22 op free(kp->key);
122 8d1b399b 2021-07-22 op free(kp->val);
123 8d1b399b 2021-07-22 op free(kp);
124 8d1b399b 2021-07-22 op }
125 8d1b399b 2021-07-22 op
126 8d1b399b 2021-07-22 op free(t->t_handle);
127 8d1b399b 2021-07-22 op }