Even more pretty

This commit is contained in:
Tony Garnock-Jones 2015-07-13 20:04:42 -04:00
parent 0e88711a50
commit e776864b45
3 changed files with 79 additions and 75 deletions

88
main.c
View File

@ -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})); 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)); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A));
tt_arena_flush(&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})); 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)); 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_node_ptr_t C = tt_trie_union_map(&a, A, B);
tt_arena_flush(&a); 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, A);
tt_drop(&a, B); tt_drop(&a, B);
printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C));
tt_arena_flush(&a); 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'); putchar('\n');
tt_dump_routingtable(&a, C, 0); tt_dump_routingtable(&a, C, 0);
tt_drop(&a, C); tt_drop(&a, C);
} }
tt_arena_flush(&a); 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"); printf("\n============================================================ 2\n");
{ {
tt_node_ptr_t A = tt_grab(&a, MAKE_PATH(&a, a_set, {TT_BOS, 'A', TT_EOS})); 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)); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A));
tt_arena_flush(&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})); 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)); 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_node_ptr_t C = tt_trie_union_map(&a, A, B);
tt_arena_flush(&a); 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, A);
tt_drop(&a, B); tt_drop(&a, B);
printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C));
tt_arena_flush(&a); 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'); putchar('\n');
tt_dump_routingtable(&a, C, 0); tt_dump_routingtable(&a, C, 0);
tt_drop(&a, C); 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})); 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)); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A));
tt_arena_flush(&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})); 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)); 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_node_ptr_t C = tt_trie_union_map(&a, A, B);
tt_arena_flush(&a); 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, A);
tt_drop(&a, B); tt_drop(&a, B);
printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C));
tt_arena_flush(&a); 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'); putchar('\n');
tt_dump_routingtable(&a, C, 0); tt_dump_routingtable(&a, C, 0);
tt_drop(&a, C); 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})); 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)); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A));
tt_arena_flush(&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})); 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)); 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_node_ptr_t C = tt_trie_union_map(&a, A, B);
tt_arena_flush(&a); 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, A);
tt_drop(&a, B); tt_drop(&a, B);
printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C));
tt_arena_flush(&a); 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'); putchar('\n');
tt_dump_routingtable(&a, C, 0); tt_dump_routingtable(&a, C, 0);
tt_drop(&a, C); 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})); 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)); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A));
tt_arena_flush(&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})); 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)); 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_node_ptr_t C = tt_trie_union_map(&a, A, B);
tt_arena_flush(&a); 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, A);
tt_drop(&a, B); tt_drop(&a, B);
printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C));
tt_arena_flush(&a); 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'); putchar('\n');
tt_dump_routingtable(&a, C, 0); tt_dump_routingtable(&a, C, 0);
tt_drop(&a, C); 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})); 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)); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A));
tt_arena_flush(&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})); 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)); 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_node_ptr_t C = tt_trie_union_map(&a, A, B);
tt_arena_flush(&a); 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, A);
tt_drop(&a, B); tt_drop(&a, B);
printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C));
tt_arena_flush(&a); 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'); putchar('\n');
tt_dump_routingtable(&a, C, 0); tt_dump_routingtable(&a, C, 0);
tt_drop(&a, C); 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})); 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)); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A));
tt_arena_flush(&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})); 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)); 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_node_ptr_t C = tt_trie_union_map(&a, A, B);
tt_arena_flush(&a); 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, A);
tt_drop(&a, B); tt_drop(&a, B);
printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C));
tt_arena_flush(&a); 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'); putchar('\n');
tt_dump_routingtable(&a, C, 0); tt_dump_routingtable(&a, C, 0);
tt_node_ptr_t D = tt_trie_union_map(&a, C, C); tt_node_ptr_t D = tt_trie_union_map(&a, C, C);
tt_drop(&a, C); tt_drop(&a, C);
tt_arena_flush(&a); 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_dump_routingtable(&a, D, 0);
tt_node_ptr_t E = tt_grab(&a, MAKE_PATH(&a, b_set, {TT_WILD})); tt_node_ptr_t E = tt_grab(&a, MAKE_PATH(&a, b_set, {TT_WILD}));
tt_arena_flush(&a); 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_node_ptr_t F = tt_trie_union_map(&a, D, E);
tt_drop(&a, D); tt_drop(&a, D);
tt_drop(&a, E); tt_drop(&a, E);
tt_arena_flush(&a); 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_dump_routingtable(&a, F, 0);
tt_node_ptr_t G = tt_grab(&a, tt_trie_relabel_const(&a, F, a_set)); tt_node_ptr_t G = tt_grab(&a, tt_trie_relabel_const(&a, F, a_set));
tt_drop(&a, F); tt_drop(&a, F);
tt_arena_flush(&a); 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_dump_routingtable(&a, G, 0);
tt_drop(&a, G); 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})); 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)); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A));
tt_arena_flush(&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_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})); 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)); 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_dump_routingtable(&a, B, 0);
tt_node_ptr_t C = tt_trie_subtract_set(&a, A, B); tt_node_ptr_t C = tt_trie_subtract_set(&a, A, B);
tt_arena_flush(&a); 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, A);
tt_drop(&a, B); tt_drop(&a, B);
printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C));
tt_arena_flush(&a); 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'); putchar('\n');
tt_dump_routingtable(&a, C, 0); tt_dump_routingtable(&a, C, 0);
tt_drop(&a, C); 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})); 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)); printf("\nA node: %u/%u\n", tt_ptr_idx(A), tt_ptr_tag(A));
tt_arena_flush(&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_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})); 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)); 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_dump_routingtable(&a, B, 0);
tt_node_ptr_t C = tt_trie_subtract_set(&a, A, B); tt_node_ptr_t C = tt_trie_subtract_set(&a, A, B);
tt_arena_flush(&a); 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, A);
tt_drop(&a, B); tt_drop(&a, B);
printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C)); printf("\nC node: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C));
tt_arena_flush(&a); 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)); 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)); printf("\nC node post relabel: %u/%u\n", tt_ptr_idx(C), tt_ptr_tag(C));
tt_arena_flush(&a); 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'); putchar('\n');
tt_dump_routingtable(&a, C, 0); tt_dump_routingtable(&a, C, 0);
tt_drop(&a, C); 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)); 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)); printf("\nd node: %u/%u\n", tt_ptr_idx(d), tt_ptr_tag(d));
tt_arena_flush(&a); 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_drop(&a, d);
} }
tt_arena_flush(&a); 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); tt_arena_done(&a);
return EXIT_SUCCESS; return EXIT_SUCCESS;

