From 8f1ead168558dac9cf4c10e269f568e15b5f8faf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Ankarstr=C3=B6m?= Date: Fri, 15 Jul 2022 13:13:50 +0200 Subject: Add support for Prolog exceptions. --- c/pl.cpp | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) (limited to 'c/pl.cpp') diff --git a/c/pl.cpp b/c/pl.cpp index 3172090..1fbc4e7 100644 --- a/c/pl.cpp +++ b/c/pl.cpp @@ -1,9 +1,40 @@ #include +#include "defs.h" -int Pl(const char *szMod, const char *szPred) +Query::Query(module_t ctx, predicate_t p, term_t t0) +{ + m_q = PL_open_query(ctx, PL_Q_CATCH_EXCEPTION, p, t0); +} + +Query::~Query() +{ + PL_cut_query(m_q); +} + +int Query::Cut() +{ + if (PL_cut_query(m_q)) return 1; + if (term_t t = PL_exception(m_q)) throw t; + return 0; +} + +int Query::Close() +{ + if (PL_close_query(m_q)) return 1; + if (term_t t = PL_exception(m_q)) throw t; + return 0; +} + +int Query::NextSolution() +{ + if (PL_next_solution(m_q)) return 1; + if (term_t t = PL_exception(m_q)) throw t; + return 0; +} + +int Plx(const char *szMod, const char *szPred) { term_t t = PL_new_term_refs(0); - if (!PL_call_predicate(NULL, PL_Q_CATCH_EXCEPTION, PL_predicate(szPred, 0, szMod), t)) - return 0; - return 1; + Query q(NULL, PL_predicate(szPred, 0, szMod), t); + return q.NextSolution(); } -- cgit v1.2.3