aboutsummaryrefslogtreecommitdiff
path: root/c/pl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'c/pl.cpp')
-rw-r--r--c/pl.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/c/pl.cpp b/c/pl.cpp
index fb3d4af..ef8aaf9 100644
--- a/c/pl.cpp
+++ b/c/pl.cpp
@@ -3,6 +3,8 @@
#include "pl.h"
+/* Frame: Wrapper for opening and closing Prolog foreign frames. */
+
Frame::Frame()
{
m_f = PL_open_foreign_frame();
@@ -18,6 +20,7 @@ void Frame::Close()
PL_close_foreign_frame(m_f);
}
+/* Close foreign frame and invalidate associated data. */
void Frame::Discard()
{
PL_discard_foreign_frame(m_f);
@@ -28,6 +31,8 @@ void Frame::Rewind()
PL_rewind_foreign_frame(m_f);
}
+/* Mark: Wrapper for marking and releasing strings on the Prolog stack. */
+
Mark::Mark()
{
PL_mark_string_buffers(&m_m);
@@ -38,6 +43,8 @@ Mark::~Mark()
PL_release_string_buffers_from_mark(m_m);
}
+/* Query: Wrapper for opening, solving and cutting Prolog query. */
+
Query::Query(const module_t ctx, const predicate_t p, const term_t t0)
{
m_q = PL_open_query(ctx, PL_Q_CATCH_EXCEPTION, p, t0);
@@ -55,6 +62,7 @@ int Query::Cut()
return 0;
}
+/* Cut query and invalidate associated data. */
int Query::Close()
{
if (PL_close_query(m_q)) return 1;
@@ -69,6 +77,7 @@ int Query::NextSolution()
return 0;
}
+/* Convert Prolog term to normal or wide characters. */
int PL_get_tchars(const term_t t, TCHAR** const pTsz, const int iFlags)
{
#ifdef UNICODE
@@ -83,6 +92,7 @@ int PL_get_tchars(const term_t t, TCHAR** const pTsz, const int iFlags)
#endif
}
+/* Call nullary Prolog predicate, propagating Prolog exceptions. */
int Plx(const char* const szMod, const char* const szPred)
{
Frame f;
@@ -90,3 +100,13 @@ int Plx(const char* const szMod, const char* const szPred)
Query q(NULL, PL_predicate(szPred, 0, szMod), t);
return q.NextSolution();
}
+
+/* Call nullary Prolog predicate, ignoring Prolog exceptions. */
+int Pl(const char* const szMod, const char* const szPred)
+{
+ try {
+ return Plx(szMod, szPred);
+ } catch (term_t& t) {
+ return 0;
+ }
+}