ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
st.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "st.h"
Include dependency graph for st.c:

Go to the source code of this file.

Macros

#define st__NUMCMP(x, y)
 
#define st__NUMHASH(x, size)
 
#define st__PTRHASH(x, size)
 
#define EQUAL(func, x, y)
 
#define do_hash(key, table)
 
#define PTR_NOT_EQUAL(table, ptr, user_key)
 
#define FIND_ENTRY(table, hash_val, key, ptr, last)
 
#define ADD_DIRECT(table, key, value, hash_val, new)
 

Functions

int st__numhash (const char *, int)
 
int st__ptrhash (const char *, int)
 
int st__numcmp (const char *, const char *)
 
int st__ptrcmp (const char *, const char *)
 
st__tablest__init_table_with_params (st__compare_func_type compare, st__hash_func_type hash, int size, int density, double grow_factor, int reorder_flag)
 
st__tablest__init_table (st__compare_func_type compare, st__hash_func_type hash)
 
void st__free_table (st__table *table)
 
int st__lookup (st__table *table, const char *key, char **value)
 
int st__lookup_int (st__table *table, char *key, int *value)
 
int st__insert (st__table *table, const char *key, char *value)
 
int st__add_direct (st__table *table, char *key, char *value)
 
int st__find_or_add (st__table *table, char *key, char ***slot)
 
int st__find (st__table *table, char *key, char ***slot)
 
st__tablest__copy (st__table *old_table)
 
int st__delete (st__table *table, const char **keyp, char **value)
 
int st__delete_int (st__table *table, long *keyp, char **value)
 
int st__foreach (st__table *table, enum st__retval(*func)(char *, char *, char *), char *arg)
 
int st__strhash (const char *string, int modulus)
 
st__generatorst__init_gen (st__table *table)
 
int st__gen (st__generator *gen, const char **key_p, char **value_p)
 
int st__gen_int (st__generator *gen, const char **key_p, long *value_p)
 
void st__free_gen (st__generator *gen)
 

Macro Definition Documentation

◆ ADD_DIRECT

#define ADD_DIRECT ( table,
key,
value,
hash_val,
new )
Value:
{\
if (table->num_entries/table->num_bins >= table->max_density) {\
rehash(table);\
hash_val = do_hash(key,table);\
}\
\
\
new->key = key;\
new->record = value;\
new->next = table->bins[hash_val];\
table->bins[hash_val] = new;\
table->num_entries++;\
}
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
ABC_NAMESPACE_IMPL_START typedef signed char value
enum keys key
Definition main.h:25
#define do_hash(key, table)
Definition st.c:28
Definition st.h:45

Definition at line 154 of file st.c.

154#define ADD_DIRECT(table, key, value, hash_val, new)\
155{\
156 if (table->num_entries/table->num_bins >= table->max_density) {\
157 rehash(table);\
158 hash_val = do_hash(key,table);\
159 }\
160 \
161 new = ABC_ALLOC( st__table_entry, 1);\
162 \
163 new->key = key;\
164 new->record = value;\
165 new->next = table->bins[hash_val];\
166 table->bins[hash_val] = new;\
167 table->num_entries++;\
168}

◆ do_hash

#define do_hash ( key,
table )
Value:
((table->hash == st__ptrhash) ? st__PTRHASH((key),(table)->num_bins) :\
(table->hash == st__numhash) ? st__NUMHASH((key), (table)->num_bins) :\
(*table->hash)((key), (table)->num_bins))
#define st__PTRHASH(x, size)
Definition st.c:22
int st__ptrhash(const char *, int)
Definition st.c:467
#define st__NUMHASH(x, size)
Definition st.c:20
int st__numhash(const char *, int)
Definition st.c:461

Definition at line 28 of file st.c.

28#define do_hash(key, table)\
29 ((table->hash == st__ptrhash) ? st__PTRHASH((key),(table)->num_bins) :\
30 (table->hash == st__numhash) ? st__NUMHASH((key), (table)->num_bins) :\
31 (*table->hash)((key), (table)->num_bins))

◆ EQUAL

#define EQUAL ( func,
x,
y )
Value:
((((func) == st__numcmp) || ((func) == st__ptrcmp)) ?\
(st__NUMCMP((x),(y)) == 0) : ((*func)((x), (y)) == 0))
int st__ptrcmp(const char *, const char *)
Definition st.c:479
#define st__NUMCMP(x, y)
Definition st.c:19
int st__numcmp(const char *, const char *)
Definition st.c:473

Definition at line 23 of file st.c.

