more fixes to SWI emulation

integrate in main binary
This commit is contained in:
Vitor Santos Costa
2011-02-10 21:14:38 +00:00
parent 841f6eb1e5
commit 3fe9b923cb
12 changed files with 462 additions and 64 deletions

View File

@@ -95,7 +95,8 @@ PL_blob_data(atom_t a, size_t *len, struct PL_blob_t **type)
PL_EXPORT(void)
PL_register_blob_type(PL_blob_t *type)
{
fprintf(stderr,"PL_register_blob_type not implemented yet\n");
type->next = SWI_Blobs;
SWI_Blobs = type;
}
PL_EXPORT(PL_blob_t*)

View File

@@ -47,6 +47,14 @@
#include "swi.h"
extern X_API Atom YAP_AtomFromSWIAtom(atom_t at);
X_API extern Atom
YAP_AtomFromSWIAtom(atom_t at)
{
return SWIAtomToAtom(at);
}
extern X_API Int YAP_PLArityOfSWIFunctor(functor_t at);
/* This is silly, but let's keep it like that for now */
@@ -2295,44 +2303,33 @@ X_API predicate_t PL_predicate(const char *name, int arity, const char *m)
return YAP_Predicate((YAP_Atom)at, arity, mod);
}
X_API int PL_unify_predicate(term_t head, predicate_t *pred, const char *m)
X_API int PL_unify_predicate(term_t head, predicate_t pred, int how)
{
Term mod;
Atom at;
Term t;
Int arity;
Functor fun;
if (m == NULL) {
mod = CurrentModule;
if (!mod) mod = USER_MODULE;
PredEntry *pe = (PredEntry *)pred;
Term ts[2], nt;
if (!pe->ModuleOfPred) {
ts[0] = pe->ModuleOfPred;
} else {
Atom at;
while (!(at = Yap_LookupAtom((char *)m))) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return 0;
}
}
mod = MkAtomTerm(at);
ts[0] = TermProlog;
}
t = Yap_GetFromSlot(head);
if (IsAtomTerm(t)) {
at = AtomOfTerm(t);
arity = 0;
} else if (IsApplTerm(t)) {
Functor f;
f = FunctorOfTerm(t);
if (IsExtensionFunctor(fun)) {
return 0;
if (how == GP_NAMEARITY) {
Term nts[2];
nts[1] = MkIntegerTerm(pe->ArityOfPE);
if (pe->ArityOfPE) {
nts[0] = MkAtomTerm(NameOfFunctor(pe->FunctorOfPred));
} else {
nts[0] = MkAtomTerm((Atom)pe->FunctorOfPred);
}
at = NameOfFunctor(f);
arity = ArityOfFunctor(f);
} else
return 0;
*pred = YAP_Predicate((YAP_Atom)at, arity, mod);
return pred != NULL;
ts[1] = Yap_MkApplTerm(FunctorSlash, 2, nts);
} else {
if (pe->ArityOfPE) {
ts[1] = Yap_MkNewApplTerm(pe->FunctorOfPred, pe->ArityOfPE);
} else {
ts[1] = MkAtomTerm((Atom)pe->FunctorOfPred);
}
}
nt = Yap_MkApplTerm(FunctorModule, 2, ts);
return Yap_unify(Yap_GetFromSlot(head),nt);
}
X_API void PL_predicate_info(predicate_t p,atom_t *name, int *arity, module_t *m)