00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <stdio.h>
00027 #include <windows.h>
00028 #include <sys/types.h>
00029 #include <sys/stat.h>
00030
00031 #include "wind2unix.h"
00032 #include <errno.h>
00033 #include <string.h>
00034
00035 #include "auxlry.h"
00036 #include "cell_xsb.h"
00037 #include "memory_xsb.h"
00038 #include "error_xsb.h"
00039 #include "inst_xsb.h"
00040 #include "psc_xsb.h"
00041 #include "string_xsb.h"
00042 #include "extensions_xsb.h"
00043 #include "xsb_config.h"
00044
00045 #define BUFFEXTRA 1024
00046
00047 extern char *xsb_config_file_gl;
00048
00049
00050
00051 xsbBool dummy()
00052 {
00053 xsb_error("Trying to use an undefined foreign procedure");
00054 return FALSE;
00055 }
00056
00057
00058
00059
00060
00061 static char *create_bin_dll_path(char *xsb_config_file_location, char *dll_file_name, int *dirlen){
00062 char *xsb_bin_dir;
00063 int char_count;
00064 char_count = strlen(xsb_config_file_location)-strlen("lib")-1-strlen("xsb_configuration.P");
00065 *dirlen = sizeof(char)*(char_count+strlen(dll_file_name)+5);
00066 xsb_bin_dir = mem_alloc(*dirlen,FOR_CODE_SPACE);
00067 strncpy(xsb_bin_dir, xsb_config_file_location,char_count);
00068 xsb_bin_dir[char_count]='\0';
00069 strcat(xsb_bin_dir, "bin");
00070 char_count += 3;
00071 xsb_bin_dir[char_count]=SLASH;
00072 xsb_bin_dir[char_count+1]='\0';
00073 strcat(xsb_bin_dir, dll_file_name);
00074 return xsb_bin_dir;
00075 }
00076
00077 static byte *load_obj_dyn(char *pofilename, Psc cur_mod, char *ld_option)
00078 {
00079 char *name;
00080 #ifdef XSB_DLL
00081 char tempname[128];
00082 int tempsize;
00083 #endif
00084 Pair search_ptr;
00085 char sofilename[128];
00086 HMODULE handle;
00087 void *funcep;
00088 char *file_extension_ptr;
00089 xsbBool dummy();
00090 char *basename_ptr;
00091 char *xsb_bin_dir;
00092 int dirlen;
00093
00094
00095
00096 strcpy(sofilename, pofilename);
00097
00098 file_extension_ptr = xsb_strrstr(sofilename, XSB_OBJ_EXTENSION_STRING);
00099
00100 strcpy(file_extension_ptr+1, "dll");
00101
00102
00103 if (( handle = LoadLibrary(sofilename)) == 0 ) {
00104
00105
00106
00107 basename_ptr = strrchr(sofilename, SLASH);
00108 if(basename_ptr != NULL){
00109 basename_ptr = basename_ptr + 1;
00110 xsb_bin_dir = create_bin_dll_path(xsb_config_file_gl, basename_ptr,&dirlen);
00111 if(( handle = LoadLibrary(xsb_bin_dir)) == 0 ){
00112 if (( handle = LoadLibrary(basename_ptr)) == 0 ) {
00113 mem_dealloc(xsb_bin_dir,dirlen,FOR_CODE_SPACE);
00114 xsb_warn("Cannot load library %s or %s; error #%d",basename_ptr,sofilename,GetLastError());
00115 return 0;
00116 }
00117 }
00118 mem_dealloc(xsb_bin_dir,dirlen,FOR_CODE_SPACE);
00119 }
00120 }
00121
00122
00123
00124
00125
00126
00127 search_ptr = (Pair)get_data(cur_mod);
00128
00129 while (search_ptr) {
00130 name = get_name(search_ptr->psc_ptr);
00131 #ifdef XSB_DLL
00132 tempname[0] = '_';
00133
00134 strcpy(tempname+1,name);
00135 tempsize=strlen(tempname);
00136 tempname[tempsize++] = '@';
00137 tempname[tempsize++] = '0';
00138 tempname[tempsize++] = '\0';
00139 name = tempname;
00140 #endif
00141 if (get_type(search_ptr->psc_ptr) == T_FORN) {
00142 if ((funcep = (int (*)) GetProcAddress(handle, name)) == NULL) {
00143 xsb_warn("Cannot find foreign procedure %s", name);
00144 set_forn(search_ptr->psc_ptr, (byte *)(dummy));
00145 } else {
00146 set_forn(search_ptr->psc_ptr, (byte *)(funcep));
00147 }
00148
00149 }
00150 search_ptr = search_ptr->next;
00151 }
00152 return (byte *)4;
00153 }
00154
00155
00156
00157