1 /***************************************************************************
2 JSPICE3 adaptation of Spice3e2 - Copyright (c) Stephen R. Whiteley 1992
3 Copyright 1990 Regents of the University of California. All rights reserved.
4 Authors: 1993 Stephen R. Whiteley
5 ****************************************************************************/
6
7 #include "spice.h"
8 #include <stdio.h>
9 #include "cpstd.h"
10
11 #define HTAB_SIZE 256
12
13 struct s_hashlist {
14 char *h_name;
15 void *h_what;
16 struct s_hashlist *h_next;
17 };
18 typedef struct s_hashlist hashlist;
19
20 #define HASH(s,n) {int j=0; n=0; while(s[j]) n+=s[j++]; n%=HTAB_SIZE;}
21
22 #define COMP(ss,tt) \
23 {char *s=ss, *t=tt; while(*s && *s == *t){s++; t++;} i = *s - *t;}
24
25
26 void *
htab_init()27 htab_init()
28 {
29 hashlist **h;
30
31 h = (hashlist **)tmalloc(HTAB_SIZE * sizeof(hashlist*));
32 return ((void*)h);
33 }
34
35
36 void
htab_add(name,data,listp)37 htab_add(name,data,listp)
38
39 char *name;
40 void *data;
41 void *listp;
42 {
43 hashlist **list = (hashlist **)listp;
44 hashlist *h, *hh;
45 int n, i;
46
47 if (list == NULL)
48 return;
49 HASH(name,n);
50 h = list[n];
51
52 if (h == NULL) {
53 h = list[n] = (hashlist*)tmalloc(sizeof(hashlist));
54 h->h_name = copy(name);
55 h->h_what = data;
56 }
57 else {
58 for (hh = NULL; h; hh = h, h = h->h_next) {
59 COMP(name,h->h_name);
60 /*
61 i = strcmp(name,h->h_name);
62 */
63 if (i < 0)
64 continue;
65 if (i == 0)
66 return;
67 if (hh) {
68 hh->h_next = (hashlist*)tmalloc(sizeof(hashlist));
69 hh = hh->h_next;
70 }
71 else {
72 hh = (hashlist*)tmalloc(sizeof(hashlist));
73 list[n] = hh;
74 }
75 hh->h_name = copy(name);
76 hh->h_what = data;
77 hh->h_next = h;
78 return;
79 }
80 hh->h_next = (hashlist*)tmalloc(sizeof(hashlist));
81 hh = hh->h_next;
82 hh->h_name = copy(name);
83 hh->h_what = data;
84 hh->h_next = h;
85 }
86 }
87
88
89 void
htab_delete(name,listp)90 htab_delete(name,listp)
91
92 char *name;
93 void *listp;
94 {
95 hashlist **list = (hashlist**)listp;
96 hashlist *h, *hh;
97 int n, i;
98
99 if (list == NULL)
100 return;
101 HASH(name,n);
102 h = list[n];
103
104 if (h) {
105 for (hh = NULL; h; hh = h, h = h->h_next) {
106 COMP(name,h->h_name);
107 /*
108 i = strcmp(name,h->h_name);
109 */
110 if (i < 0)
111 continue;
112 if (i == 0) {
113 if (hh)
114 hh->h_next = h->h_next;
115 else
116 list[n] = h->h_next;
117 txfree(h->h_name);
118 txfree((char*)h);
119 return;
120 }
121 return;
122 }
123 }
124 }
125
126
127 void *
htab_get(name,listp)128 htab_get(name,listp)
129
130 char *name;
131 void *listp;
132 {
133 hashlist **list = (hashlist **)listp;
134 hashlist *h, *hh;
135 int n, i;
136
137 if (list == NULL)
138 return (NULL);
139 HASH(name,n);
140 h = list[n];
141
142 if (h) {
143 for (hh = NULL; h; hh = h, h = h->h_next) {
144 COMP(name,h->h_name);
145 /*
146 i = strcmp(name,h->h_name);
147 */
148 if (i < 0)
149 continue;
150 if (i == 0) {
151 return (h->h_what);
152 }
153 return (NULL);
154 }
155 }
156 return (NULL);
157 }
158
159
160 void
htab_free(listp,freedata)161 htab_free(listp,freedata)
162
163 void *listp;
164 int freedata;
165 {
166 hashlist **list = (hashlist **)listp;
167 hashlist *h, *hh;
168 int i;
169
170 if (list == NULL)
171 return;
172
173 for (i = 0; i < HTAB_SIZE; i++) {
174 for (h = list[i]; h; h = hh) {
175 hh = h->h_next;
176 txfree(h->h_name);
177 if (freedata) txfree((char*)h->h_what);
178 txfree((char*)h);
179 }
180 list[i] = NULL;
181 }
182 }
183
184
185 void
htab_print(listp,datafmt)186 htab_print(listp,datafmt)
187
188 void *listp;
189 char *datafmt;
190 {
191 hashlist **list = (hashlist **)listp;
192 hashlist *h;
193 int i;
194
195 if (list == NULL)
196 return;
197 if (datafmt == NULL)
198 datafmt = "hash=%d name=%s\n";
199 for (i = 0; i < HTAB_SIZE; i++) {
200 for (h = list[i]; h; h = h->h_next) {
201 fprintf(stderr, datafmt, i, h->h_name, h->h_what);
202 }
203 }
204 }
205
206
207 void *
htab_wl(listp)208 htab_wl(listp)
209
210 void *listp;
211 {
212 hashlist **list = (hashlist **)listp;
213 hashlist *h;
214 wordlist *wl, *wl0 = NULL;
215 int i;
216
217 if (list == NULL)
218 return (NULL);
219 for (i = 0; i < HTAB_SIZE; i++) {
220 for (h = list[i]; h; h = h->h_next) {
221 if (wl0 == NULL)
222 wl0 = wl = (wordlist*)tmalloc(sizeof(wordlist));
223 else {
224 wl->wl_next = (wordlist*)tmalloc(sizeof(wordlist));
225 wl->wl_next->wl_prev = wl;
226 wl = wl->wl_next;
227 }
228 wl->wl_word = copy(h->h_name);
229 }
230 }
231 return ((void*)wl0);
232 }
233
234
235 void *
htab_list(listp)236 htab_list(listp)
237
238 void *listp;
239 {
240 hashlist **list = (hashlist **)listp;
241 hashlist *h;
242 wordlist *wl, *wl0 = NULL;
243 int i;
244 char **s;
245
246 if (list == NULL)
247 return (NULL);
248 for (i = 0; i < HTAB_SIZE; i++) {
249 for (h = list[i]; h; h = h->h_next) {
250 if (wl0 == NULL)
251 wl0 = wl = (wordlist*)tmalloc(sizeof(wordlist));
252 else {
253 wl->wl_next = (wordlist*)tmalloc(sizeof(wordlist));
254 wl->wl_next->wl_prev = wl;
255 wl = wl->wl_next;
256 }
257 s = (char**)tmalloc(2*sizeof(char*));
258 s[0] = h->h_name;
259 s[1] = (char*)h->h_what;
260 wl->wl_word = (char*)s;
261 }
262 }
263 return ((void*)wl0);
264 }
265
266
267 int
htab_empty(listp)268 htab_empty(listp)
269
270 void *listp;
271 {
272 hashlist **list = (hashlist **)listp;
273 int i;
274
275 if (list == NULL)
276 return (1);
277 for (i = 0; i < HTAB_SIZE; i++)
278 if (list[i])
279 return (0);
280 return (1);
281 }
282