+{ uint32_t entry[ht_row_values];
+# define ENTRY_VAL(N) entry[N]
+# define ENTRY_KEY ENTRY_VAL(0)
+ uint8_t looped = 0;
+ size_t entry_row = key & (ht_rows - 1);
+ int i;
+ long writepos, startpos;
+ startpos = ftell(binaryout);
+ next_entry:
+ SEEK_TO(ht_start + (entry_row * sizeof(entry)));
+ READ_DATA(entry, sizeof(uint32_t) * ht_row_values);
+ for (i = 0; i < ht_row_values; i++)
+ if (entry[i] != 0)
+ goto populated;
+ write_position:
+ SEEK_REL(sizeof(uint32_t) * ht_which_value);
+ WRITE_DATA(entry + ht_which_value, sizeof(*entry));
+ writepos = ftell(binaryout);
+ SEEK_TO(startpos);
+ return writepos;
+ populated:
+ if (ENTRY_KEY == key)
+ { if (overwrite != NULL)
+ *overwrite = ENTRY_VAL(ht_which_value);
+ ENTRY_VAL(ht_which_value) = value;
+ goto write_position;
+ }
+ if (entry_row < ht_rows)
+ entry_row++;
+ else if (looped)
+ eprintf("cannot insert into filled hashtable\n");
+ else
+ { looped++;
+ entry_row = 0;
+ }
+ goto next_entry;
+}