+long
+#define WRITE_VAR_ENTRY() do { \
+ if(fseek(binaryout, entry_pos, SEEK_SET) == -1) wprintf("fseek failed with %s", strerror(errno)); \
+ fwrite(&var_ht_entry, sizeof var_ht_entry, 1, binaryout); \
+} while (0)
+#define INC_VAR_ENTRY() do { \
+ entry_pos += sizeof(var_ht_entry); \
+ if(fseek(binaryout, entry_pos, SEEK_SET) == -1) eprintf("fseek failed with %s", strerror(errno)); \
+ } while (0)
+bin_insert_var_ht_entry
+( long ht_start,
+ int ht_size,
+ struct bin_var_ht_entry_t* var_ht_entry,
+ int overwrite
+)
+{ long entry_pos, ht_end;
+
+ ht_end = ht_start + ht_size;
+ entry_pos = ht_start + sizeof(var_ht_entry) * ht_entry->key;
+ fseek(binaryout, entry_pos, SEEK_SET);
+
+ if (!ENTRY_OCCUPIED())
+ { uprintf("key not occupied\n");
+ WRITE_VAR_ENTRY();
+ }
+ while( ENTRY_OCCUPIED() )
+ { if(overwrite)
+ { if(bin_keys_identical(entry_pos, ht_entry->key))
+ break;
+ else
+ { eprintf("error in hashtable insertion, keys are identical");
+ }
+ }
+ if (HT_END(ht_end))
+ LOOP_ENTRY(ht_start);
+ else
+ INC_VAR_ENTRY();
+ }
+ WRITE_VAR_ENTRY();
+
+ return entry_pos;
+
+/** @see http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 */
+static inline
+int bin_calculate_ht_entries
+( int entries )
+{ entries = (entries << 1) - 1;
+ entries |= entries >> 1;
+ entries |= entries >> 2;
+ entries |= entries >> 4;
+ entries |= entries >> 8;
+ entries |= entries >> 16;
+ return ++entries;
+}