URI: 
       tmap.c - ics2txt - convert icalendar .ics file to plain text
  HTML 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 }