23#define EQUAL(func, x, y) \
24 ((((func) == st__numcmp) || ((func) == st__ptrcmp)) ?\
25 (st__NUMCMP((x),(y)) == 0) : ((*func)((x), (y)) == 0))

◆ FIND_ENTRY

#define FIND_ENTRY ( table,
hash_val,
key,
ptr,
last )
Value:
(last) = &(table)->bins[hash_val];\
(ptr) = *(last);\
while (PTR_NOT_EQUAL((table), (ptr), (key))) {\
(last) = &(ptr)->next; (ptr) = *(last);\
}\
if ((ptr) != NULL && (table)->reorder_flag) {\
*(last) = (ptr)->next;\
(ptr)->next = (table)->bins[hash_val];\
(table)->bins[hash_val] = (ptr);\
}
#define PTR_NOT_EQUAL(table, ptr, user_key)
Definition st.c:98

Definition at line 101 of file st.c.

101#define FIND_ENTRY(table, hash_val, key, ptr, last) \
102 (last) = &(table)->bins[hash_val];\
103 (ptr) = *(last);\
104 while (PTR_NOT_EQUAL((table), (ptr), (key))) {\
105 (last) = &(ptr)->next; (ptr) = *(last);\
106 }\
107 if ((ptr) != NULL && (table)->reorder_flag) {\
108 *(last) = (ptr)->next;\
109 (ptr)->next = (table)->bins[hash_val];\
110 (table)->bins[hash_val] = (ptr);\
111 }

◆ PTR_NOT_EQUAL

#define PTR_NOT_EQUAL ( table,
ptr,
user_key )
Value:
(ptr != NULL && !EQUAL(table->compare, user_key, (ptr)->key))
#define EQUAL(func, x, y)
Definition st.c:23

Definition at line 98 of file st.c.

98#define PTR_NOT_EQUAL(table, ptr, user_key)\
99(ptr != NULL && !EQUAL(table->compare, user_key, (ptr)->key))

◆ st__NUMCMP

#define st__NUMCMP ( x,
y )
Value:
((x) != (y))

Definition at line 19 of file st.c.

◆ st__NUMHASH

#define st__NUMHASH ( x,
size )
Value:
(Abc_AbsInt((long)x)%(size))

Definition at line 20 of file st.c.

◆ st__PTRHASH

#define st__PTRHASH ( x,
size )
Value:
((int)(((ABC_PTRUINT_T)(x)>>2)%size))

Definition at line 22 of file st.c.

Function Documentation

◆ st__add_direct()

int st__add_direct ( st__table * table,
char * key,
char * value )

Definition at line 205 of file st.c.

206{
207 int hash_val;
208 st__table_entry *newEntry;
209
210 hash_val = do_hash(key, table);
211 if (table->num_entries / table->num_bins >= table->max_density) {
212 if (rehash(table) == st__OUT_OF_MEM) {
213 return st__OUT_OF_MEM;
214 }
215 }
216 hash_val = do_hash(key, table);
217 newEntry = ABC_ALLOC( st__table_entry, 1);
218 if (newEntry == NULL) {
219 return st__OUT_OF_MEM;
220 }
221 newEntry->key = key;
222 newEntry->record = value;
223 newEntry->next = table->bins[hash_val];
224 table->bins[hash_val] = newEntry;
225 table->num_entries++;
226 return 1;
227}
#define st__OUT_OF_MEM
Definition st.h:113
char * key
Definition st.h:46
st__table_entry * next
Definition st.h:48
char * record
Definition st.h:47

◆ st__copy()

st__table * st__copy ( st__table * old_table)

Definition at line 330 of file st.c.

331{
332 st__table *newEntry_table;
333 st__table_entry *ptr, *newEntryptr, *next, *newEntry;
334 int i, j, num_bins = old_table->num_bins;
335
336 newEntry_table = ABC_ALLOC( st__table, 1);
337 if (newEntry_table == NULL) {
338 return NULL;
339 }
340
341 *newEntry_table = *old_table;
342 newEntry_table->bins = ABC_ALLOC( st__table_entry *, num_bins);
343 if (newEntry_table->bins == NULL) {
344 ABC_FREE(newEntry_table);
345 return NULL;
346 }
347 for(i = 0; i < num_bins ; i++) {
348 newEntry_table->bins[i] = NULL;
349 ptr = old_table->bins[i];
350 while (ptr != NULL) {
351 newEntry = ABC_ALLOC( st__table_entry, 1);
352 if (newEntry == NULL) {
353 for (j = 0; j <= i; j++) {
354 newEntryptr = newEntry_table->bins[j];
355 while (newEntryptr != NULL) {
356 next = newEntryptr->next;
357 ABC_FREE(newEntryptr);
358 newEntryptr = next;
359 }
360 }
361 ABC_FREE(newEntry_table->bins);
362 ABC_FREE(newEntry_table);
363 return NULL;
364 }
365 *newEntry = *ptr;
366 newEntry->next = newEntry_table->bins[i];
367 newEntry_table->bins[i] = newEntry;
368 ptr = ptr->next;
369 }
370 }
371 return newEntry_table;
372}
#define ABC_FREE(obj)
Definition abc_global.h:267
Definition st.h:52
int num_bins
Definition st.h:55
st__table_entry ** bins
Definition st.h:60

