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