mkfn: support OpenType font collections
[neatmkfn.git] / tab.c
blob4c34ca6b5f8e9f2f003a7ffbf37f33e5ad9980f6
1 /* A Dictionary */
2 #include <stdlib.h>
3 #include <string.h>
4 #include "mkfn.h"
6 struct tab {
7 char **keys;
8 void **vals;
9 int n;
10 int *next;
11 int head[256];
14 struct tab *tab_alloc(int sz)
16 struct tab *tab = malloc(sizeof(*tab));
17 int i;
18 memset(tab, 0, sizeof(*tab));
19 tab->keys = malloc(sz * sizeof(tab->keys[0]));
20 tab->vals = malloc(sz * sizeof(tab->vals[0]));
21 tab->next = malloc(sz * sizeof(tab->next[0]));
22 for (i = 0; i < 256; i++)
23 tab->head[i] = -1;
24 return tab;
27 void tab_free(struct tab *tab)
29 free(tab->keys);
30 free(tab->vals);
31 free(tab->next);
32 free(tab);
35 void tab_put(struct tab *tab, char *k, void *v)
37 tab->keys[tab->n] = k;
38 tab->vals[tab->n] = v;
39 tab->next[tab->n] = tab->head[(unsigned char) k[0]];
40 tab->head[(unsigned char) k[0]] = tab->n;
41 tab->n++;
44 void *tab_get(struct tab *tab, char *k)
46 int i = tab->head[(unsigned char) k[0]];
47 while (i >= 0) {
48 if (k[1] == tab->keys[i][1] && !strcmp(k, tab->keys[i]))
49 return tab->vals[i];
50 i = tab->next[i];
52 return NULL;