-#endif /* !STATS */
-
-#ifdef DEBUG
-
-const char *MANGLEP(tag);
-
-
-void MANGLEP(describe) (SET *table)
-{
- unsigned i, j, collide;
- Element *ptr;
- Segment *seg;
-
- printf ("p=%u maxp=%u nkey=%u nseg=%u\n",
- table->p, table->maxp, table->nkey, table->nseg);
- for (i = 0; i < table->nseg; i++) {
- seg = table->dir[i];
- for (j = 0; j < SEGMENT_SIZE; j++) {
- collide = 0;
- ptr = seg[j];
- while (ptr) {
- if (collide) printf ("<%3d>", collide);
- else printf ("table");
- printf ("[%d][%3d]: %u %p\n", i, j, ptr->entry.hash, (void *)ptr->entry.dptr);
- ptr = ptr->chain;
- collide++;
- }
- }
- }
-#ifdef STATS
- MANGLEP(stats)(table);
-#endif
-}
-
-#endif /* !DEBUG */
-
-
-SET *(PMANGLE(new)) (MANGLEP(cmp_fun) cmp, int nslots)
-{
- int i;
- SET *table = XMALLOC(SET);
-
- if (nslots > SEGMENT_SIZE * DIRECTORY_SIZE)
- nslots = DIRECTORY_SIZE;
- else {
- assert (nslots >= 0);
- /* Adjust nslots up to next power of 2, minimum SEGMENT_SIZE */
- for (i = SEGMENT_SIZE; i < nslots; i <<= 1);
- nslots = i >> SEGMENT_SIZE_SHIFT;
- }
-
- table->nseg = table->p = table->nkey = 0;
- table->maxp = nslots << SEGMENT_SIZE_SHIFT;
- table->cmp = cmp;
- table->iter_tail = NULL;
-#ifdef PSET
- table->free_list = NULL;
-#endif
- obstack_init (&table->obst);
-
- /* Make segments */
- for (i = 0; i < nslots; ++i) {
- table->dir[i] = OALLOCNZ(&table->obst, Segment, SEGMENT_SIZE);
- table->nseg++;
- }
-
-#ifdef STATS
- table->naccess = table->ncollision = table->ndups = 0;
- table->max_chain_len = 0;
-#endif
-#ifdef DEBUG
- table->tag = MANGLEP(tag);
-#endif
- return table;