◆ st__delete()

int st__delete ( st__table * table,
const char ** keyp,
char ** value )

Definition at line 375 of file st.c.

376{
377 int hash_val;
378 const char *key = *keyp;
379 st__table_entry *ptr, **last;
380
381 hash_val = do_hash(key, table);
382
383 FIND_ENTRY(table, hash_val, key, ptr ,last);
384
385 if (ptr == NULL) {
386 return 0;
387 }
388
389 *last = ptr->next;
390 if (value != NULL) *value = ptr->record;
391 *keyp = ptr->key;
392 ABC_FREE(ptr);
393 table->num_entries--;
394 return 1;
395}
#define FIND_ENTRY(table, hash_val, key, ptr, last)
Definition st.c:101
Here is the caller graph for this function:

◆ st__delete_int()

int st__delete_int ( st__table * table,
long * keyp,
char ** value )

Definition at line 398 of file st.c.

399{
400 int hash_val;
401 char *key = (char *) *keyp;
402 st__table_entry *ptr, **last;
403
404 hash_val = do_hash(key, table);
405
406 FIND_ENTRY(table, hash_val, key, ptr ,last);
407
408 if (ptr == NULL) {
409 return 0;
410 }
411
412 *last = ptr->next;
413 if (value != NULL) *value = ptr->record;
414 *keyp = (long) ptr->key;
415 ABC_FREE(ptr);
416 table->num_entries--;
417 return 1;
418}

◆ st__find()

int st__find ( st__table * table,
char * key,
char *** slot )

Definition at line 264 of file st.c.

265{
266 int hash_val;
267 st__table_entry *ptr, **last;
268
269 hash_val = do_hash(key, table);
270
271 FIND_ENTRY(table, hash_val, key, ptr, last);
272
273 if (ptr == NULL) {
274 return 0;
275 } else {
276 if (slot != NULL) {
277 *slot = &ptr->record;
278 }
279 return 1;
280 }
281}
Here is the caller graph for this function:

◆ st__find_or_add()

int st__find_or_add ( st__table * table,
char * key,
char *** slot )

Definition at line 230 of file st.c.

231{
232 int hash_val;
233 st__table_entry *newEntry, *ptr, **last;
234
235 hash_val = do_hash(key, table);
236
237 FIND_ENTRY(table, hash_val, key, ptr, last);
238
239 if (ptr == NULL) {
240 if (table->num_entries / table->num_bins >= table->max_density) {
241 if (rehash(table) == st__OUT_OF_MEM) {
242 return st__OUT_OF_MEM;
243 }
244 hash_val = do_hash(key, table);
245 }
246 newEntry = ABC_ALLOC( st__table_entry, 1);
247 if (newEntry == NULL) {
248 return st__OUT_OF_MEM;
249 }
250 newEntry->key = key;
251 newEntry->record = (char *) 0;
252 newEntry->next = table->bins[hash_val];
253 table->bins[hash_val] = newEntry;
254 table->num_entries++;
255 if (slot != NULL) *slot = &newEntry->record;
256 return 0;
257 } else {
258 if (slot != NULL) *slot = &ptr->record;
259 return 1;
260 }
261}
Here is the caller graph for this function:

◆ st__foreach()

int st__foreach ( st__table * table,
enum st__retval(* func )(char *, char *, char *),
char * arg )

Definition at line 421 of file st.c.

