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.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/runtime/c/pgf/expr.c b/src/runtime/c/pgf/expr.c
index 751a7d25a..1a334a7ee 100644
--- a/src/runtime/c/pgf/expr.c
+++ b/src/runtime/c/pgf/expr.c
@@ -1210,6 +1210,55 @@ pgf_expr_size(PgfExpr expr)
}
}
+static void
+pgf_expr_functions_helper(PgfExpr expr, GuBuf* functions)
+{
+ GuVariantInfo ei = gu_variant_open(expr);
+ switch (ei.tag) {
+ case PGF_EXPR_ABS: {
+ PgfExprAbs* abs = ei.data;
+ pgf_expr_functions_helper(abs->body, functions);
+ break;
+ }
+ case PGF_EXPR_APP: {
+ PgfExprApp* app = ei.data;
+ pgf_expr_functions_helper(app->fun, functions);
+ pgf_expr_functions_helper(app->arg, functions);
+ break;
+ }
+ case PGF_EXPR_LIT:
+ case PGF_EXPR_META:
+ case PGF_EXPR_VAR: {
+ break;
+ }
+ case PGF_EXPR_FUN:{
+ PgfExprFun* fun = ei.data;
+ gu_buf_push(functions, GuString, fun->fun);
+ break;
+ }
+ case PGF_EXPR_TYPED: {
+ PgfExprTyped* typed = ei.data;
+ pgf_expr_functions_helper(typed->expr, functions);
+ break;
+ }
+ case PGF_EXPR_IMPL_ARG: {
+ PgfExprImplArg* impl = ei.data;
+ pgf_expr_functions_helper(impl->expr, functions);
+ break;
+ }
+ default:
+ gu_impossible();
+ }
+}
+
+PGF_API GuSeq*
+pgf_expr_functions(PgfExpr expr, GuPool* pool)
+{
+ GuBuf* functions = gu_new_buf(GuString, pool);
+ pgf_expr_functions_helper(expr, functions);
+ return gu_buf_data_seq(functions);
+}
+
PGF_API void
pgf_print_cid(PgfCId id,
GuOut* out, GuExn* err)