|
@@ -1013,73 +1013,73 @@ int expr_compare_type(enum expr_type t1, enum expr_type t2)
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
-void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken)
|
|
|
|
|
|
+void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken)
|
|
{
|
|
{
|
|
if (!e) {
|
|
if (!e) {
|
|
- fn(data, "y");
|
|
|
|
|
|
+ fn(data, NULL, "y");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
if (expr_compare_type(prevtoken, e->type) > 0)
|
|
if (expr_compare_type(prevtoken, e->type) > 0)
|
|
- fn(data, "(");
|
|
|
|
|
|
+ fn(data, NULL, "(");
|
|
switch (e->type) {
|
|
switch (e->type) {
|
|
case E_SYMBOL:
|
|
case E_SYMBOL:
|
|
if (e->left.sym->name)
|
|
if (e->left.sym->name)
|
|
- fn(data, e->left.sym->name);
|
|
|
|
|
|
+ fn(data, e->left.sym, e->left.sym->name);
|
|
else
|
|
else
|
|
- fn(data, "<choice>");
|
|
|
|
|
|
+ fn(data, NULL, "<choice>");
|
|
break;
|
|
break;
|
|
case E_NOT:
|
|
case E_NOT:
|
|
- fn(data, "!");
|
|
|
|
|
|
+ fn(data, NULL, "!");
|
|
expr_print(e->left.expr, fn, data, E_NOT);
|
|
expr_print(e->left.expr, fn, data, E_NOT);
|
|
break;
|
|
break;
|
|
case E_EQUAL:
|
|
case E_EQUAL:
|
|
- fn(data, e->left.sym->name);
|
|
|
|
- fn(data, "=");
|
|
|
|
- fn(data, e->right.sym->name);
|
|
|
|
|
|
+ fn(data, e->left.sym, e->left.sym->name);
|
|
|
|
+ fn(data, NULL, "=");
|
|
|
|
+ fn(data, e->right.sym, e->right.sym->name);
|
|
break;
|
|
break;
|
|
case E_UNEQUAL:
|
|
case E_UNEQUAL:
|
|
- fn(data, e->left.sym->name);
|
|
|
|
- fn(data, "!=");
|
|
|
|
- fn(data, e->right.sym->name);
|
|
|
|
|
|
+ fn(data, e->left.sym, e->left.sym->name);
|
|
|
|
+ fn(data, NULL, "!=");
|
|
|
|
+ fn(data, e->right.sym, e->right.sym->name);
|
|
break;
|
|
break;
|
|
case E_OR:
|
|
case E_OR:
|
|
expr_print(e->left.expr, fn, data, E_OR);
|
|
expr_print(e->left.expr, fn, data, E_OR);
|
|
- fn(data, " || ");
|
|
|
|
|
|
+ fn(data, NULL, " || ");
|
|
expr_print(e->right.expr, fn, data, E_OR);
|
|
expr_print(e->right.expr, fn, data, E_OR);
|
|
break;
|
|
break;
|
|
case E_AND:
|
|
case E_AND:
|
|
expr_print(e->left.expr, fn, data, E_AND);
|
|
expr_print(e->left.expr, fn, data, E_AND);
|
|
- fn(data, " && ");
|
|
|
|
|
|
+ fn(data, NULL, " && ");
|
|
expr_print(e->right.expr, fn, data, E_AND);
|
|
expr_print(e->right.expr, fn, data, E_AND);
|
|
break;
|
|
break;
|
|
case E_CHOICE:
|
|
case E_CHOICE:
|
|
- fn(data, e->right.sym->name);
|
|
|
|
|
|
+ fn(data, e->right.sym, e->right.sym->name);
|
|
if (e->left.expr) {
|
|
if (e->left.expr) {
|
|
- fn(data, " ^ ");
|
|
|
|
|
|
+ fn(data, NULL, " ^ ");
|
|
expr_print(e->left.expr, fn, data, E_CHOICE);
|
|
expr_print(e->left.expr, fn, data, E_CHOICE);
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
case E_RANGE:
|
|
case E_RANGE:
|
|
- fn(data, "[");
|
|
|
|
- fn(data, e->left.sym->name);
|
|
|
|
- fn(data, " ");
|
|
|
|
- fn(data, e->right.sym->name);
|
|
|
|
- fn(data, "]");
|
|
|
|
|
|
+ fn(data, NULL, "[");
|
|
|
|
+ fn(data, e->left.sym, e->left.sym->name);
|
|
|
|
+ fn(data, NULL, " ");
|
|
|
|
+ fn(data, e->right.sym, e->right.sym->name);
|
|
|
|
+ fn(data, NULL, "]");
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
{
|
|
{
|
|
char buf[32];
|
|
char buf[32];
|
|
sprintf(buf, "<unknown type %d>", e->type);
|
|
sprintf(buf, "<unknown type %d>", e->type);
|
|
- fn(data, buf);
|
|
|
|
|
|
+ fn(data, NULL, buf);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (expr_compare_type(prevtoken, e->type) > 0)
|
|
if (expr_compare_type(prevtoken, e->type) > 0)
|
|
- fn(data, ")");
|
|
|
|
|
|
+ fn(data, NULL, ")");
|
|
}
|
|
}
|
|
|
|
|
|
-static void expr_print_file_helper(void *data, const char *str)
|
|
|
|
|
|
+static void expr_print_file_helper(void *data, struct symbol *sym, const char *str)
|
|
{
|
|
{
|
|
fwrite(str, strlen(str), 1, data);
|
|
fwrite(str, strlen(str), 1, data);
|
|
}
|
|
}
|
|
@@ -1089,7 +1089,7 @@ void expr_fprint(struct expr *e, FILE *out)
|
|
expr_print(e, expr_print_file_helper, out, E_NONE);
|
|
expr_print(e, expr_print_file_helper, out, E_NONE);
|
|
}
|
|
}
|
|
|
|
|
|
-static void expr_print_gstr_helper(void *data, const char *str)
|
|
|
|
|
|
+static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str)
|
|
{
|
|
{
|
|
str_append((struct gstr*)data, str);
|
|
str_append((struct gstr*)data, str);
|
|
}
|
|
}
|