From 78a1ed6899d8648b4cb71b177478b9a8b4eb6c29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yves=20R=C5=B1tschl=C3=A9?= Date: Sun, 10 Aug 2025 23:12:24 +0200 Subject: [PATCH] refactor: make hash dump usuable for debugging --- hash.c | 48 +++++++++++------ hashtest/Makefile | 2 +- hashtest/delete.tst.ref | 56 ++++++++++---------- hashtest/delete_at_end.tst.ref | 56 ++++++++++---------- hashtest/delete_below_floor.tst.ref | 54 +++++++++---------- hashtest/delete_discont.tst.ref | 56 ++++++++++---------- hashtest/delete_empty.tst.ref | 64 +++++++++++------------ hashtest/delete_full.tst.ref | 2 +- hashtest/delete_middle.tst.ref | 56 ++++++++++---------- hashtest/delete_wrap.tst.ref | 56 ++++++++++---------- hashtest/delete_wrap_at_end.tst.ref | 54 +++++++++---------- hashtest/delete_wrap_below_floor.tst.ref | 58 ++++++++++---------- hashtest/delete_wrap_discont.tst.ref | 54 +++++++++---------- hashtest/htest | Bin 24992 -> 17256 bytes hashtest/htest.c | 7 +++ hashtest/insert.tst.ref | 54 +++++++++---------- hashtest/insert_discont.tst.ref | 54 +++++++++---------- hashtest/insert_full_floor.tst.ref | 52 +++++++++--------- hashtest/insert_wrap.tst.ref | 52 +++++++++--------- 19 files changed, 429 insertions(+), 406 deletions(-) diff --git a/hash.c b/hash.c index 608a552..681b925 100644 --- a/hash.c +++ b/hash.c @@ -37,6 +37,11 @@ #include #include +#if HASH_DEBUG +#include +#include +#endif + #include "gap.h" typedef void* hash_item; @@ -44,6 +49,16 @@ typedef void* hash_item; static void* const FREE = NULL; + +/* Define DEBUG adds two functions: + * hash_dump() that prints the hash to a file as text + * hash_item_print() takes a pointer to a function that prints a hash item + * See test suite in hashtest/ for an example + * */ +/* +#define HASH_DEBUG 1 +*/ + struct hash { int hash_size; /* Max number of items in the hash */ int item_cnt; /* Number of items in the hash */ @@ -51,6 +66,9 @@ struct hash { hash_make_key_fn hash_make_key; hash_cmp_item_fn cmp_item; +#ifdef HASH_DEBUG + void (*hash_item_print)(FILE* out, hash_item item); +#endif }; typedef struct hash hash; @@ -188,17 +206,16 @@ int hash_remove(hash* h, hash_item item) return 0; } -#if HASH_TESTING -#include -#include -#define STR_LENGTH 16 -struct hash_item { - int wanted_index; - char str[STR_LENGTH]; -}; +/******************************************************************************/ +#if HASH_DEBUG +void hash_item_print(hash* h, void fn(FILE*, hash_item)) +{ + h->hash_item_print = fn; +} + + void hash_dump(hash* h, char* filename) { - char str[STR_LENGTH]; FILE* out = fopen(filename, "w"); if (!out) { @@ -209,14 +226,13 @@ void hash_dump(hash* h, char* filename) fprintf(out, "\n", h->item_cnt); for (int i = 0; i < h->hash_size; i++) { hash_item item = gap_get(h->data, i); - int idx = 0; - memset(str, 0, STR_LENGTH); - if (item) { - idx = hash_make_key(h, item); - memcpy(str, ((struct hash_item*)item)->str, STR_LENGTH); - } - fprintf(out, "\t%d:%d:%s\n", i, idx, str); + fprintf(out, "\t%d:", i); + if (item) + h->hash_item_print(out, item); + else + fprintf(out, ""); + fprintf(out, "\n"); } fprintf(out, "\n"); fclose(out); diff --git a/hashtest/Makefile b/hashtest/Makefile index 9cb67c6..168319c 100644 --- a/hashtest/Makefile +++ b/hashtest/Makefile @@ -1,5 +1,5 @@ -CFLAGS=-DHASH_TESTING -O2 -Wall +CFLAGS=-DHASH_DEBUG -O2 -Wall OBJ=../hash.o ../gap.o htest.o htest: $(OBJ) diff --git a/hashtest/delete.tst.ref b/hashtest/delete.tst.ref index ca930bb..8513842 100644 --- a/hashtest/delete.tst.ref +++ b/hashtest/delete.tst.ref @@ -1,34 +1,34 @@ - 0:0: - 1:0: - 2:0: - 3:0: - 4:0: - 5:0: - 6:0: - 7:0: - 8:0: - 9:0: + 0: + 1: + 2: + 3: + 4: + 5: + 6: + 7: + 8: + 9: 10:10:aa 11:10:ab 12:10:ac - 13:0: - 14:0: - 15:0: - 16:0: - 17:0: - 18:0: - 19:0: + 13: + 14: + 15: + 16: + 17: + 18: + 19: 20:20:ba - 21:0: - 22:0: - 23:0: - 24:0: - 25:0: - 26:0: - 27:0: - 28:0: - 29:0: - 30:0: - 31:0: + 21: + 22: + 23: + 24: + 25: + 26: + 27: + 28: + 29: + 30: + 31: diff --git a/hashtest/delete_at_end.tst.ref b/hashtest/delete_at_end.tst.ref index c9ba1e5..0d57c3b 100644 --- a/hashtest/delete_at_end.tst.ref +++ b/hashtest/delete_at_end.tst.ref @@ -1,34 +1,34 @@ - 0:0: - 1:0: - 2:0: - 3:0: - 4:0: - 5:0: - 6:0: - 7:0: - 8:0: - 9:0: + 0: + 1: + 2: + 3: + 4: + 5: + 6: + 7: + 8: + 9: 10:10:aa 11:10:ab 12:12:ac 13:13:ad - 14:0: - 15:0: - 16:0: - 17:0: - 18:0: - 19:0: - 20:0: - 21:0: - 22:0: - 23:0: - 24:0: - 25:0: - 26:0: - 27:0: - 28:0: - 29:0: - 30:0: - 31:0: + 14: + 15: + 16: + 17: + 18: + 19: + 20: + 21: + 22: + 23: + 24: + 25: + 26: + 27: + 28: + 29: + 30: + 31: diff --git a/hashtest/delete_below_floor.tst.ref b/hashtest/delete_below_floor.tst.ref index d256c1f..e8f70eb 100644 --- a/hashtest/delete_below_floor.tst.ref +++ b/hashtest/delete_below_floor.tst.ref @@ -1,34 +1,34 @@ 0:30:ad - 1:0: + 1: 2:2:ba 3:2:bb - 4:0: - 5:0: - 6:0: - 7:0: - 8:0: - 9:0: - 10:0: - 11:0: - 12:0: - 13:0: - 14:0: - 15:0: - 16:0: - 17:0: - 18:0: - 19:0: - 20:0: - 21:0: - 22:0: - 23:0: - 24:0: - 25:0: - 26:0: - 27:0: - 28:0: - 29:0: + 4: + 5: + 6: + 7: + 8: + 9: + 10: + 11: + 12: + 13: + 14: + 15: + 16: + 17: + 18: + 19: + 20: + 21: + 22: + 23: + 24: + 25: + 26: + 27: + 28: + 29: 30:30:aa 31:30:ac diff --git a/hashtest/delete_discont.tst.ref b/hashtest/delete_discont.tst.ref index 18b76f8..76e3be0 100644 --- a/hashtest/delete_discont.tst.ref +++ b/hashtest/delete_discont.tst.ref @@ -1,34 +1,34 @@ - 0:0: - 1:0: - 2:0: - 3:0: - 4:0: - 5:0: - 6:0: - 7:0: - 8:0: - 9:0: + 0: + 1: + 2: + 3: + 4: + 5: + 6: + 7: + 8: + 9: 10:10:aa 11:10:bc 12:12:ac - 13:0: + 13: 14:14:ad - 15:0: - 16:0: - 17:0: - 18:0: - 19:0: - 20:0: - 21:0: - 22:0: - 23:0: - 24:0: - 25:0: - 26:0: - 27:0: - 28:0: - 29:0: - 30:0: - 31:0: + 15: + 16: + 17: + 18: + 19: + 20: + 21: + 22: + 23: + 24: + 25: + 26: + 27: + 28: + 29: + 30: + 31: diff --git a/hashtest/delete_empty.tst.ref b/hashtest/delete_empty.tst.ref index c7539cf..1507083 100644 --- a/hashtest/delete_empty.tst.ref +++ b/hashtest/delete_empty.tst.ref @@ -1,34 +1,34 @@ - 0:0: - 1:0: - 2:0: - 3:0: - 4:0: - 5:0: - 6:0: - 7:0: - 8:0: - 9:0: - 10:0: - 11:0: - 12:0: - 13:0: - 14:0: - 15:0: - 16:0: - 17:0: - 18:0: - 19:0: - 20:0: - 21:0: - 22:0: - 23:0: - 24:0: - 25:0: - 26:0: - 27:0: - 28:0: - 29:0: - 30:0: - 31:0: + 0: + 1: + 2: + 3: + 4: + 5: + 6: + 7: + 8: + 9: + 10: + 11: + 12: + 13: + 14: + 15: + 16: + 17: + 18: + 19: + 20: + 21: + 22: + 23: + 24: + 25: + 26: + 27: + 28: + 29: + 30: + 31: diff --git a/hashtest/delete_full.tst.ref b/hashtest/delete_full.tst.ref index 3cc373a..78d58e8 100644 --- a/hashtest/delete_full.tst.ref +++ b/hashtest/delete_full.tst.ref @@ -20,7 +20,7 @@ 18:18:bi 19:19:bj 20:20:ca - 21:0: + 21: 22:22:cd 23:23:ce 24:24:cf diff --git a/hashtest/delete_middle.tst.ref b/hashtest/delete_middle.tst.ref index 1d27ad8..13994d2 100644 --- a/hashtest/delete_middle.tst.ref +++ b/hashtest/delete_middle.tst.ref @@ -1,34 +1,34 @@ - 0:0: - 1:0: - 2:0: - 3:0: - 4:0: - 5:0: - 6:0: - 7:0: - 8:0: - 9:0: + 0: + 1: + 2: + 3: + 4: + 5: + 6: + 7: + 8: + 9: 10:10:ab - 11:0: + 11: 12:12:ac 13:13:ad 14:14:ae - 15:0: - 16:0: - 17:0: - 18:0: - 19:0: - 20:0: - 21:0: - 22:0: - 23:0: - 24:0: - 25:0: - 26:0: - 27:0: - 28:0: - 29:0: - 30:0: - 31:0: + 15: + 16: + 17: + 18: + 19: + 20: + 21: + 22: + 23: + 24: + 25: + 26: + 27: + 28: + 29: + 30: + 31: diff --git a/hashtest/delete_wrap.tst.ref b/hashtest/delete_wrap.tst.ref index aabc8bd..9bd93d6 100644 --- a/hashtest/delete_wrap.tst.ref +++ b/hashtest/delete_wrap.tst.ref @@ -1,34 +1,34 @@ 0:30:ba 1:30:bb - 2:0: - 3:0: - 4:0: - 5:0: - 6:0: - 7:0: - 8:0: - 9:0: - 10:0: - 11:0: - 12:0: - 13:0: - 14:0: - 15:0: - 16:0: - 17:0: - 18:0: - 19:0: - 20:0: - 21:0: - 22:0: - 23:0: - 24:0: - 25:0: - 26:0: - 27:0: - 28:0: - 29:0: + 2: + 3: + 4: + 5: + 6: + 7: + 8: + 9: + 10: + 11: + 12: + 13: + 14: + 15: + 16: + 17: + 18: + 19: + 20: + 21: + 22: + 23: + 24: + 25: + 26: + 27: + 28: + 29: 30:30:aa 31:30:ab diff --git a/hashtest/delete_wrap_at_end.tst.ref b/hashtest/delete_wrap_at_end.tst.ref index aa6683a..8abdc5b 100644 --- a/hashtest/delete_wrap_at_end.tst.ref +++ b/hashtest/delete_wrap_at_end.tst.ref @@ -1,34 +1,34 @@ 0:30:ac 1:1:ad - 2:0: + 2: 3:3:ae - 4:0: - 5:0: - 6:0: - 7:0: - 8:0: - 9:0: - 10:0: - 11:0: - 12:0: - 13:0: - 14:0: - 15:0: - 16:0: - 17:0: - 18:0: - 19:0: - 20:0: - 21:0: - 22:0: - 23:0: - 24:0: - 25:0: - 26:0: - 27:0: - 28:0: - 29:0: + 4: + 5: + 6: + 7: + 8: + 9: + 10: + 11: + 12: + 13: + 14: + 15: + 16: + 17: + 18: + 19: + 20: + 21: + 22: + 23: + 24: + 25: + 26: + 27: + 28: + 29: 30:30:aa 31:30:ab diff --git a/hashtest/delete_wrap_below_floor.tst.ref b/hashtest/delete_wrap_below_floor.tst.ref index c47ff54..6dc5b19 100644 --- a/hashtest/delete_wrap_below_floor.tst.ref +++ b/hashtest/delete_wrap_below_floor.tst.ref @@ -1,34 +1,34 @@ 0:30:ad - 1:0: - 2:0: - 3:0: - 4:0: - 5:0: - 6:0: - 7:0: - 8:0: - 9:0: - 10:0: - 11:0: - 12:0: - 13:0: - 14:0: - 15:0: - 16:0: - 17:0: - 18:0: - 19:0: - 20:0: - 21:0: - 22:0: - 23:0: - 24:0: - 25:0: - 26:0: - 27:0: - 28:0: - 29:0: + 1: + 2: + 3: + 4: + 5: + 6: + 7: + 8: + 9: + 10: + 11: + 12: + 13: + 14: + 15: + 16: + 17: + 18: + 19: + 20: + 21: + 22: + 23: + 24: + 25: + 26: + 27: + 28: + 29: 30:30:aa 31:30:ac diff --git a/hashtest/delete_wrap_discont.tst.ref b/hashtest/delete_wrap_discont.tst.ref index d734495..ba4f284 100644 --- a/hashtest/delete_wrap_discont.tst.ref +++ b/hashtest/delete_wrap_discont.tst.ref @@ -1,34 +1,34 @@ 0:31:ad - 1:0: + 1: 2:2:ba 3:3:bb - 4:0: - 5:0: - 6:0: - 7:0: - 8:0: - 9:0: - 10:0: - 11:0: - 12:0: - 13:0: - 14:0: - 15:0: - 16:0: - 17:0: - 18:0: - 19:0: - 20:0: - 21:0: - 22:0: - 23:0: - 24:0: - 25:0: - 26:0: - 27:0: - 28:0: - 29:0: + 4: + 5: + 6: + 7: + 8: + 9: + 10: + 11: + 12: + 13: + 14: + 15: + 16: + 17: + 18: + 19: + 20: + 21: + 22: + 23: + 24: + 25: + 26: + 27: + 28: + 29: 30:30:aa 31:30:ac diff --git a/hashtest/htest b/hashtest/htest index 90a62e30ef31bb95ef126b32291644f1d5a8ab1e..119f68800e88d256add9d0bab690a0452984059a 100755 GIT binary patch literal 17256 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

+3zmEmkC_XU$8v2;@5!he;;w`yc};T$1lsy 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 diff --git a/hashtest/htest.c b/hashtest/htest.c index dacb27e..55c0cf9 100644 --- a/hashtest/htest.c +++ b/hashtest/htest.c @@ -55,6 +55,11 @@ static void htest_next_key(FILE* f, char* action, int* key, char str[STR_LENGTH] if (res == EOF) exit(0); } +static void item_print(FILE* out, hash_item item) +{ + fprintf(out, "%d:%s", item->wanted_index, item->str); +} + int main(int argc, char* argv[]) { hash* h = hash_init(HASH_SIZE, &hash_make_key, &cmp_item); @@ -63,6 +68,8 @@ int main(int argc, char* argv[]) int line = 0; FILE* f; + hash_item_print(h, item_print); + if (argc != 3) { fprintf(stderr, "Usage: htest