tmap.c - ics2txt - convert icalendar .ics file to plain text
(HTM) git clone git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
---
tmap.c (1701B)
---
1 #include "map.h"
2
3 #include <stdlib.h>
4 #include <string.h>
5
6 #include "util.h"
7
8 static int
9 map_cmp(void const *v1, void const *v2)
10 {
11 struct map_entry const *e1 = v1, *e2 = v2;
12
13 return strcmp(e1->key, e2->key);
14 }
15
16 void *
17 map_get(struct map *map, char *key)
18 {
19 struct map_entry *entry, k = { .key = key };
20 size_t sz;
21
22 sz = sizeof(*map->entry);
23 if ((entry = bsearch(&k, map->entry, map->len, sz, map_cmp)) == NULL)
24 return NULL;
25 return entry->value;
26 }
27
28 int
29 map_set(struct map *map, char *key, void *value)
30 {
31 struct map_entry *insert, *e;
32 size_t i, sz;
33 void *v;
34
35 for (i = 0; i < map->len; i++) {
36 int cmp = strcmp(key, map->entry[i].key);
37
38 if (cmp == 0) {
39 map->entry[i].value = value;
40 return 0;
41 }
42 if (cmp < 0)
43 break;
44 }
45
46 sz = sizeof(*map->entry);
47 if ((v = reallocarray(map->entry, map->len + 1, sz)) == NULL)
48 return -1;
49 map->entry = v;
50 map->len++;
51
52 insert = map->entry + i;
53 for (e = map->entry + map->len - 2; e >= insert; e--)
54 e[1] = e[0];
55
56 insert->key = key;
57 insert->value = value;
58
59 return 0;
60 }
61
62 int
63 map_del(struct map *map, char *key)
64 {
65 size_t i;
66
67 for (i = 0; i < map->len; i++) {
68 int cmp = strcmp(key, map->entry[i].key);
69
70 if (cmp == 0)
71 break;
72 if (cmp < 0)
73 return -1;
74 }
75 if (i == map->len)
76 return -1;
77
78 map->len--;
79 for (; i < map->len; i++)
80 map->entry[i] = map->entry[i + 1];
81 return 0;
82 }
83
84 void
85 map_init(struct map *map)
86 {
87 memset(map, 0, sizeof(*map));
88 }
89
90 void
91 map_free_keys(struct map *map)
92 {
93 for (size_t i = 0; i < map->len; i++)
94 free(map->entry[i].key);
95 }
96
97 void
98 map_free(struct map *map, void (*fn)(void *))
99 {
100 if (fn != NULL) {
101 for (size_t i = 0; i < map->len; i++)
102 fn(map->entry[i].value);
103 }
104 free(map->entry);
105 map->len = 0;
106 }