diff --git a/main.c b/main.c index 2a6f5f5..9b29025 100644 --- a/main.c +++ b/main.c @@ -137,43 +137,43 @@ int main(int argc, char *argv[]) { tt_node_ptr_t A = tt_grab(&a, MAKE_PATH(&a, a_set, {TT_BOS, 'A', TT_EOS})); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("A", A, &a, 1); + tt_dump_arena_dot_styled("A", A, &a, TT_STYLE_TEXT_LABELS); tt_node_ptr_t B = tt_grab(&a, MAKE_PATH(&a, b_set, {TT_BOS, 'B', TT_EOS})); printf("\nB node: %u/%u\n", tt_ptr_idx(B), tt_ptr_tag(B)); - tt_dump_arena_dot_styled("B", B, &a, 1); + tt_dump_arena_dot_styled("B", B, &a, TT_STYLE_TEXT_LABELS); tt_node_ptr_t C = tt_trie_union_map(&a, A, B); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpredrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpredrop", C, &a, TT_STYLE_TEXT_LABELS); tt_drop(&a, A); tt_drop(&a, B); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpostdrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpostdrop", C, &a, TT_STYLE_TEXT_LABELS); putchar('\n'); tt_dump_routingtable(&a, C, 0); tt_drop(&a, C); } tt_arena_flush(&a); - tt_dump_arena_dot_styled("after1", TT_NO_PTR, &a, 1); + tt_dump_arena_dot_styled("after1", TT_NO_PTR, &a, TT_STYLE_TEXT_LABELS); printf("\n============================================================ 2\n"); { tt_node_ptr_t A = tt_grab(&a, MAKE_PATH(&a, a_set, {TT_BOS, 'A', TT_EOS})); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("A", A, &a, 1); + tt_dump_arena_dot_styled("A", A, &a, TT_STYLE_TEXT_LABELS); tt_node_ptr_t B = tt_grab(&a, MAKE_PATH(&a, b_set, {TT_BOS, TT_WILD, TT_EOS})); printf("\nB node: %u/%u\n", tt_ptr_idx(B), tt_ptr_tag(B)); - tt_dump_arena_dot_styled("B", B, &a, 1); + tt_dump_arena_dot_styled("B", B, &a, TT_STYLE_TEXT_LABELS); tt_node_ptr_t C = tt_trie_union_map(&a, A, B); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpredrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpredrop", C, &a, TT_STYLE_TEXT_LABELS); tt_drop(&a, A); tt_drop(&a, B); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpostdrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpostdrop", C, &a, TT_STYLE_TEXT_LABELS); putchar('\n'); tt_dump_routingtable(&a, C, 0); tt_drop(&a, C); @@ -184,18 +184,18 @@ int main(int argc, char *argv[]) { tt_node_ptr_t A = tt_grab(&a, MAKE_PATH(&a, a_set, {TT_BOS, 'A', TT_EOS})); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("A", A, &a, 1); + tt_dump_arena_dot_styled("A", A, &a, TT_STYLE_TEXT_LABELS); tt_node_ptr_t B = tt_grab(&a, MAKE_PATH(&a, b_set, {TT_WILD})); printf("\nB node: %u/%u\n", tt_ptr_idx(B), tt_ptr_tag(B)); - tt_dump_arena_dot_styled("B", B, &a, 1); + tt_dump_arena_dot_styled("B", B, &a, TT_STYLE_TEXT_LABELS); tt_node_ptr_t C = tt_trie_union_map(&a, A, B); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpredrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpredrop", C, &a, TT_STYLE_TEXT_LABELS); tt_drop(&a, A); tt_drop(&a, B); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpostdrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpostdrop", C, &a, TT_STYLE_TEXT_LABELS); putchar('\n'); tt_dump_routingtable(&a, C, 0); tt_drop(&a, C); @@ -206,18 +206,18 @@ int main(int argc, char *argv[]) { tt_node_ptr_t A = tt_grab(&a, MAKE_PATH(&a, b_set /* !!! */, {TT_BOS, 'A', TT_EOS})); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("A", A, &a, 1); + tt_dump_arena_dot_styled("A", A, &a, TT_STYLE_TEXT_LABELS); tt_node_ptr_t B = tt_grab(&a, MAKE_PATH(&a, b_set, {TT_WILD})); printf("\nB node: %u/%u\n", tt_ptr_idx(B), tt_ptr_tag(B)); - tt_dump_arena_dot_styled("B", B, &a, 1); + tt_dump_arena_dot_styled("B", B, &a, TT_STYLE_TEXT_LABELS); tt_node_ptr_t C = tt_trie_union_map(&a, A, B); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpredrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpredrop", C, &a, TT_STYLE_TEXT_LABELS); tt_drop(&a, A); tt_drop(&a, B); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpostdrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpostdrop", C, &a, TT_STYLE_TEXT_LABELS); putchar('\n'); tt_dump_routingtable(&a, C, 0); tt_drop(&a, C); @@ -228,18 +228,18 @@ int main(int argc, char *argv[]) { tt_node_ptr_t A = tt_grab(&a, MAKE_PATH(&a, a_set, {TT_BOS, 'A', 'B', TT_EOS})); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("A", A, &a, 1); + tt_dump_arena_dot_styled("A", A, &a, TT_STYLE_TEXT_LABELS); tt_node_ptr_t B = tt_grab(&a, MAKE_PATH(&a, b_set, {TT_BOS, TT_WILD, TT_EOS})); printf("\nB node: %u/%u\n", tt_ptr_idx(B), tt_ptr_tag(B)); - tt_dump_arena_dot_styled("B", B, &a, 1); + tt_dump_arena_dot_styled("B", B, &a, TT_STYLE_TEXT_LABELS); tt_node_ptr_t C = tt_trie_union_map(&a, A, B); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpredrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpredrop", C, &a, TT_STYLE_TEXT_LABELS); tt_drop(&a, A); tt_drop(&a, B); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpostdrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpostdrop", C, &a, TT_STYLE_TEXT_LABELS); putchar('\n'); tt_dump_routingtable(&a, C, 0); tt_drop(&a, C); @@ -250,18 +250,18 @@ int main(int argc, char *argv[]) { tt_node_ptr_t A = tt_grab(&a, MAKE_PATH(&a, a_set, {TT_BOS, 'A', 'B', TT_EOS})); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("A", A, &a, 1); + tt_dump_arena_dot_styled("A", A, &a, TT_STYLE_TEXT_LABELS); tt_node_ptr_t B = tt_grab(&a, MAKE_PATH(&a, b_set, {TT_BOS, TT_WILD, TT_WILD, TT_EOS})); printf("\nB node: %u/%u\n", tt_ptr_idx(B), tt_ptr_tag(B)); - tt_dump_arena_dot_styled("B", B, &a, 1); + tt_dump_arena_dot_styled("B", B, &a, TT_STYLE_TEXT_LABELS); tt_node_ptr_t C = tt_trie_union_map(&a, A, B); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpredrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpredrop", C, &a, TT_STYLE_TEXT_LABELS); tt_drop(&a, A); tt_drop(&a, B); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpostdrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpostdrop", C, &a, TT_STYLE_TEXT_LABELS); putchar('\n'); tt_dump_routingtable(&a, C, 0); tt_drop(&a, C); @@ -272,41 +272,41 @@ int main(int argc, char *argv[]) { tt_node_ptr_t A = tt_grab(&a, MAKE_PATH(&a, a_set, {TT_BOS, 'A', TT_WILD, TT_EOS})); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("A", A, &a, 1); + tt_dump_arena_dot_styled("A", A, &a, TT_STYLE_TEXT_LABELS); tt_node_ptr_t B = tt_grab(&a, MAKE_PATH(&a, b_set, {TT_BOS, TT_WILD, 'B', TT_EOS})); printf("\nB node: %u/%u\n", tt_ptr_idx(B), tt_ptr_tag(B)); - tt_dump_arena_dot_styled("B", B, &a, 1); + tt_dump_arena_dot_styled("B", B, &a, TT_STYLE_TEXT_LABELS); tt_node_ptr_t C = tt_trie_union_map(&a, A, B); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpredrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpredrop", C, &a, TT_STYLE_TEXT_LABELS); tt_drop(&a, A); tt_drop(&a, B); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpostdrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpostdrop", C, &a, TT_STYLE_TEXT_LABELS); putchar('\n'); tt_dump_routingtable(&a, C, 0); tt_node_ptr_t D = tt_trie_union_map(&a, C, C); tt_drop(&a, C); tt_arena_flush(&a); - tt_dump_arena_dot_styled("D", D, &a, 1); + tt_dump_arena_dot_styled("D", D, &a, TT_STYLE_TEXT_LABELS); tt_dump_routingtable(&a, D, 0); tt_node_ptr_t E = tt_grab(&a, MAKE_PATH(&a, b_set, {TT_WILD})); tt_arena_flush(&a); - tt_dump_arena_dot_styled("E", E, &a, 1); + tt_dump_arena_dot_styled("E", E, &a, TT_STYLE_TEXT_LABELS); tt_node_ptr_t F = tt_trie_union_map(&a, D, E); tt_drop(&a, D); tt_drop(&a, E); tt_arena_flush(&a); - tt_dump_arena_dot_styled("F", F, &a, 1); + tt_dump_arena_dot_styled("F", F, &a, TT_STYLE_TEXT_LABELS); tt_dump_routingtable(&a, F, 0); tt_node_ptr_t G = tt_grab(&a, tt_trie_relabel_const(&a, F, a_set)); tt_drop(&a, F); tt_arena_flush(&a); - tt_dump_arena_dot_styled("G", G, &a, 1); + tt_dump_arena_dot_styled("G", G, &a, TT_STYLE_TEXT_LABELS); tt_dump_routingtable(&a, G, 0); tt_drop(&a, G); } @@ -316,20 +316,20 @@ int main(int argc, char *argv[]) { tt_node_ptr_t A = tt_grab(&a, MAKE_PATH(&a, TT_EMPTY_DICT, {TT_BOS, 'A', TT_WILD, TT_EOS})); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("A", A, &a, 1); + tt_dump_arena_dot_styled("A", A, &a, TT_STYLE_TEXT_LABELS); tt_dump_routingtable(&a, A, 0); tt_node_ptr_t B = tt_grab(&a, MAKE_PATH(&a, TT_EMPTY_DICT, {TT_BOS, TT_WILD, 'B', TT_EOS})); printf("\nB node: %u/%u\n", tt_ptr_idx(B), tt_ptr_tag(B)); - tt_dump_arena_dot_styled("B", B, &a, 1); + tt_dump_arena_dot_styled("B", B, &a, TT_STYLE_TEXT_LABELS); tt_dump_routingtable(&a, B, 0); tt_node_ptr_t C = tt_trie_subtract_set(&a, A, B); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpredrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpredrop", C, &a, TT_STYLE_TEXT_LABELS); tt_drop(&a, A); tt_drop(&a, B); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpostdrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpostdrop", C, &a, TT_STYLE_TEXT_LABELS); putchar('\n'); tt_dump_routingtable(&a, C, 0); tt_drop(&a, C); @@ -340,24 +340,24 @@ int main(int argc, char *argv[]) { tt_node_ptr_t A = tt_grab(&a, MAKE_PATH(&a, TT_EMPTY_DICT, {TT_WILD})); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("A", A, &a, 1); + tt_dump_arena_dot_styled("A", A, &a, TT_STYLE_TEXT_LABELS); tt_dump_routingtable(&a, A, 0); tt_node_ptr_t B = tt_grab(&a, MAKE_PATH(&a, TT_EMPTY_DICT, {TT_BOS, 'A', 'B', TT_EOS})); printf("\nB node: %u/%u\n", tt_ptr_idx(B), tt_ptr_tag(B)); - tt_dump_arena_dot_styled("B", B, &a, 1); + tt_dump_arena_dot_styled("B", B, &a, TT_STYLE_TEXT_LABELS); tt_dump_routingtable(&a, B, 0); tt_node_ptr_t C = tt_trie_subtract_set(&a, A, B); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpredrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpredrop", C, &a, TT_STYLE_TEXT_LABELS); tt_drop(&a, A); tt_drop(&a, B); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpostdrop", C, &a, 1); + tt_dump_arena_dot_styled("Cpostdrop", C, &a, TT_STYLE_TEXT_LABELS | TT_STYLE_HIDE_DETAILS); tt_replace(&a, &C, tt_trie_relabel_const(&a, C, a_set)); printf("\nC node post relabel: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("Cpostrelabel", C, &a, 1); + tt_dump_arena_dot_styled("Cpostrelabel", C, &a, TT_STYLE_TEXT_LABELS | TT_STYLE_HIDE_DETAILS); putchar('\n'); tt_dump_routingtable(&a, C, 0); tt_drop(&a, C); @@ -381,12 +381,12 @@ int main(int argc, char *argv[]) { tt_replace(&a, &d, tt_dict_set(&a, d, LITERAL4("void"), TT_EMPTY)); printf("\nd node: %u/%u\n", tt_ptr_idx(d), tt_ptr_tag(d)); tt_arena_flush(&a); - tt_dump_arena_dot_styled("d", d, &a, 1); + tt_dump_arena_dot_styled("d", d, &a, TT_STYLE_TEXT_LABELS | TT_STYLE_HIDE_DETAILS); tt_drop(&a, d); } tt_arena_flush(&a); - tt_dump_arena_dot_styled("afterAll", TT_NO_PTR, &a, 1); /* expect a_set and b_set here */ + tt_dump_arena_dot_styled("afterAll", TT_NO_PTR, &a, TT_STYLE_TEXT_LABELS); /* expect a_set and b_set here */ tt_arena_done(&a); return EXIT_SUCCESS; diff --git a/treetrie.c b/treetrie.c index 25b1f03..7765d71 100644 --- a/treetrie.c +++ b/treetrie.c @@ -361,7 +361,7 @@ static void dump_dot_edge(tt_arena_t *a, tt_node_ptr_t p, int lr, char const *ed void tt_dump_arena_dot_styled(char const *rootlabel, tt_node_ptr_t rootptr, tt_arena_t *a, - int style) + int flags) { int i; @@ -400,36 +400,32 @@ void tt_dump_arena_dot_styled(char const *rootlabel, printf("label=\"branch"); break; case TT_TAG_LEAF: - switch (style) { - case 1: { - char buf[5]; - int v = (int) a->nodes[n].b; - if (v < -9 || v >= 32) { - int j; - v = htonl(v); - memcpy(buf, &v, 4); - for (j = 0; j < 4; j++) { - if (buf[j] < 32) { buf[j] = ' '; } - } - buf[4] = '\0'; - } else { - switch (v) { - case TT_WILD: buf[0] = '*'; buf[1] = '\0'; break; - case TT_BOS: buf[0] = buf[1] = '<'; buf[2] = '\0'; break; - case TT_EOS: buf[0] = buf[1] = '>'; buf[2] = '\0'; break; - case TT_BOC: buf[0] = buf[1] = '{'; buf[2] = '\0'; break; - case TT_EOC: buf[0] = buf[1] = '}'; buf[2] = '\0'; break; - default: - snprintf(buf, sizeof(buf), "%d", v); - buf[4] = '\0'; - } + if (flags & TT_STYLE_TEXT_LABELS) { + char buf[5]; + int v = (int) a->nodes[n].b; + if (v < -9 || v >= 32) { + int j; + v = htonl(v); + memcpy(buf, &v, 4); + for (j = 0; j < 4; j++) { + if (buf[j] < 32) { buf[j] = ' '; } + } + buf[4] = '\0'; + } else { + switch (v) { + case TT_WILD: buf[0] = '*'; buf[1] = '\0'; break; + case TT_BOS: buf[0] = buf[1] = '<'; buf[2] = '\0'; break; + case TT_EOS: buf[0] = buf[1] = '>'; buf[2] = '\0'; break; + case TT_BOC: buf[0] = buf[1] = '{'; buf[2] = '\0'; break; + case TT_EOC: buf[0] = buf[1] = '}'; buf[2] = '\0'; break; + default: + snprintf(buf, sizeof(buf), "%d", v); + buf[4] = '\0'; } - printf("shape=underline,label=\"leaf '%s'", buf); - break; } - case 0: - default: - printf("shape=underline,label=\"leaf a%d", (int) a->nodes[n].b); + printf("shape=underline,label=\"leaf '%s'", buf); + } else { + printf("shape=underline,label=\"leaf a%d", (int) a->nodes[n].b); } break; case TT_TAG_NODE: @@ -443,7 +439,11 @@ void tt_dump_arena_dot_styled(char const *rootlabel, assert(0); } /* printf(" #%u d%d r%d\"];\n", i, distance, a->headers[n].inuse.refcount); */ - printf(" i%u r%d\"];\n", n, a->headers[n].inuse.refcount); + if (flags & TT_STYLE_HIDE_DETAILS) { + printf("\"];\n"); + } else { + printf(" i%u r%d\"];\n", n, a->headers[n].inuse.refcount); + } switch (tt_ptr_tag(p)) { case TT_TAG_TAIL: dump_dot_edge(a, p, 0, "trie"); diff --git a/treetrie.h b/treetrie.h index e8b064c..e3b804e 100644 --- a/treetrie.h +++ b/treetrie.h @@ -24,6 +24,10 @@ typedef enum tt_special_idx_t { TT_EMPTY_DICT_IDX, /* empty dict */ } tt_special_idx_t; +#define TT_STYLE_UNSTYLED 0x00000000 +#define TT_STYLE_TEXT_LABELS 0x00000001 +#define TT_STYLE_HIDE_DETAILS 0x00000002 + typedef uint32_t tt_node_idx_t; /* N.B. tt_special_idx_t; and 0 is reserved. */ typedef uint32_t tt_node_ptr_t; /* An index shifted left 2 with tag or'd in low bits */ @@ -112,7 +116,7 @@ extern void tt_dump_arena(tt_arena_t *a, int show_free_chain); extern void tt_dump_arena_dot_styled(char const *rootlabel, tt_node_ptr_t rootptr, tt_arena_t *a, - int style); + int flags); extern void tt_dump_arena_dot(char const *rootlabel, tt_node_ptr_t rootptr, tt_arena_t *a); extern void tt_arena_flush(tt_arena_t *a);