From 30b7ba04c701ef156992eb53a7b65accebfa9f21 Mon Sep 17 00:00:00 2001 From: Krasimir Angelov Date: Tue, 5 Sep 2017 10:07:43 +0200 Subject: added exprFunctions in the Haskell binding --- src/runtime/c/pgf/expr.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ src/runtime/c/pgf/expr.h | 3 +++ 2 files changed, 52 insertions(+) (limited to 'src/runtime/c/pgf') 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) diff --git a/src/runtime/c/pgf/expr.h b/src/runtime/c/pgf/expr.h index 962b3173f..3dbaf83b6 100644 --- a/src/runtime/c/pgf/expr.h +++ b/src/runtime/c/pgf/expr.h @@ -200,6 +200,9 @@ pgf_expr_hash(GuHash h, PgfExpr e); PGF_API size_t pgf_expr_size(PgfExpr expr); +PGF_API GuSeq* +pgf_expr_functions(PgfExpr expr, GuPool* pool); + typedef struct PgfPrintContext PgfPrintContext; struct PgfPrintContext { -- cgit v1.2.3