This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/C/modules.c

652 lines
16 KiB
C
Raw Normal View History

/*************************************************************************
* *
* YAP Prolog *
* *
* Yap Prolog was developed at NCCUP - Universidade do Porto *
* *
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
* *
2016-07-31 10:30:46 +01:00
*************************************************************** f***********
* *
File: modules.c *
* Last rev: *
* mods: *
* comments: module support *
* *
*************************************************************************/
2018-05-10 13:11:56 +01:00
2016-01-31 10:17:47 +00:00
#ifdef SCCSLookupSystemModule
2014-11-25 12:03:48 +00:00
static char SccsId[] = "%W% %G%";
#endif
#include "Yap.h"
#include "YapHeap.h"
2016-03-29 01:55:12 +01:00
#include "Yatom.h"
2015-11-11 16:46:30 +00:00
static Int current_module(USES_REGS1);
static Int current_module1(USES_REGS1);
static ModEntry *LookupModule(Term a);
static ModEntry *LookupSystemModule(Term a);
2016-02-22 13:01:09 +00:00
static ModEntry *GetModuleEntry(Atom at USES_REGS);
2016-01-31 10:17:47 +00:00
static ModEntry *FetchModuleEntry(Atom at);
2016-03-03 23:16:40 +00:00
/**
2016-01-31 10:17:47 +00:00
* initialize module data-structure
2016-03-03 23:16:40 +00:00
*
2016-01-31 10:17:47 +00:00
* @param to parent module (CurrentModule)
* @param ae module name.
2016-03-03 23:16:40 +00:00
*
2016-01-31 10:17:47 +00:00
* @return a new module structure
2016-03-29 01:55:12 +01:00
*/ /** */
static ModEntry *initMod(AtomEntry *toname, AtomEntry *ae) {
CACHE_REGS
ModEntry *n, *parent;
if (toname == NULL)
parent = NULL;
else {
parent = FetchModuleEntry(toname);
}
n = (ModEntry *)Yap_AllocAtomSpace(sizeof(*n));
INIT_RWLOCK(n->ModRWLock);
n->KindOfPE = ModProperty;
n->PredForME = NULL;
2017-10-28 03:19:39 +01:00
n->OpForME = NULL;
2016-03-29 01:55:12 +01:00
n->NextME = CurrentModules;
CurrentModules = n;
n->AtomOfME = ae;
2018-01-27 10:17:27 +00:00
n->NextOfPE = NULL;
2016-03-29 01:55:12 +01:00
n->OwnerFile = Yap_ConsultingFile(PASS_REGS1);
AddPropToAtom(ae, (PropEntry *)n);
Yap_setModuleFlags(n, parent);
return n;
2016-01-31 10:17:47 +00:00
}
2016-03-03 23:16:40 +00:00
/**
2016-01-31 10:17:47 +00:00
* get predicate entry for ap/arity; create it if neccessary
2016-03-03 23:16:40 +00:00
*
* @param[in] at
*
2016-01-31 10:17:47 +00:00
* @return module descriptorxs
*/
2016-03-29 01:55:12 +01:00
static ModEntry *GetModuleEntry(Atom at USES_REGS) {
Prop p0;
2016-03-04 00:09:33 +00:00
AtomEntry *ae = RepAtom(at);
2016-03-03 23:16:40 +00:00
READ_LOCK(ae->ARWLock);
p0 = ae->PropsOfAE;
while (p0) {
ModEntry *me = RepModProp(p0);
2014-11-25 12:03:48 +00:00
if (me->KindOfPE == ModProperty) {
READ_UNLOCK(ae->ARWLock);
return me;
}
p0 = me->NextOfPE;
}
READ_UNLOCK(ae->ARWLock);
2016-03-03 23:16:40 +00:00
2016-03-29 01:55:12 +01:00
return initMod(
(CurrentModule == PROLOG_MODULE ? NULL : AtomOfTerm(CurrentModule)), at);
2015-06-19 01:30:13 +01:00
}
2016-01-31 10:17:47 +00:00
/** get entry for ap/arity; assumes one is there. */
2016-03-29 01:55:12 +01:00
static ModEntry *FetchModuleEntry(Atom at) {
Prop p0;
AtomEntry *ae = RepAtom(at);
2016-01-31 10:17:47 +00:00
READ_LOCK(ae->ARWLock);
p0 = ae->PropsOfAE;
while (p0) {
2016-01-31 10:17:47 +00:00
ModEntry *me = RepModProp(p0);
if (me->KindOfPE == ModProperty) {
READ_UNLOCK(ae->ARWLock);
return me;
2015-09-21 23:05:36 +01:00
}
2016-01-31 10:17:47 +00:00
p0 = me->NextOfPE;
}
2016-01-31 10:17:47 +00:00
READ_UNLOCK(ae->ARWLock);
return NULL;
}
2015-06-19 01:30:13 +01:00
Term Yap_getUnknownModule(ModEntry *m) {
if (m && m->flags & UNKNOWN_ERROR) {
return TermError;
} else if (m && m->flags & UNKNOWN_WARNING) {
return TermWarning;
2016-01-03 02:06:09 +00:00
} else if (m && m->flags & UNKNOWN_FAST_FAIL) {
return TermFastFail;
2015-06-19 01:30:13 +01:00
} else {
return TermFail;
2014-11-25 12:03:48 +00:00
}
}
2016-03-29 01:55:12 +01:00
bool Yap_getUnknown(Term mod) {
ModEntry *m = LookupModule(mod);
return Yap_getUnknownModule(m);
}
2016-03-29 01:55:12 +01:00
bool Yap_CharacterEscapes(Term mt) {
CACHE_REGS
if (mt == PROLOG_MODULE)
mt = TermProlog;
2016-02-22 13:01:09 +00:00
return GetModuleEntry(AtomOfTerm(mt) PASS_REGS)->flags & M_CHARESCAPE;
2015-06-19 01:30:13 +01:00
}
2014-11-25 12:03:48 +00:00
#define ByteAdr(X) ((char *)&(X))
Term Yap_Module_Name(PredEntry *ap) {
CACHE_REGS
2016-02-14 04:12:31 +00:00
2016-01-31 10:17:47 +00:00
if (!ap)
return TermUser;
if (!ap->ModuleOfPred)
2016-01-31 10:17:47 +00:00
/* If the system predicate is a meta-call I should return the
module for the metacall, which I will suppose has to be
reachable from the current module anyway.
So I will return the current module in case the system
predicate is a meta-call. Otherwise it will still work.
*/
2016-01-31 10:17:47 +00:00
return TermProlog;
else {
2016-01-31 10:17:47 +00:00
return ap->ModuleOfPred;
}
}
static ModEntry *LookupSystemModule(Term a) {
2016-01-03 02:06:09 +00:00
CACHE_REGS
Atom at;
ModEntry *me;
2016-03-03 23:16:40 +00:00
/* prolog module */
if (a == 0) {
2016-01-31 10:17:47 +00:00
a = TermProlog;
}
at = AtomOfTerm(a);
2016-02-22 13:01:09 +00:00
me = GetModuleEntry(at PASS_REGS);
2016-01-31 10:17:47 +00:00
if (!me)
return NULL;
me->flags |= M_SYSTEM;
2016-03-29 01:55:12 +01:00
me->OwnerFile = Yap_ConsultingFile(PASS_REGS1);
2016-01-31 10:17:47 +00:00
return me;
}
2014-11-25 12:03:48 +00:00
static ModEntry *LookupModule(Term a) {
2016-02-22 13:01:09 +00:00
CACHE_REGS
Atom at;
ModEntry *me;
/* prolog module */
if (a == 0) {
2016-02-22 13:01:09 +00:00
return GetModuleEntry(AtomProlog PASS_REGS);
}
at = AtomOfTerm(a);
2016-02-22 13:01:09 +00:00
me = GetModuleEntry(at PASS_REGS);
return me;
}
bool Yap_isSystemModule(Term a) {
ModEntry *me = LookupModule(a);
2016-03-29 01:55:12 +01:00
return me != NULL && me->flags & M_SYSTEM;
}
2014-11-25 12:03:48 +00:00
Term Yap_Module(Term tmod) {
LookupModule(tmod);
return tmod;
}
2014-11-25 12:03:48 +00:00
ModEntry *Yap_GetModuleEntry(Term mod) {
ModEntry *me;
if (!(me = LookupModule(mod)))
return NULL;
return me;
}
2014-11-25 12:03:48 +00:00
Term Yap_GetModuleFromEntry(ModEntry *me) {
return MkAtomTerm(me->AtomOfME);
;
}
2014-11-25 12:03:48 +00:00
struct pred_entry *Yap_ModulePred(Term mod) {
ModEntry *me;
if (!(me = LookupModule(mod)))
return NULL;
return me->PredForME;
}
2014-11-25 12:03:48 +00:00
void Yap_NewModulePred(Term mod, struct pred_entry *ap) {
ModEntry *me;
2017-05-02 03:34:56 +01:00
if (mod == 0)
mod = TermProlog;
if (!(me = LookupModule(mod)))
return;
WRITE_LOCK(me->ModRWLock);
ap->NextPredOfModule = me->PredForME;
me->PredForME = ap;
WRITE_UNLOCK(me->ModRWLock);
}
2014-11-25 12:03:48 +00:00
static Int
2016-01-31 10:17:47 +00:00
current_module(USES_REGS1) { /* $current_module(Old,N) */
2014-11-25 12:03:48 +00:00
Term t;
if (CurrentModule) {
2014-11-25 12:03:48 +00:00
if (!Yap_unify_constant(ARG1, CurrentModule))
return FALSE;
} else {
if (!Yap_unify_constant(ARG1, TermProlog))
return FALSE;
}
t = Deref(ARG2);
if (IsVarTerm(t) || !IsAtomTerm(t))
return FALSE;
if (t == TermProlog) {
CurrentModule = PROLOG_MODULE;
} else {
2015-09-21 23:05:36 +01:00
// make it very clear that t inherits from cm.
LookupModule(t);
CurrentModule = t;
}
LOCAL_SourceModule = CurrentModule;
return TRUE;
}
2016-01-31 10:17:47 +00:00
static Int change_module(USES_REGS1) { /* $change_module(N) */
Term mod = Deref(ARG1);
LookupModule(mod);
CurrentModule = mod;
LOCAL_SourceModule = mod;
return TRUE;
}
static Int current_module1(USES_REGS1) { /* $current_module(Old)
2018-01-27 10:17:27 +00:00
*/
if (CurrentModule)
return Yap_unify_constant(ARG1, CurrentModule);
return Yap_unify_constant(ARG1, TermProlog);
}
2014-11-25 12:03:48 +00:00
static Int cont_current_module(USES_REGS1) {
ModEntry *imod = AddressOfTerm(EXTRA_CBACK_ARG(1, 1)), *next;
Term t = MkAtomTerm(imod->AtomOfME);
next = imod->NextME;
/* ARG1 is unbound */
2014-11-25 12:03:48 +00:00
Yap_unify(ARG1, t);
if (!next)
cut_succeed();
2014-11-25 12:03:48 +00:00
EXTRA_CBACK_ARG(1, 1) = MkAddressTerm(next);
return TRUE;
}
2014-11-25 12:03:48 +00:00
static Int init_current_module(
USES_REGS1) { /* current_module(?ModuleName) */
Term t = Deref(ARG1);
if (!IsVarTerm(t)) {
if (!IsAtomTerm(t)) {
2014-11-25 12:03:48 +00:00
Yap_Error(TYPE_ERROR_ATOM, t, "module name must be an atom");
return FALSE;
}
if (FetchModuleEntry(AtomOfTerm(t)) != NULL)
cut_succeed();
cut_fail();
}
2014-11-25 12:03:48 +00:00
EXTRA_CBACK_ARG(1, 1) = MkIntegerTerm((Int)CurrentModules);
return cont_current_module(PASS_REGS1);
}
2014-11-25 12:03:48 +00:00
static Int cont_ground_module(USES_REGS1) {
ModEntry *imod = AddressOfTerm(EXTRA_CBACK_ARG(3, 1)), *next;
Term t2 = MkAtomTerm(imod->AtomOfME);
next = imod->NextME;
/* ARG2 is unbound */
if (!next)
cut_succeed();
EXTRA_CBACK_ARG(3, 1) = MkAddressTerm(next);
return Yap_unify(ARG2, t2);
}
static Int init_ground_module(USES_REGS1) {
2016-03-29 01:55:12 +01:00
/* current_module(?ModuleName) */
2014-11-25 12:03:48 +00:00
Term t1 = Deref(ARG1), tmod = CurrentModule, t3;
if (tmod == PROLOG_MODULE) {
tmod = TermProlog;
}
t3 = Yap_YapStripModule(t1, &tmod);
if (!t3) {
Yap_Error(TYPE_ERROR_CALLABLE, t3, "trying to obtain module");
2014-11-25 12:03:48 +00:00
return FALSE;
}
if (!IsVarTerm(tmod)) {
if (!IsAtomTerm(tmod)) {
Yap_Error(TYPE_ERROR_ATOM, tmod, "module name must be an atom");
cut_fail();
}
if (FetchModuleEntry(AtomOfTerm(tmod)) != NULL && Yap_unify(tmod, ARG2) &&
Yap_unify(t3, ARG3)) {
cut_succeed();
}
cut_fail();
}
2016-03-29 01:55:12 +01:00
if (!Yap_unify(ARG2, tmod) || !Yap_unify(ARG3, t3)) {
cut_fail();
}
// make sure we keep the binding
2014-11-25 12:03:48 +00:00
B->cp_tr = TR;
B->cp_h = HR;
EXTRA_CBACK_ARG(3, 1) = MkAddressTerm(CurrentModules);
return cont_ground_module(PASS_REGS1);
}
2016-03-03 23:16:40 +00:00
/**
2016-01-03 02:06:09 +00:00
* @pred system_module( + _Mod_)
2016-03-03 23:16:40 +00:00
*
* @param module
*
* @return
*/
2016-03-29 01:55:12 +01:00
static Int is_system_module(USES_REGS1) {
Term t;
2016-03-29 01:55:12 +01:00
if (IsVarTerm(t = Deref(ARG1))) {
return false;
}
if (!IsAtomTerm(t)) {
Yap_Error(TYPE_ERROR_ATOM, t, "load_files/2");
return false;
}
2016-03-29 01:55:12 +01:00
return Yap_isSystemModule(t);
}
2016-03-29 01:55:12 +01:00
static Int new_system_module(USES_REGS1) {
ModEntry *me;
Term t;
2016-03-29 01:55:12 +01:00
if (IsVarTerm(t = Deref(ARG1))) {
Yap_Error(INSTANTIATION_ERROR, t, NULL);
return false;
}
if (!IsAtomTerm(t)) {
Yap_Error(TYPE_ERROR_ATOM, t, NULL);
return false;
}
2016-03-29 01:55:12 +01:00
if ((me = LookupSystemModule(t)))
me->OwnerFile = Yap_ConsultingFile(PASS_REGS1);
return me != NULL;
}
2015-11-11 16:46:30 +00:00
static Int strip_module(USES_REGS1) {
2018-01-27 10:17:27 +00:00
Term t1 = Deref(ARG1), tmod = CurrentModule;
if (tmod == PROLOG_MODULE) {
tmod = TermProlog;
}
t1 = Yap_StripModule(t1, &tmod);
if (!t1) {
Yap_Error(TYPE_ERROR_CALLABLE, t1, "trying to obtain module");
return FALSE;
}
return Yap_unify(ARG3, t1) && Yap_unify(ARG2, tmod);
2016-11-08 07:37:36 +00:00
}
static Int yap_strip_clause(USES_REGS1) {
2018-01-27 10:17:27 +00:00
Term t1 = Deref(ARG1), tmod = LOCAL_SourceModule;
if (tmod == PROLOG_MODULE) {
tmod = TermProlog;
}
t1 = Yap_StripModule(t1, &tmod);
if (IsVarTerm(t1) || IsVarTerm(tmod)) {
Yap_Error(INSTANTIATION_ERROR, t1, "trying to obtain module");
return false;
} else if (IsApplTerm(t1)) {
Functor f = FunctorOfTerm(t1);
if (IsExtensionFunctor(f)) {
Yap_Error(TYPE_ERROR_CALLABLE, t1, "trying to obtain module");
return false;
2016-11-08 07:37:36 +00:00
}
2018-01-27 10:17:27 +00:00
if (f == FunctorAssert || f == FunctorDoubleArrow) {
Term thmod = tmod;
Term th = ArgOfTerm(1, t1);
th = Yap_StripModule(th, &thmod);
if (IsVarTerm(th)) {
2016-11-08 07:37:36 +00:00
Yap_Error(INSTANTIATION_ERROR, t1, "trying to obtain module");
return false;
2018-01-27 10:17:27 +00:00
} else if (IsVarTerm(thmod)) {
Yap_Error(INSTANTIATION_ERROR, thmod, "trying to obtain module");
return false;
} else if (IsIntTerm(th) ||
(IsApplTerm(th) && IsExtensionFunctor(FunctorOfTerm(t1)))) {
Yap_Error(TYPE_ERROR_CALLABLE, t1, "trying to obtain module");
return false;
} else if (!IsAtomTerm(thmod)) {
Yap_Error(TYPE_ERROR_ATOM, thmod, "trying to obtain module");
return false;
2017-09-23 02:17:55 +01:00
}
2018-01-27 10:17:27 +00:00
}
} else if (IsIntTerm(t1) || IsIntTerm(tmod)) {
2017-09-23 02:17:55 +01:00
Yap_Error(TYPE_ERROR_CALLABLE, t1, "trying to obtain module");
2018-01-27 10:17:27 +00:00
return false;
}
return Yap_unify(ARG3, t1) && Yap_unify(ARG2, tmod);
}
2015-04-21 23:09:43 +01:00
Term Yap_YapStripModule(Term t, Term *modp) {
2014-07-16 17:56:09 +01:00
CACHE_REGS
Term tmod;
2016-07-31 10:30:46 +01:00
if (modp) {
2014-07-16 17:56:09 +01:00
tmod = *modp;
2016-07-31 10:30:46 +01:00
if (tmod == PROLOG_MODULE) {
*modp = tmod = TermProlog;
}
} else {
2014-07-16 17:56:09 +01:00
tmod = CurrentModule;
if (tmod == PROLOG_MODULE) {
tmod = TermProlog;
}
}
2014-11-25 12:03:48 +00:00
restart:
2014-07-16 17:56:09 +01:00
if (IsVarTerm(t) || !IsApplTerm(t)) {
if (modp)
*modp = tmod;
return t;
} else {
2014-11-25 12:03:48 +00:00
Functor fun = FunctorOfTerm(t);
2014-07-16 17:56:09 +01:00
if (fun == FunctorModule) {
2014-11-25 12:03:48 +00:00
Term t1 = ArgOfTerm(1, t);
2014-07-16 17:56:09 +01:00
tmod = t1;
2014-11-25 12:03:48 +00:00
if (!IsVarTerm(tmod) && !IsAtomTerm(tmod)) {
2016-06-02 10:52:06 +01:00
if (modp)
*modp = tmod;
return t;
2014-07-16 17:56:09 +01:00
}
t = ArgOfTerm(2, t);
goto restart;
}
if (modp)
*modp = tmod;
return t;
}
return 0L;
}
2015-11-11 16:46:30 +00:00
static Int yap_strip_module(USES_REGS1) {
2014-07-16 17:56:09 +01:00
Term t1 = Deref(ARG1), tmod = CurrentModule;
if (tmod == PROLOG_MODULE) {
tmod = TermProlog;
}
2014-11-25 12:03:48 +00:00
t1 = Yap_YapStripModule(t1, &tmod);
2016-06-02 10:52:06 +01:00
if (!t1 || (!IsVarTerm(tmod) && !IsAtomTerm(tmod))) {
2014-10-20 09:20:56 +01:00
Yap_Error(TYPE_ERROR_CALLABLE, t1, "trying to obtain module");
2014-07-16 17:56:09 +01:00
return FALSE;
}
2014-11-25 12:03:48 +00:00
return Yap_unify(ARG3, t1) && Yap_unify(ARG2, tmod);
2014-07-16 17:56:09 +01:00
}
2015-11-11 16:46:30 +00:00
static Int context_module(USES_REGS1) {
yamop *parentcp = P;
CELL *yenv;
PredEntry *ap = EnvPreg(parentcp);
2014-11-25 12:03:48 +00:00
if (ap->ModuleOfPred && !(ap->PredFlags & MetaPredFlag))
return Yap_unify(ARG1, ap->ModuleOfPred);
parentcp = CP;
yenv = ENV;
do {
ap = EnvPreg(parentcp);
2014-11-25 12:03:48 +00:00
if (ap->ModuleOfPred && !(ap->PredFlags & MetaPredFlag))
return Yap_unify(ARG1, ap->ModuleOfPred);
parentcp = (yamop *)yenv[E_CP];
yenv = (CELL *)yenv[E_E];
2014-11-25 12:03:48 +00:00
} while (yenv);
return Yap_unify(ARG1, CurrentModule);
}
2016-03-03 23:16:40 +00:00
/**
* @pred source_module(-Mod)
2016-03-03 23:16:40 +00:00
*
* @param Mod is the current text source module.
*
* : _Mod_ is the current read-in or source module.
2018-01-27 10:17:27 +00:00
*/
static Int source_module(USES_REGS1) {
if (LOCAL_SourceModule == PROLOG_MODULE) {
return Yap_unify(ARG1, TermProlog);
}
return Yap_unify(ARG1, LOCAL_SourceModule);
}
/**
2016-07-31 10:30:46 +01:00
* @pred source_module(-Mod)
*
* @param Mod is the current text source module.
*
* : _Mod_ is the current read-in or source module.
2018-01-27 10:17:27 +00:00
*/
2016-07-31 10:30:46 +01:00
static Int current_source_module(USES_REGS1) {
Term t;
if (LOCAL_SourceModule == PROLOG_MODULE) {
LOCAL_SourceModule = TermProlog;
}
if (!Yap_unify(ARG1, LOCAL_SourceModule)) {
return false;
};
if (IsVarTerm(t = Deref(ARG2))) {
Yap_Error(INSTANTIATION_ERROR, t, NULL);
return false;
}
if (!IsAtomTerm(t)) {
Yap_Error(TYPE_ERROR_ATOM, t, NULL);
return false;
}
LOCAL_SourceModule = t;
return true;
}
/**
* @pred $copy_operators(+Mode, +ModTarget)
*
* Copy all operators in ModSource to ModTarget
*
* : _Mod_ is the current read-in or source module.
*/
static Int copy_operators(USES_REGS1) {
2016-07-31 10:30:46 +01:00
ModEntry *me = LookupModule(Deref(ARG1));
if (!me)
return true;
2016-07-31 10:30:46 +01:00
ModEntry *she = LookupModule(Deref(ARG2));
if (!she)
return true;
OpEntry *op = me->OpForME;
while (op) {
if (!Yap_dup_op(op, she)) {
return false;
}
op = op->NextForME;
}
return true;
}
2014-11-25 12:03:48 +00:00
Term Yap_StripModule(Term t, Term *modp) {
CACHE_REGS
2016-03-29 01:55:12 +01:00
Term tmod;
if (modp)
tmod = *modp;
else {
tmod = CurrentModule;
if (tmod == PROLOG_MODULE) {
tmod = TermProlog;
}
}
2014-11-25 12:03:48 +00:00
restart:
2014-02-09 18:07:17 +00:00
if (IsVarTerm(t) || !IsApplTerm(t)) {
if (modp)
*modp = tmod;
return t;
2014-02-09 18:07:17 +00:00
} else {
2014-11-25 12:03:48 +00:00
Functor fun = FunctorOfTerm(t);
if (fun == FunctorModule) {
2014-11-25 12:03:48 +00:00
Term t1 = ArgOfTerm(1, t);
if (IsVarTerm(t1)) {
*modp = tmod;
return t;
}
tmod = t1;
2014-11-25 12:03:48 +00:00
if (!IsVarTerm(tmod) && !IsAtomTerm(tmod)) {
return 0L;
}
t = ArgOfTerm(2, t);
goto restart;
}
if (modp)
*modp = tmod;
return t;
}
return 0L;
}
2014-11-25 12:03:48 +00:00
void Yap_InitModulesC(void) {
2015-11-11 16:46:30 +00:00
Yap_InitCPred("$current_module", 2, current_module,
2014-11-25 12:03:48 +00:00
SafePredFlag | SyncPredFlag);
2015-11-11 16:46:30 +00:00
Yap_InitCPred("$current_module", 1, current_module1,
2014-11-25 12:03:48 +00:00
SafePredFlag | SyncPredFlag);
2015-11-11 16:46:30 +00:00
Yap_InitCPred("$change_module", 1, change_module,
2014-11-25 12:03:48 +00:00
SafePredFlag | SyncPredFlag);
2018-01-27 10:17:27 +00:00
Yap_InitCPred("strip_module", 3, strip_module, SafePredFlag | SyncPredFlag);
Yap_InitCPred("$yap_strip_module", 3, yap_strip_module,
SafePredFlag | SyncPredFlag);
Yap_InitCPred("source_module", 1, source_module, SafePredFlag | SyncPredFlag);
2016-07-31 10:30:46 +01:00
Yap_InitCPred("current_source_module", 2, current_source_module,
SafePredFlag | SyncPredFlag);
2018-01-27 10:17:27 +00:00
Yap_InitCPred("$yap_strip_clause", 3, yap_strip_clause,
SafePredFlag | SyncPredFlag);
Yap_InitCPred("context_module", 1, context_module, 0);
2016-07-31 10:30:46 +01:00
Yap_InitCPred("$is_system_module", 1, is_system_module, SafePredFlag);
Yap_InitCPred("$copy_operators", 2, copy_operators, 0);
2016-01-03 02:06:09 +00:00
Yap_InitCPred("new_system_module", 1, new_system_module, SafePredFlag);
2014-11-25 12:03:48 +00:00
Yap_InitCPredBack("$all_current_modules", 1, 1, init_current_module,
cont_current_module, SafePredFlag | SyncPredFlag);
Yap_InitCPredBack("$ground_module", 3, 1, init_ground_module,
cont_ground_module, SafePredFlag | SyncPredFlag);
}
2014-11-25 12:03:48 +00:00
void Yap_InitModules(void) {
CACHE_REGS
2018-01-27 10:17:27 +00:00
CurrentModules = NULL;
LookupSystemModule(MkAtomTerm(AtomProlog));
2014-11-25 12:03:48 +00:00
LOCAL_SourceModule = MkAtomTerm(AtomProlog);
LookupModule(USER_MODULE);
LookupModule(IDB_MODULE);
LookupModule(ATTRIBUTES_MODULE);
LookupSystemModule(CHARSIO_MODULE);
LookupSystemModule(TERMS_MODULE);
LookupSystemModule(SYSTEM_MODULE);
LookupSystemModule(READUTIL_MODULE);
LookupSystemModule(HACKS_MODULE);
LookupModule(ARG_MODULE);
LookupSystemModule(GLOBALS_MODULE);
LookupSystemModule(DBLOAD_MODULE);
LookupSystemModule(RANGE_MODULE);
CurrentModule = PROLOG_MODULE;
}