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