diff --git a/C/load_dl.c b/C/load_dl.c
index 3df84d0a2..49a360667 100644
--- a/C/load_dl.c
+++ b/C/load_dl.c
@@ -44,9 +44,32 @@ LoadForeign(StringList ofiles, StringList libs,
char *proc_name, YapInitProc *init_proc)
{
+ while (libs) {
+
+ if (!Yap_TrueFileName(libs->s, Yap_FileNameBuf, TRUE)) {
+ /* use LD_LIBRARY_PATH */
+ strncpy(Yap_FileNameBuf, libs->s, YAP_FILENAME_MAX);
+ }
+
+#ifdef __osf__
+ if((libs->handle=dlopen(Yap_FileNameBuf,RTLD_LAZY)) == NULL)
+#else
+ if((libs->handle=dlopen(Yap_FileNameBuf,RTLD_LAZY|RTLD_GLOBAL)) == NULL)
+#endif
+ {
+ strcpy(Yap_ErrorSay,dlerror());
+ fprintf(stderr,"f=%s\n",Yap_ErrorSay);
+ return LOAD_FAILLED;
+ }
+ libs = libs->next;
+ }
+
while (ofiles) {
void *handle;
+ /* load libraries first so that their symbols are available to
+ other routines */
+
/* dlopen wants to follow the LD_CONFIG_PATH */
if (!Yap_TrueFileName(ofiles->s, Yap_FileNameBuf, TRUE)) {
strcpy(Yap_ErrorSay, "%% Trying to open unexisting file in LoadForeign");
@@ -76,29 +99,6 @@ LoadForeign(StringList ofiles, StringList libs,
return LOAD_FAILLED;
}
- /* load libraries first so that their symbols are available to
- other routines */
- while (libs) {
-
- if (libs->s[0] == '-') {
- strcpy(Yap_FileNameBuf,"lib");
- strcat(Yap_FileNameBuf,libs->s+2);
- strcat(Yap_FileNameBuf,".so");
- } else {
- strcpy(Yap_FileNameBuf,libs->s);
- }
-
-#ifdef __osf__
- if((libs->handle=dlopen(Yap_FileNameBuf,RTLD_LAZY)) == NULL)
-#else
- if((libs->handle=dlopen(Yap_FileNameBuf,RTLD_LAZY|RTLD_GLOBAL)) == NULL)
-#endif
- {
- strcpy(Yap_ErrorSay,dlerror());
- return LOAD_FAILLED;
- }
- libs = libs->next;
- }
return LOAD_SUCCEEDED;
}
diff --git a/changes-5.1.html b/changes-5.1.html
index ed4c8daf7..cbee20276 100644
--- a/changes-5.1.html
+++ b/changes-5.1.html
@@ -16,6 +16,8 @@
Yap-5.1.2:
+- NEW: matlab interface.
+- FIXED: search for libraries right.
- FIXED: alarm used alarm(2) but it should use setitimer(2) so that
timeout can work with millisecs (obs from Bernd Gutmann).
- FIXED: add . to -g goal (obs from Paulo Moura).
diff --git a/library/matlab.yap b/library/matlab.yap
index 4fbc84c8f..932d468ab 100644
--- a/library/matlab.yap
+++ b/library/matlab.yap
@@ -28,7 +28,7 @@
:- ensure_loaded(library(lists)).
-:- load_foreign_files([matlab], ['/s/pkg/matlab/7r14sp3/bin/glnx86/libeng.so','/s/pkg/matlab/7r14sp3/bin/glnx86/libmx.so','/s/pkg/matlab/7r14sp3/bin/glnx86/libut.so'], init_matlab).
+:- load_foreign_files([matlab], ['eng','mx','ut'], init_matlab).
matlab_eval_sequence(S) :-
atomic_concat(S,S1),
diff --git a/pl/load_foreign.yap b/pl/load_foreign.yap
index 5b54a38d6..aa02e0d66 100644
--- a/pl/load_foreign.yap
+++ b/pl/load_foreign.yap
@@ -17,9 +17,9 @@
load_foreign_files(Objs,Libs,Entry) :-
'$check_objs_for_load_foreign_files'(Objs,NewObjs,load_foreign_files(Objs,Libs,Entry)),
- '$check_libs_for_load_foreign_files'(Libs,load_foreign_files(Objs,Libs,Entry)),
+ '$check_libs_for_load_foreign_files'(Libs,NewLibs,load_foreign_files(Objs,Libs,Entry)),
'$check_entry_for_load_foreign_files'(Entry,load_foreign_files(Objs,Libs,Entry)),
- '$load_foreign_files'(NewObjs,Libs,Entry).
+ '$load_foreign_files'(NewObjs,NewLibs,Entry).
'$check_objs_for_load_foreign_files'(V,_,G) :- var(V), !,
'$do_error'(instantiation_error,G).
@@ -39,21 +39,48 @@ load_foreign_files(Objs,Libs,Entry) :-
'$check_obj_for_load_foreign_files'(Obj,_,G) :-
'$do_error'(type_error(atom,Obj),G).
-'$check_libs_for_load_foreign_files'(V,G) :- var(V), !,
+'$check_libs_for_load_foreign_files'(V,_,G) :- var(V), !,
'$do_error'(instantiation_error,G).
-'$check_libs_for_load_foreign_files'([],_) :- !.
-'$check_libs_for_load_foreign_files'([Lib|Libs],G) :- !,
- '$check_lib_for_load_foreign_files'(Lib,G),
- '$check_libs_for_load_foreign_files'(Libs,G).
-'$check_libs_for_load_foreign_files'(Libs,G) :-
+'$check_libs_for_load_foreign_files'([],[],_) :- !.
+'$check_libs_for_load_foreign_files'([Lib|Libs],[NLib|NLibs],G) :- !,
+ '$check_lib_for_load_foreign_files'(Lib,NLib,G),
+ '$check_libs_for_load_foreign_files'(Libs,NLibs,G).
+'$check_libs_for_load_foreign_files'(Libs,_,G) :-
'$do_error'(type_error(list,Libs),G).
-'$check_lib_for_load_foreign_files'(V,G) :- var(V), !,
+'$check_lib_for_load_foreign_files'(V,_,G) :- var(V), !,
'$do_error'(instantiation_error,G).
-'$check_lib_for_load_foreign_files'(Lib,_) :- atom(Lib), !.
-'$check_lib_for_load_foreign_files'(Lib,G) :-
+'$check_lib_for_load_foreign_files'(Lib,NLib,_) :- atom(Lib), !,
+ atom_codes(Lib,LibCodes),
+ '$process_obj_suffix'(LibCodes,NewLibCodes),
+ '$checklib_prefix'(NewLibCodes,FullLibCodes),
+ atom_codes(NLib,FullLibCodes).
+'$check_lib_for_load_foreign_files'(Lib,_,G) :-
'$do_error'(type_error(atom,Lib),G).
+'$process_obj_suffix'(ObjCodes,ObjCodes) :-
+ '$obj_suffix'(ObjSuffix),
+ '$append'(_,ObjSuffix,ObjCodes), !.
+'$process_obj_suffix'(ObjCodes,NewObjCodes) :-
+ '$obj_suffix'(ObjSuffix),
+ '$append'(ObjCodes,ObjSuffix,NewObjCodes).
+
+'$checklib_prefix'(Cs,Cs) :- '$rooted_path'(Cs), !.
+'$checklib_prefix'([0'l,0'i,0'b|NewObjCodes],[0'l,0'i,0'b|NewObjCodes]) :- !.
+'$checklib_prefix'(NewObjCodes,[0'l,0'i,0'b|NewObjCodes]).
+
+'$rooted_path'([C|_]) :- '$dir_separator'(C), !.
+'$rooted_path'(Cs) :-
+ % win32 machine
+ '$dir_separator'(0'\\),
+ '$get_drive'(Cs).
+
+'$get_drive'([0':|_]) :- !.
+'$get_drive'([0'\\|_]) :- !, fail.
+'$get_drive'([_|L]) :-
+ '$get_drive'(L).
+
+
'$check_entry_for_load_foreign_files'(V,G) :- var(V), !,
'$do_error'(instantiation_error,G).
'$check_entry_for_load_foreign_files'(Entry,_) :- atom(Entry), !.
@@ -61,11 +88,5 @@ load_foreign_files(Objs,Libs,Entry) :-
'$do_error'(type_error(atom,Entry),G).
-'$process_obj_suffix'(ObjCodes,ObjCodes) :-
- '$obj_suffix'(ObjSuffix),
- '$append'(ObjCodes,ObjSuffix,ObjCodes), !.
-'$process_obj_suffix'(ObjCodes,NewObjCodes) :-
- '$obj_suffix'(ObjSuffix),
- '$append'(ObjCodes,ObjSuffix,NewObjCodes).