422{
423 st__table_entry *ptr, **last;
424 enum st__retval retval;
425 int i;
426
427 for(i = 0; i < table->num_bins; i++) {
428 last = &table->bins[i]; ptr = *last;
429 while (ptr != NULL) {
430 retval = (*func)(ptr->key, ptr->record, arg);
431 switch (retval) {
432 case st__CONTINUE:
433 last = &ptr->next; ptr = *last;
434 break;
435 case st__STOP:
436 return 0;
437 case st__DELETE:
438 *last = ptr->next;
439 table->num_entries--; /* cstevens@ic */
440 ABC_FREE(ptr);
441 ptr = *last;
442 }
443 }
444 }
445 return 1;
446}
st__retval
Definition st.h:73
@ st__DELETE
Definition st.h:73
@ st__CONTINUE
Definition st.h:73
@ st__STOP
Definition st.h:73

◆ st__free_gen()

void st__free_gen ( st__generator * gen)

Definition at line 555 of file st.c.

556{
557 ABC_FREE(gen);
558}
Here is the caller graph for this function:

◆ st__free_table()

void st__free_table ( st__table * table)

Definition at line 81 of file st.c.

82{
83 st__table_entry *ptr, *next;
84 int i;
85
86 for(i = 0; i < table->num_bins ; i++) {
87 ptr = table->bins[i];
88 while (ptr != NULL) {
89 next = ptr->next;
90 ABC_FREE(ptr);
91 ptr = next;
92 }
93 }
94 ABC_FREE(table->bins);
95 ABC_FREE(table);
96}
Here is the caller graph for this function:

◆ st__gen()

int st__gen ( st__generator * gen,
const char ** key_p,
char ** value_p )

Definition at line 501 of file st.c.

502{
503 int i;
504
505 if (gen->entry == NULL) {
506 /* try to find next entry */
507 for(i = gen->index; i < gen->table->num_bins; i++) {
508 if (gen->table->bins[i] != NULL) {
509 gen->index = i+1;
510 gen->entry = gen->table->bins[i];
511 break;
512 }
513 }
514 if (gen->entry == NULL) {
515 return 0; /* that's all folks ! */
516 }
517 }
518 *key_p = gen->entry->key;
519 if (value_p != 0) {
520 *value_p = gen->entry->record;
521 }
522 gen->entry = gen->entry->next;
523 return 1;
524}
st__table_entry * entry
Definition st.h:66
st__table * table
Definition st.h:65
int index
Definition st.h:67
Here is the caller graph for this function:

◆ st__gen_int()

int st__gen_int ( st__generator * gen,
const char ** key_p,
long * value_p )

Definition at line 528 of file st.c.

529{
530 int i;
531
532 if (gen->entry == NULL) {
533 /* try to find next entry */
534 for(i = gen->index; i < gen->table->num_bins; i++) {
535 if (gen->table->bins[i] != NULL) {
536 gen->index = i+1;
537 gen->entry = gen->table->bins[i];
538 break;
539 }
540 }
541 if (gen->entry == NULL) {
542 return 0; /* that's all folks ! */
543 }
544 }
545 *key_p = gen->entry->key;
546 if (value_p != 0) {
547 *value_p = (long) gen->entry->record;
548 }
549 gen->entry = gen->entry->next;
550 return 1;
551}

◆ st__init_gen()

st__generator * st__init_gen ( st__table * table)

Definition at line 485 of file st.c.

486{
487 st__generator *gen;
488
489 gen = ABC_ALLOC( st__generator, 1);
490 if (gen == NULL) {
491 return NULL;
492 }
493 gen->table = table;
494 gen->entry = NULL;
495 gen->index = 0;
496 return gen;
497}
Here is the caller graph for this function:

◆ st__init_table()

st__table * st__init_table ( st__compare_func_type compare,
st__hash_func_type hash )

Definition at line 72 of file st.c.

73{
78}
st__table * st__init_table_with_params(st__compare_func_type compare, st__hash_func_type hash, int size, int density, double grow_factor, int reorder_flag)
Definition st.c:41
#define st__DEFAULT_GROW_FACTOR
Definition st.h:104
#define st__DEFAULT_MAX_DENSITY
Definition st.h:102
#define st__DEFAULT_REORDER_FLAG
Definition st.h:105
#define st__DEFAULT_INIT_TABLE_SIZE
Definition st.h:103
Here is the call graph for this function:
Here is the caller graph for this function:

◆ st__init_table_with_params()

st__table * st__init_table_with_params ( st__compare_func_type compare,
st__hash_func_type hash,
int size,
int density,
double grow_factor,
int reorder_flag )

Definition at line 41 of file st.c.

