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}));
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;

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,
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");

View File

@ -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);