From 0d38d67dfa70cd1cbb505fc2f3001b73d2a1af70 Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa Date: Mon, 25 Jan 2010 12:29:51 +0000 Subject: [PATCH] add missing interface functions. --- include/SWI-Prolog.h | 5 +++-- library/yap2swi/yap2swi.c | 43 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/include/SWI-Prolog.h b/include/SWI-Prolog.h index 9e5a5f61a..71a59d012 100755 --- a/include/SWI-Prolog.h +++ b/include/SWI-Prolog.h @@ -368,6 +368,7 @@ extern X_API int PL_compare(term_t, term_t); /* begin PL_unify_* functions =============================*/ extern X_API int PL_unify(term_t, term_t); extern X_API int PL_unify_atom(term_t, atom_t); +extern X_API int PL_unify_arg(int, term_t, atom_t); extern X_API int PL_unify_atom_chars(term_t, const char *); extern X_API int PL_unify_atom_nchars(term_t, size_t len, const char *); extern X_API int PL_unify_float(term_t, double); @@ -391,6 +392,7 @@ extern X_API int PL_is_atomic(term_t); extern X_API int PL_is_compound(term_t); extern X_API int PL_is_float(term_t); extern X_API int PL_is_functor(term_t, functor_t); +extern X_API int PL_is_ground(term_t); extern X_API int PL_is_integer(term_t); extern X_API int PL_is_list(term_t); extern X_API int PL_is_number(term_t); @@ -420,6 +422,7 @@ extern X_API int PL_toplevel(void); extern X_API term_t PL_exception(qid_t); extern X_API int PL_call_predicate(module_t, int, predicate_t, term_t); extern X_API int PL_call(term_t, module_t); +extern X_API void PL_register_foreign(const char *, int, foreign_t (*)(void), int); extern X_API void PL_register_foreign_in_module(const char *, const char *, int, foreign_t (*)(void), int); extern X_API void PL_register_extensions(const PL_extension *); extern X_API void PL_load_extensions(const PL_extension *); @@ -441,8 +444,6 @@ extern X_API void *PL_realloc(void*,int); extern X_API void PL_free(void *); extern X_API int PL_eval_expression_to_int64_ex(term_t t, int64_t *val); -#define PL_register_foreign(name, arity, function, flags) PL_register_foreign_in_module(NULL, (name), (arity), (function), (flags)) - extern X_API int Sprintf(const char * fm,...); extern X_API int Sdprintf(const char *,...); diff --git a/library/yap2swi/yap2swi.c b/library/yap2swi/yap2swi.c index 260ed9308..89d6b5b06 100644 --- a/library/yap2swi/yap2swi.c +++ b/library/yap2swi/yap2swi.c @@ -1327,9 +1327,36 @@ X_API int PL_unify_list(term_t tt, term_t h, term_t tail) } else if (!IsPairTerm(t)) { return FALSE; } - Yap_PutInSlot(h,HeadOfTerm(t)); - Yap_PutInSlot(tail,TailOfTerm(t)); - return TRUE; + return + Yap_unify(Yap_GetFromSlot(h),HeadOfTerm(t)) && + Yap_unify(Yap_GetFromSlot(tail),TailOfTerm(t)); +} + +/* SWI: int PL_unify_list(term_t ?t, term_t +h, term_t -t) + YAP long int unify(YAP_Term* a, Term* b) */ +X_API int PL_unify_arg(int index, term_t tt, term_t arg) +{ + Term t = Deref(Yap_GetFromSlot(tt)), to; + if (index < 0) + return FALSE; + if (IsVarTerm(t) || IsAtomOrIntTerm(t)) { + return FALSE; + } else if (IsPairTerm(t)) { + if (index == 1) + to = HeadOfTerm(t); + else if (index == 2) + to = TailOfTerm(t); + else + return FALSE; + } else { + Functor f = FunctorOfTerm(t); + if (IsExtensionFunctor(f)) + return FALSE; + if (index > ArityOfFunctor(f)) + return FALSE; + to = ArgOfTerm(index, t); + } + return Yap_unify(Yap_GetFromSlot(t),to); } /* SWI: int PL_unify_list(term_t ?t, term_t +h, term_t -t) @@ -1706,6 +1733,11 @@ X_API int PL_is_atom(term_t t) return IsAtomTerm(Yap_GetFromSlot(t)); } +X_API int PL_is_ground(term_t t) +{ + return Yap_IsGroundTerm(Yap_GetFromSlot(t)); +} + X_API int PL_is_atomic(term_t ts) { YAP_Term t = Yap_GetFromSlot(ts); @@ -2110,6 +2142,11 @@ X_API void PL_register_extensions(const PL_extension *ptr) PL_load_extensions(ptr); } +X_API void PL_register_foreign(const char *name, int arity, foreign_t (*function)(void), int flags) +{ + PL_register_foreign_in_module(NULL, name, arity, function, flags); +} + X_API void PL_load_extensions(const PL_extension *ptr) { /* ignore flags for now */