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