42{
43 int i;
44 st__table *newTable;
45
46 newTable = ABC_ALLOC( st__table, 1);
47 if (newTable == NULL) {
48 return NULL;
49 }
50 newTable->compare = compare;
51 newTable->hash = hash;
52 newTable->num_entries = 0;
53 newTable->max_density = density;
54 newTable->grow_factor = grow_factor;
55 newTable->reorder_flag = reorder_flag;
56 if (size <= 0) {
57 size = 1;
58 }
59 newTable->num_bins = size;
60 newTable->bins = ABC_ALLOC( st__table_entry *, size);
61 if (newTable->bins == NULL) {
62 ABC_FREE(newTable);
63 return NULL;
64 }
65 for(i = 0; i < size; i++) {
66 newTable->bins[i] = 0;
67 }
68 return newTable;
69}
unsigned long long size
Definition giaNewBdd.h:39
int reorder_flag
Definition st.h:58
int max_density
Definition st.h:57
st__compare_func_type compare
Definition st.h:53
double grow_factor
Definition st.h:59
int num_entries
Definition st.h:56
st__hash_func_type hash
Definition st.h:54
Here is the caller graph for this function:

◆ st__insert()

int st__insert ( st__table * table,
const char * key,
char * value )

Definition at line 171 of file st.c.

172{
173 int hash_val;
174 st__table_entry *newEntry;
175 st__table_entry *ptr, **last;
176
177 hash_val = do_hash(key, table);
178
179 FIND_ENTRY(table, hash_val, key, ptr, last);
180
181 if (ptr == NULL) {
182 if (table->num_entries/table->num_bins >= table->max_density) {
183 if (rehash(table) == st__OUT_OF_MEM) {
184 return st__OUT_OF_MEM;
185 }
186 hash_val = do_hash(key, table);
187 }
188 newEntry = ABC_ALLOC( st__table_entry, 1);
189 if (newEntry == NULL) {
190 return st__OUT_OF_MEM;
191 }
192 newEntry->key = (char *)key;
193 newEntry->record = value;
194 newEntry->next = table->bins[hash_val];
195 table->bins[hash_val] = newEntry;
196 table->num_entries++;
197 return 0;
198 } else {
199 ptr->record = value;
200 return 1;
201 }
202}
Here is the caller graph for this function:

◆ st__lookup()

int st__lookup ( st__table * table,
const char * key,
char ** value )

Definition at line 114 of file st.c.

115{
116 int hash_val;
117 st__table_entry *ptr, **last;
118
119 hash_val = do_hash(key, table);
120
121 FIND_ENTRY(table, hash_val, key, ptr, last);
122
123 if (ptr == NULL) {
124 return 0;
125 } else {
126 if (value != NULL) {
127 *value = ptr->record;
128 }
129 return 1;
130 }
131}
Here is the caller graph for this function:

◆ st__lookup_int()

int st__lookup_int ( st__table * table,
char * key,
int * value )

Definition at line 134 of file st.c.

135{
136 int hash_val;
137 st__table_entry *ptr, **last;
138
139 hash_val = do_hash(key, table);
140
141 FIND_ENTRY(table, hash_val, key, ptr, last);
142
143 if (ptr == NULL) {
144 return 0;
145 } else {
146 if (value != 0) {
147 *value = (long) ptr->record;
148 }
149 return 1;
150 }
151}
Here is the caller graph for this function:

◆ st__numcmp()

int st__numcmp ( const char * x,
const char * y )

Definition at line 473 of file st.c.

474{
475 return st__NUMCMP(x, y);
476}
Here is the caller graph for this function:

◆ st__numhash()

int st__numhash ( const char * x,
int size )

Definition at line 461 of file st.c.

462{
463 return st__NUMHASH(x, size);
464}
Here is the caller graph for this function:

◆ st__ptrcmp()

int st__ptrcmp ( const char * x,
const char * y )

Definition at line 479 of file st.c.

480{
481 return st__NUMCMP(x, y);
482}
Here is the caller graph for this function:

◆ st__ptrhash()

int st__ptrhash ( const char * x,
int size )

Definition at line 467 of file st.c.

468{
469 return st__PTRHASH(x, size);
470}
Here is the caller graph for this function:

◆ st__strhash()

int st__strhash ( const char * string,
int modulus )

Definition at line 449 of file st.c.

450{
451 unsigned char * ustring = (unsigned char *)string;
452 unsigned c, val = 0;
453 assert( modulus > 0 );
454 while ((c = *ustring++) != '\0') {
455 val = val*997 + c;
456 }
457 return (int)(val%modulus);
458}
#define assert(ex)
Definition util_old.h:213
Here is the caller graph for this function: