From 80a96b3a851c9af7635e31a95dc0d6edaa386051 Mon Sep 17 00:00:00 2001 From: krasimir Date: Tue, 10 May 2016 17:11:39 +0000 Subject: an API for oracles in the GF parser --- src/runtime/haskell-bind/utils.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src/runtime/haskell-bind/utils.c') diff --git a/src/runtime/haskell-bind/utils.c b/src/runtime/haskell-bind/utils.c index a00527df5..0dd9ae03b 100644 --- a/src/runtime/haskell-bind/utils.c +++ b/src/runtime/haskell-bind/utils.c @@ -67,3 +67,33 @@ hspgf_callbacks_map_add_literal(PgfConcr* concr, PgfCallbacksMap* callbacks, gu_pool_finally(pool, &callback->fin); pgf_callbacks_map_add_literal(concr, callbacks, cat, &callback->callback); } + +typedef struct { + PgfOracleCallback oracle; + GuFinalizer fin; +} HSPgfOracleCallback; + +static void +hspgf_oracle_callback_fin(GuFinalizer* self) +{ + HSPgfOracleCallback* oracle = gu_container(self, HSPgfOracleCallback, fin); + + if (oracle->oracle.predict != NULL) + hs_free_fun_ptr((HsFunPtr) oracle->oracle.predict); + if (oracle->oracle.complete != NULL) + hs_free_fun_ptr((HsFunPtr) oracle->oracle.complete); + if (oracle->oracle.literal != NULL) + hs_free_fun_ptr((HsFunPtr) oracle->oracle.literal); +} + +PgfOracleCallback* +hspgf_new_oracle_callback(HsFunPtr predict, HsFunPtr complete, HsFunPtr literal, GuPool* pool) +{ + HSPgfOracleCallback* oracle = gu_new(HSPgfOracleCallback, pool); + oracle->oracle.predict = (void*) predict; + oracle->oracle.complete = (void*) complete; + oracle->oracle.literal = (void*) literal; + oracle->fin.fn = hspgf_oracle_callback_fin; + gu_pool_finally(pool, &oracle->fin); + return &oracle->oracle; +} -- cgit v1.2.3