X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fsymtab.c;fp=index%2Fsymtab.c;h=d656621a950526972bf636a84b6cd1e33c8ec61b;hb=caa7fe057dd8617129577a6725d2c4e3da066857;hp=0000000000000000000000000000000000000000;hpb=42b0747acfaaf94e94fd6c20b4cd97e10ded0ae0;p=idzebra-moved-to-github.git diff --git a/index/symtab.c b/index/symtab.c new file mode 100644 index 0000000..d656621 --- /dev/null +++ b/index/symtab.c @@ -0,0 +1,79 @@ +/* + * Copyright (C) 1994-1995, Index Data I/S + * All rights reserved. + * Sebastian Hammer, Adam Dickmeiss + * + * $Log: symtab.c,v $ + * Revision 1.1 1995-09-06 16:11:18 adam + * Option: only one word key per file. + * + */ +#include +#include +#include + +#include +#include "index.h" + +struct strentry { + char *name; + void *info; + struct strentry *next; +}; + +#define STR_HASH 401 + +struct strtab { + struct strentry *ar[STR_HASH]; +}; + +struct strtab *strtab_mk (void) +{ + int i; + struct strtab *p = xmalloc (sizeof (*p)); + for (i=0; iar[i] = NULL; + return p; +} + +int strtab_src (struct strtab *t, const char *name, void ***infop) +{ + unsigned hash = 0; + int i; + struct strentry *e; + + for (i=0; name[i]; i++) + hash += hash*65519 + name[i]; + hash = hash % STR_HASH; + for (e = t->ar[hash]; e; e = e->next) + if (!strcmp(e->name, name)) + { + *infop = &e->info; + return 1; + } + e = xmalloc (sizeof(*e)); + e->name = xmalloc (strlen(name)+1); + strcpy (e->name, name); + e->next = t->ar[hash]; + t->ar[hash] = e; + *infop = &e->info; + return 0; +} + +void strtab_del (struct strtab *t, + void (*func)(const char *name, void *info, void *data), + void *data) +{ + int i; + struct strentry *e, *e1; + + for (i = 0; iar[i]; e; e = e1) + { + e1 = e->next; + (*func)(e->name, e->info, data); + free (e->name); + free (e); + } + free (t); +}