Create a usable dot for vector expressions

It leaves a lot to be desired, but it beats "FIXME".
This commit is contained in:
Bill Currie 2019-06-06 06:42:31 +09:00
parent 607ec3124e
commit 319ecfbbfa
1 changed files with 36 additions and 1 deletions

View File

@ -367,7 +367,42 @@ print_vector (dstring_t *dstr, expr_t *e, int level, int id, expr_t *next)
{
int indent = level * 2 + 2;
dasprintf (dstr, "%*se_%p [label=\"vector FIXME\"];\n", indent, "", e);
if (e->e.vector.type == &type_vector) {
expr_t *x = e->e.vector.list;
expr_t *y = x->next;
expr_t *z = y->next;
_print_expr (dstr, x, level, id, next);
_print_expr (dstr, y, level, id, next);
_print_expr (dstr, z, level, id, next);
dasprintf (dstr, "%*se_%p -> \"e_%p\";\n", indent, "", e, x);
dasprintf (dstr, "%*se_%p -> \"e_%p\";\n", indent, "", e, y);
dasprintf (dstr, "%*se_%p -> \"e_%p\";\n", indent, "", e, z);
}
if (e->e.vector.type == &type_quaternion) {
if (e->e.vector.list->next->next) {
expr_t *x = e->e.vector.list;
expr_t *y = x->next;
expr_t *z = y->next;
expr_t *w = z->next;
_print_expr (dstr, x, level, id, next);
_print_expr (dstr, y, level, id, next);
_print_expr (dstr, z, level, id, next);
_print_expr (dstr, w, level, id, next);
dasprintf (dstr, "%*se_%p -> \"e_%p\";\n", indent, "", e, x);
dasprintf (dstr, "%*se_%p -> \"e_%p\";\n", indent, "", e, y);
dasprintf (dstr, "%*se_%p -> \"e_%p\";\n", indent, "", e, z);
dasprintf (dstr, "%*se_%p -> \"e_%p\";\n", indent, "", e, w);
} else {
expr_t *v = e->e.vector.list;
expr_t *s = v->next;
_print_expr (dstr, v, level, id, next);
_print_expr (dstr, s, level, id, next);
dasprintf (dstr, "%*se_%p -> \"e_%p\";\n", indent, "", e, v);
dasprintf (dstr, "%*se_%p -> \"e_%p\";\n", indent, "", e, s);
}
}
dasprintf (dstr, "%*se_%p [label=\"vector %d\"];\n", indent, "", e,
e->line);
}
static void