View File

@ -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, void tt_dump_arena_dot_styled(char const *rootlabel,
tt_node_ptr_t rootptr, tt_node_ptr_t rootptr,
tt_arena_t *a, tt_arena_t *a,
int style) int flags)
{ {
int i; int i;
@ -400,36 +400,32 @@ void tt_dump_arena_dot_styled(char const *rootlabel,
printf("label=\"branch"); printf("label=\"branch");
break; break;
case TT_TAG_LEAF: case TT_TAG_LEAF:
switch (style) { if (flags & TT_STYLE_TEXT_LABELS) {
case 1: { char buf[5];
char buf[5]; int v = (int) a->nodes[n].b;
int v = (int) a->nodes[n].b; if (v < -9 || v >= 32) {
if (v < -9 || v >= 32) { int j;
int j; v = htonl(v);
v = htonl(v); memcpy(buf, &v, 4);
memcpy(buf, &v, 4); for (j = 0; j < 4; j++) {
for (j = 0; j < 4; j++) { if (buf[j] < 32) { buf[j] = ' '; }
if (buf[j] < 32) { buf[j] = ' '; } }
} buf[4] = '\0';
buf[4] = '\0'; } else {
} else { switch (v) {
switch (v) { case TT_WILD: buf[0] = '*'; buf[1] = '\0'; break;
case TT_WILD: buf[0] = '*'; buf[1] = '\0'; break; case TT_BOS: buf[0] = buf[1] = '<'; buf[2] = '\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_EOS: buf[0] = buf[1] = '>'; buf[2] = '\0'; break; case TT_BOC: 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;
case TT_EOC: buf[0] = buf[1] = '}'; buf[2] = '\0'; break; default:
default: snprintf(buf, sizeof(buf), "%d", v);
snprintf(buf, sizeof(buf), "%d", v); buf[4] = '\0';
buf[4] = '\0';
}
} }
printf("shape=underline,label=\"leaf '%s'", buf);
break;
} }
case 0: printf("shape=underline,label=\"leaf '%s'", buf);
default: } else {
printf("shape=underline,label=\"leaf a%d", (int) a->nodes[n].b); printf("shape=underline,label=\"leaf a%d", (int) a->nodes[n].b);
} }
break; break;
case TT_TAG_NODE: case TT_TAG_NODE:
@ -443,7 +439,11 @@ void tt_dump_arena_dot_styled(char const *rootlabel,
assert(0); assert(0);
} }
/* printf(" #%u d%d r%d\"];\n", i, distance, a->headers[n].inuse.refcount); */ /* 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)) { switch (tt_ptr_tag(p)) {
case TT_TAG_TAIL: case TT_TAG_TAIL:
dump_dot_edge(a, p, 0, "trie"); dump_dot_edge(a, p, 0, "trie");

View File

@ -24,6 +24,10 @@ typedef enum tt_special_idx_t {
TT_EMPTY_DICT_IDX, /* empty dict */ TT_EMPTY_DICT_IDX, /* empty dict */
} tt_special_idx_t; } 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_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 */ 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, extern void tt_dump_arena_dot_styled(char const *rootlabel,
tt_node_ptr_t rootptr, tt_node_ptr_t rootptr,
tt_arena_t *a, 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_dump_arena_dot(char const *rootlabel, tt_node_ptr_t rootptr, tt_arena_t *a);
extern void tt_arena_flush(tt_arena_t *a); extern void tt_arena_flush(tt_arena_t *a);