- unsigned NewAddress;
- int OldSegmentIndex, NewSegmentIndex;
- int OldSegmentDir, NewSegmentDir;
- Segment *OldSegment;
- Segment *NewSegment;
- Element *Current;
- Element **Previous;
- Element **LastOfNew;
-
- if (table->maxp + table->p < (DIRECTORY_SIZE << SEGMENT_SIZE_SHIFT)) {
- /* Locate the bucket to be split */
- OldSegmentDir = table->p >> SEGMENT_SIZE_SHIFT;
- OldSegment = table->dir[OldSegmentDir];
- OldSegmentIndex = table->p & (SEGMENT_SIZE-1);
-
- /* Expand address space; if necessary create a new segment */
- NewAddress = table->maxp + table->p;
- NewSegmentDir = NewAddress >> SEGMENT_SIZE_SHIFT;
- NewSegmentIndex = NewAddress & (SEGMENT_SIZE-1);
- if (NewSegmentIndex == 0) {
- table->dir[NewSegmentDir] =
- (Segment *)obstack_alloc (&table->obst,
- sizeof(Segment) * SEGMENT_SIZE);
- memset(table->dir[NewSegmentDir], 0, sizeof(Segment) * SEGMENT_SIZE);
- table->nseg++;
- }
- NewSegment = table->dir[NewSegmentDir];
-
- /* Adjust state variables */
- table->p++;
- if (table->p == table->maxp) {
- table->maxp <<= 1; /* table->maxp *= 2 */
- table->p = 0;
- }
-
- /* Relocate records to the new bucket */
- Previous = &OldSegment[OldSegmentIndex];
- Current = *Previous;
- LastOfNew = &NewSegment[NewSegmentIndex];
- *LastOfNew = NULL;
- while (Current != NULL) {
- if (Hash (table, Current->entry.hash) == NewAddress) {
- /* move to new chain */
- *LastOfNew = Current;
- *Previous = Current->chain;
- LastOfNew = &Current->chain;
- Current = Current->chain;
- *LastOfNew = NULL;
- } else {
- /* leave on old chain */
- Previous = &Current->chain;
- Current = Current->chain;
- }
- }
- }
+ size_t NewAddress;
+ size_t OldSegmentIndex, NewSegmentIndex;
+ size_t OldSegmentDir, NewSegmentDir;
+ Segment *OldSegment;
+ Segment *NewSegment;
+ Element *Current;
+ Element **Previous;
+ Element **LastOfNew;
+
+ if (table->maxp + table->p < (DIRECTORY_SIZE << SEGMENT_SIZE_SHIFT)) {
+ /* Locate the bucket to be split */
+ OldSegmentDir = table->p >> SEGMENT_SIZE_SHIFT;
+ OldSegment = table->dir[OldSegmentDir];
+ OldSegmentIndex = table->p & (SEGMENT_SIZE-1);
+
+ /* Expand address space; if necessary create a new segment */
+ NewAddress = table->maxp + table->p;
+ NewSegmentDir = NewAddress >> SEGMENT_SIZE_SHIFT;
+ NewSegmentIndex = NewAddress & (SEGMENT_SIZE-1);
+ if (NewSegmentIndex == 0) {
+ table->dir[NewSegmentDir] = OALLOCNZ(&table->obst, Segment, SEGMENT_SIZE);
+ table->nseg++;
+ }
+ NewSegment = table->dir[NewSegmentDir];
+
+ /* Adjust state variables */
+ table->p++;
+ if (table->p == table->maxp) {
+ table->maxp <<= 1; /* table->maxp *= 2 */
+ table->p = 0;
+ }
+
+ /* Relocate records to the new bucket */
+ Previous = &OldSegment[OldSegmentIndex];
+ Current = *Previous;
+ LastOfNew = &NewSegment[NewSegmentIndex];
+ *LastOfNew = NULL;
+ while (Current != NULL) {
+ if (Hash (table, Current->entry.hash) == NewAddress) {
+ /* move to new chain */
+ *LastOfNew = Current;
+ *Previous = Current->chain;
+ LastOfNew = &Current->chain;
+ Current = Current->chain;
+ *LastOfNew = NULL;
+ } else {
+ /* leave on old chain */
+ Previous = &Current->chain;
+ Current = Current->chain;
+ }
+ }
+ }