Option: only one word key per file.
[idzebra-moved-to-github.git] / index / symtab.c
1 /*
2  * Copyright (C) 1994-1995, Index Data I/S 
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: symtab.c,v $
7  * Revision 1.1  1995-09-06 16:11:18  adam
8  * Option: only one word key per file.
9  *
10  */
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <assert.h>
14
15 #include <alexutil.h>
16 #include "index.h"
17
18 struct strentry {
19     char *name;
20     void *info;
21     struct strentry *next;
22 };
23
24 #define STR_HASH 401
25
26 struct strtab {
27     struct strentry *ar[STR_HASH];
28 };
29
30 struct strtab *strtab_mk (void)
31 {
32     int i;
33     struct strtab *p = xmalloc (sizeof (*p));
34     for (i=0; i<STR_HASH; i++)
35         p->ar[i] = NULL;
36     return p;
37 }
38
39 int strtab_src (struct strtab *t, const char *name, void ***infop)
40 {
41     unsigned hash = 0;
42     int i;
43     struct strentry *e;
44
45     for (i=0; name[i]; i++)
46         hash += hash*65519 + name[i];
47     hash = hash % STR_HASH;
48     for (e = t->ar[hash]; e; e = e->next)
49         if (!strcmp(e->name, name))
50         {
51             *infop = &e->info;
52             return 1;
53         }
54     e = xmalloc (sizeof(*e));
55     e->name = xmalloc (strlen(name)+1);
56     strcpy (e->name, name);
57     e->next = t->ar[hash];
58     t->ar[hash] = e;
59     *infop = &e->info;
60     return 0;
61 }
62
63 void strtab_del (struct strtab *t,
64                  void (*func)(const char *name, void *info, void *data),
65                  void *data)
66 {
67     int i;
68     struct strentry *e, *e1;
69
70     for (i = 0; i<STR_HASH; i++)
71         for (e = t->ar[i]; e; e = e1)
72         {
73             e1 = e->next;
74             (*func)(e->name, e->info, data);
75             free (e->name);
76             free (e);
77         }
78     free (t);
79 }