16static char SccsId[] =
"%W% %G%.2";
31#if _WIN32 || defined(__CYGWIN__)
37Int p_load_foreign(USES_REGS1);
39Int p_load_foreign(USES_REGS1) {
43 YapInitProc InitProc = NULL;
46 bool returncode = FALSE;
47 yhandle_t CurSlot = Yap_StartSlots();
48 Term cm = CurrentModule;
55 t = Yap_StripModule(ARG1, &CurrentModule);
60 t1 = Yap_StripModule(HeadOfTerm(t), &CurrentModule);
64 new->name = AtomOfTerm(t1);
69 t = Yap_StripModule(ARG2, &CurrentModule);
73 t1 = Yap_StripModule(HeadOfTerm(t), &CurrentModule);
77 new->name = AtomOfTerm(t1);
83 InitProcName = (
char *)RepAtom(AtomOfTerm(t1))->StrOfAE;
86 if (Yap_LateInit(InitProcName)) {
90 if (Yap_LoadForeign(ofiles, libs, InitProcName, &InitProc) ==
92 if (InitProc == NULL) {
95 f = RepAtom(ofiles->name)->StrOfAE;
97 f = RepAtom(libs->name)->StrOfAE;
99 Yap_Error(SYSTEM_ERROR_OPERATING_SYSTEM, ARG3,
100 "Foreign module %s does not have initialization function %s", f,
106 Yap_CloseSlots(CurSlot);
112 if (returncode == TRUE) {
114 f_code->objs = ofiles;
116 f_code->f = AtomOfTerm(t1);
117 f_code->next = ForeignCodeLoaded;
118 f_code->module = CurrentModule;
119 ForeignCodeLoaded = f_code;
123 Yap_FreeCodeSpace((ADDR)ofiles);
128 Yap_FreeCodeSpace((ADDR)libs);
135static Int p_open_shared_object(USES_REGS1) {
136 Term t = Deref(ARG1);
137 Term tflags = Deref(ARG2);
143 Yap_Error(INSTANTIATION_ERROR, t,
"open_shared_object/3");
146 if (!IsAtomTerm(t)) {
147 Yap_Error(TYPE_ERROR_ATOM, t,
"open_shared_object/3");
151 if (IsVarTerm(tflags)) {
152 Yap_Error(INSTANTIATION_ERROR, tflags,
"open_shared_object/3");
155 if (!IsIntegerTerm(tflags)) {
156 Yap_Error(TYPE_ERROR_INTEGER, tflags,
"open_shared_object/3");
160 s = (
char *)RepAtom(AtomOfTerm(t))->StrOfAE;
161 if ((handle = Yap_LoadForeignFile(s, IntegerOfTerm(tflags))) == NULL) {
162 Yap_Error(EXISTENCE_ERROR_SOURCE_SINK, t,
163 "open_shared_object_failed for %s"
165 s, LOCAL_ErrorMessage);
168 return Yap_unify(MkIntegerTerm((Int)handle), ARG3);
172static Int p_close_shared_object(USES_REGS1) {
173 Term t = Deref(ARG1);
177 Yap_Error(INSTANTIATION_ERROR, t,
"close_shared_object/1");
180 if (!IsIntegerTerm(t)) {
181 Yap_Error(TYPE_ERROR_INTEGER, t,
"close_shared_object/1");
184 handle = (
char *)IntegerOfTerm(t);
186 return Yap_CloseForeignFile(handle);
189static Int p_call_shared_object_function(USES_REGS1) {
190 Term t = Deref(ARG1);
191 Term tfunc = Deref(ARG2);
194 Term OldCurrentModule = CurrentModule;
197 tmod = CurrentModule;
200 Yap_Error(INSTANTIATION_ERROR, t,
"call_shared_object_function/2");
202 }
else if (IsApplTerm(t)) {
203 Functor fun = FunctorOfTerm(t);
204 if (fun == FunctorModule) {
205 tmod = ArgOfTerm(1, t);
206 if (IsVarTerm(tmod)) {
207 Yap_Error(INSTANTIATION_ERROR, t,
"call_shared_object_function/2");
210 if (!IsAtomTerm(tmod)) {
211 Yap_Error(TYPE_ERROR_ATOM, ARG1,
"call_shared_object_function/2");
217 }
else if (!IsIntegerTerm(t)) {
218 Yap_Error(TYPE_ERROR_INTEGER, t,
"call_shared_object_function/2");
221 handle = (
void *)IntegerOfTerm(t);
222 if (IsVarTerm(tfunc)) {
223 Yap_Error(INSTANTIATION_ERROR, t,
"call_shared_object_function/2");
226 if (!IsAtomTerm(tfunc)) {
227 Yap_Error(TYPE_ERROR_ATOM, t,
"call_shared_object_function/2/3");
230 CurrentModule = tmod;
232 Yap_CallForeignFile(handle, (
char *)RepAtom(AtomOfTerm(tfunc))->StrOfAE);
233 CurrentModule = OldCurrentModule;
237static Int p_obj_suffix(USES_REGS1) {
238 return Yap_unify(Yap_CharsToListOfCodes(SO_EXT, ENC_ISO_LATIN1 PASS_REGS),
242static Int p_open_shared_objects(USES_REGS1) {
250static Int check_embedded(USES_REGS1)
252 const char *s = Yap_TextTermToText(Deref(ARG1));
256 if (!strcmp(
"init_myddas",s)) {
262 if (!strcmp(
"init_sqlite3",s)) {
270void Yap_InitLoadForeign(
void) {
271 Yap_InitCPred(
"$check_embedded", 1, check_embedded, SafePredFlag);
272 Yap_InitCPred(
"$load_foreign_files", 3, p_load_foreign,
273 SafePredFlag | SyncPredFlag);
274 Yap_InitCPred(
"$open_shared_objects", 0, p_open_shared_objects, SafePredFlag);
275 Yap_InitCPred(
"$open_shared_object", 3, p_open_shared_object, SyncPredFlag);
276 Yap_InitCPred(
"close_shared_object", 1, p_close_shared_object,
277 SyncPredFlag | SafePredFlag);
284 Yap_InitCPred(
"$call_shared_object_function", 2,
285 p_call_shared_object_function, SyncPredFlag);
286 Yap_InitCPred(
"$obj_suffix", 1, p_obj_suffix, SafePredFlag);
289void Yap_ReOpenLoadForeign(
void) {
292 Term OldModule = CurrentModule;
294 while (f_code != NULL) {
295 YapInitProc InitProc = NULL;
297 CurrentModule = f_code->module;
298 if (Yap_ReLoadForeign(f_code->objs, f_code->libs,
299 (
char *)RepAtom(f_code->f)->StrOfAE,
300 &InitProc) == LOAD_SUCCEEDED) {
304 f_code = f_code->next;
306 CurrentModule = OldModule;
309X_API
bool load_none(
void)
load_foreign_files/3 has works for the following configurations: