aboutsummaryrefslogtreecommitdiff
path: root/c/pl.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/pl.c')
-rw-r--r--c/pl.c84
1 files changed, 63 insertions, 21 deletions
diff --git a/c/pl.c b/c/pl.c
index 9a5baee..acb6ba3 100644
--- a/c/pl.c
+++ b/c/pl.c
@@ -1,26 +1,61 @@
#include <stdarg.h>
#include <string.h>
#include <SWI-Prolog.h>
+#include "defs.h"
+static int Plpv(term_t, char *, va_list);
+static int Plgv(term_t, char *, va_list);
+
+/* Call Prolog predicate once. */
int
Pl(char *szMod, char *szPred, char *szFmt, ...)
{
- int i, iArity;
+ int iArity;
term_t t;
va_list vl, vl2;
- va_start(vl, szFmt);
- va_copy(vl2, vl);
iArity = strlen(szFmt);
t = PL_new_term_refs(iArity);
+ va_start(vl, szFmt);
+ va_copy(vl2, vl);
+
+ if (!Plpv(t, szFmt, vl)) goto f;
+ if (!PL_call_predicate(NULL, PL_Q_NORMAL,
+ PL_predicate(szPred, iArity, szMod), t))
+ goto f;
+ if (!Plgv(t, szFmt, vl2)) goto f;
+
+ va_end(vl);
+ va_end(vl2);
+ return 1;
+f: va_end(vl);
+ va_end(vl2);
+ return 0;
+}
+
+/* Put known values in term. */
+int
+Plp(term_t t, char *szFmt, ...)
+{
+ int r;
+ va_list vl;
+ va_start(vl, szFmt);
+ r = Plpv(t, szFmt, vl);
+ va_end(vl);
+ return r;
+}
+int
+Plpv(term_t t, char *szFmt, va_list vl)
+{
+ int i;
for (i = 0; szFmt[i]; i++) {
switch (szFmt[i]) {
case 'I':
{
int x;
x = va_arg(vl, int);
- if (!PL_put_integer(t+i, x)) goto f;
+ if (!PL_put_integer(t+i, x)) return 0;
break;
}
case 'S':
@@ -29,7 +64,7 @@ Pl(char *szMod, char *szPred, char *szFmt, ...)
char *x;
x = va_arg(vl, char *);
a = PL_new_atom(x);
- if (!PL_put_atom(t+i, a)) goto f;
+ if (!PL_put_atom(t+i, a)) return 0;
break;
}
case 'i':
@@ -40,40 +75,47 @@ Pl(char *szMod, char *szPred, char *szFmt, ...)
break;
}
}
+ return 1;
+}
- if (!PL_call_predicate(NULL, PL_Q_NORMAL,
- PL_predicate(szPred, iArity, szMod), t))
- goto f;
-
+/* Get unknown values from term. */
+int
+Plg(term_t t, char *szFmt, ...)
+{
+ int r;
+ va_list vl;
+ va_start(vl, szFmt);
+ r = Plgv(t, szFmt, vl);
+ va_end(vl);
+ return r;
+}
+int
+Plgv(term_t t, char *szFmt, va_list vl)
+{
+ int i;
for (i = 0; szFmt[i]; i++) {
switch (szFmt[i]) {
case 'i':
{
int *lp;
- lp = va_arg(vl2, int *);
- if (!PL_get_integer(t+i, lp)) goto f;
+ lp = va_arg(vl, int *);
+ if (!PL_get_integer(t+i, lp)) return 0;
break;
}
case 's':
{
char **lp;
- lp = va_arg(vl2, char **);
- if (!PL_get_atom_chars(t+i, lp)) goto f;
+ lp = va_arg(vl, char **);
+ if (!PL_get_atom_chars(t+i, lp)) return 0;
break;
}
case 'I':
- va_arg(vl2, int);
+ va_arg(vl, int);
break;
case 'S':
- va_arg(vl2, char *);
+ va_arg(vl, char *);
break;
}
}
-
- va_end(vl);
- va_end(vl2);
return 1;
-f: va_end(vl);
- va_end(vl2);
- return 0;
}