void * MapPtr_set(MapPtr *self, void *key, void *data) { unsigned long index; unsigned int tries; MapPtr_node temp1; MapPtr_node temp2; void *replaced_data = NULL; /* if key is in use, insert new data and return replaced data */ index = MapPtr_hash1(self, key); if(self->table1[index].key == key) { replaced_data = self->table1[index].data; self->table1[index].data = data; return replaced_data; } index = MapPtr_hash2(self, key); if(self->table2[index].key == key) { replaced_data = self->table2[index].data; self->table2[index].data = data; return replaced_data; } /* allocation normally happens here */ temp1.key = key; temp1.data = data; for(;;) { tries = MAPPTR_TRIES_PER_TABLE; while(tries--) { index = MapPtr_hash1(self, temp1.key); if(self->table1[index].key) { temp2 = self->table1[index]; self->table1[index] = temp1; } else { self->table1[index] = temp1; return NULL; } index = MapPtr_hash2(self, temp2.key); if(self->table2[index].key) { temp1 = self->table2[index]; self->table2[index] = temp2; } else { self->table2[index] = temp2; return NULL; } } MapPtr_grow(self); /* might fail, but by this time, temp1 might be already in the table */ } }