Changed private pointers to char*
[dyninst.git] / pdutil / src / stringPool.C
1 /*
2  * 
3  * $Log: stringPool.C,v $
4  * Revision 1.6  1994/09/22 03:19:13  markc
5  * Changed private pointers to char*
6  *
7  * Revision 1.5  1994/08/05  16:02:05  hollings
8  * More consistant use of stringHandle vs. char *.
9  *
10  * Revision 1.4  1994/07/28  22:22:06  krisna
11  * changed definitions of ReadFunc and WriteFunc to conform to prototypes
12  *
13  * Revision 1.3  1994/07/14  23:43:14  hollings
14  * added abort for malloc failure.
15  *
16  * Revision 1.2  1994/01/26  04:53:43  hollings
17  * Change to using <module>/h/{*.h}
18  *
19  * Revision 1.1  1994/01/25  20:50:27  hollings
20  * First real version of utility library.
21  *
22  * Revision 1.4  1993/08/05  18:58:08  hollings
23  * new includes
24  *
25  * Revision 1.3  1993/05/07  20:19:17  hollings
26  * Upgrade to use dyninst interface.
27  *
28  * Revision 1.2  1993/01/28  19:32:44  hollings
29  * bzero changed to memset.
30  *
31  * Revision 1.1  1992/08/03  20:42:59  hollings
32  * Initial revision
33  *
34  *
35  */
36 #include <stdlib.h>
37 #include <string.h>
38
39 #include "util/h/list.h"
40 #include "util/h/stringPool.h"
41
42 /*
43  * Hash Function from Aho, Sethi, Ulman _Compilers_ (Second Edition)
44  *   page 436.
45  *
46  */
47 static int hash(const char *ch, int size)
48 {
49     register unsigned int h = 0, g;
50
51     for (; *ch != '\0'; ch++) {
52         h = (h << 4) + (*ch);
53         if (g = (h & 0xf0000000)) {
54             h = h ^ (g >> 24);
55             h = h ^ g;
56         }
57     }
58     return(h % size);
59 }
60
61 stringPool::stringPool()
62 {
63     memset(table, '\0', sizeof(table));
64     currPage = new char[4090];
65     currPos = currPage;
66 }
67
68 stringHandle stringPool::find(const char *data)
69 {
70     int hid;
71     stringEntry *curr;
72
73     hid = hash(data, TAB_SIZE);
74     for (curr=table[hid]; curr; curr=curr->next) {
75         if (!strcmp(data, curr->data)) {
76             return(curr->data);
77         }
78     }
79     return(NULL);
80 }
81
82 char *stringPool::getSpace(int size)
83 {
84     char *ret;
85
86     if ((int)(currPos - currPage) + size > PAGE_SIZE) {
87       // create a new page.
88       currPage = new char[4090];
89       if (!currPage) abort();
90       currPos = currPage;
91     }
92     ret = currPos;
93     currPos += size;
94     return(ret);
95 }
96
97 stringHandle stringPool::findAndAdd(const char *data)
98 {
99     int hid;
100     stringHandle val;
101     stringEntry *temp;
102
103     val = find(data);
104     if (!val) {
105         // add it.
106         hid = hash(data, TAB_SIZE);
107         temp = new stringEntry;
108         temp->data = getSpace(strlen(data)+1);
109         strcpy(temp->data, data);
110         temp->next = table[hid];
111         table[hid] = temp;
112         val = (stringHandle) temp->data;
113     }
114     return(val);
115 }