shithub: neatmkfn

ref: c55c928fc9ce1cdbb8fa8a7aeeb6eea54e2b7657
dir: /tab.c/

View raw version
/* A Dictionary */
#include <u.h>
#include <libc.h>
#include "mkfn.h"

struct tab {
	char **keys;
	void **vals;
	int n;
	int *next;
	int head[256];
};

struct tab *tab_alloc(int sz)
{
	struct tab *tab = malloc(sizeof(*tab));
	int i;
	memset(tab, 0, sizeof(*tab));
	tab->keys = malloc(sz * sizeof(tab->keys[0]));
	tab->vals = malloc(sz * sizeof(tab->vals[0]));
	tab->next = malloc(sz * sizeof(tab->next[0]));
	for (i = 0; i < 256; i++)
		tab->head[i] = -1;
	return tab;
}

void tab_free(struct tab *tab)
{
	free(tab->keys);
	free(tab->vals);
	free(tab->next);
	free(tab);
}

void tab_put(struct tab *tab, char *k, void *v)
{
	tab->keys[tab->n] = k;
	tab->vals[tab->n] = v;
	tab->next[tab->n] = tab->head[(unsigned char) k[0]];
	tab->head[(unsigned char) k[0]] = tab->n;
	tab->n++;
}

void *tab_get(struct tab *tab, char *k)
{
	int i = tab->head[(unsigned char) k[0]];
	while (i >= 0) {
		if (k[1] == tab->keys[i][1] && !strcmp(k, tab->keys[i]))
			return tab->vals[i];
		i = tab->next[i];
	}
	return nil;
}