summaryrefslogtreecommitdiff
path: root/src/runtime/c/pgf/expr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/c/pgf/expr.c')
-rw-r--r--src/runtime/c/pgf/expr.c75
1 files changed, 74 insertions, 1 deletions
diff --git a/src/runtime/c/pgf/expr.c b/src/runtime/c/pgf/expr.c
index 494708e8c..13093d14f 100644
--- a/src/runtime/c/pgf/expr.c
+++ b/src/runtime/c/pgf/expr.c
@@ -368,6 +368,79 @@ pgf_read_expr(GuReader* rdr, GuPool* pool, GuExn* err)
return expr;
}
+bool
+pgf_literal_eq(PgfLiteral lit1, PgfLiteral lit2)
+{
+ GuVariantInfo ei1 = gu_variant_open(lit1);
+ GuVariantInfo ei2 = gu_variant_open(lit2);
+
+ if (ei1.tag != ei2.tag)
+ return false;
+
+ switch (ei1.tag) {
+ case PGF_LITERAL_STR: {
+ PgfLiteralStr* lit1 = ei1.data;
+ PgfLiteralStr* lit2 = ei2.data;
+ return gu_string_eq(lit1->val, lit2->val);
+ }
+ case PGF_LITERAL_INT: {
+ PgfLiteralInt* lit1 = ei1.data;
+ PgfLiteralInt* lit2 = ei2.data;
+ return (lit1->val == lit2->val);
+ }
+ case PGF_LITERAL_FLT: {
+ PgfLiteralFlt* lit1 = ei1.data;
+ PgfLiteralFlt* lit2 = ei2.data;
+ return (lit1->val == lit2->val);
+ }
+ default:
+ gu_impossible();
+ }
+
+ return false;
+}
+
+bool
+pgf_expr_eq(PgfExpr e1, PgfExpr e2)
+{
+ GuVariantInfo ei1 = gu_variant_open(e1);
+ GuVariantInfo ei2 = gu_variant_open(e2);
+
+ if (ei1.tag != ei2.tag)
+ return false;
+
+ switch (ei1.tag) {
+ case PGF_EXPR_FUN: {
+ PgfExprFun* fun1 = ei1.data;
+ PgfExprFun* fun2 = ei2.data;
+ return gu_string_eq(fun1->fun, fun2->fun);
+ }
+ case PGF_EXPR_APP: {
+ PgfExprApp* app1 = ei1.data;
+ PgfExprApp* app2 = ei2.data;
+ return (pgf_expr_eq(app1->fun,app2->fun) &&
+ pgf_expr_eq(app1->arg,app2->arg));
+ }
+ case PGF_EXPR_LIT: {
+ PgfExprLit* lit1 = ei1.data;
+ PgfExprLit* lit2 = ei2.data;
+ return (pgf_literal_eq(lit1->lit,lit2->lit));
+ }
+ case PGF_EXPR_META:
+ return true;
+ case PGF_EXPR_ABS:
+ case PGF_EXPR_VAR:
+ case PGF_EXPR_TYPED:
+ case PGF_EXPR_IMPL_ARG:
+ gu_impossible();
+ break;
+ default:
+ gu_impossible();
+ }
+
+ return false;
+}
+
void
pgf_print_literal(PgfLiteral lit,
GuWriter* wtr, GuExn* err)
@@ -420,7 +493,6 @@ pgf_print_expr(PgfExpr expr, int prec,
}
break;
}
- case PGF_EXPR_ABS:
case PGF_EXPR_LIT: {
PgfExprLit* lit = ei.data;
pgf_print_literal(lit->lit, wtr, err);
@@ -429,6 +501,7 @@ pgf_print_expr(PgfExpr expr, int prec,
case PGF_EXPR_META:
gu_putc('?', wtr, err);
break;
+ case PGF_EXPR_ABS:
case PGF_EXPR_VAR:
case PGF_EXPR_TYPED:
case PGF_EXPR_IMPL_ARG: