X-Git-Url: http://git.imager.perl.org/imager.git/blobdiff_plain/02d1d62827cef86398edc2013f7d2ff04bf21c63..ad809a288f3d9d56d0e490d2b80286ff2d6212a5:/dynaload.c diff --git a/dynaload.c b/dynaload.c index b5486a53..1d308fd7 100644 --- a/dynaload.c +++ b/dynaload.c @@ -1,87 +1,14 @@ +#include "image.h" #include "dynaload.h" -#include "XSUB.h" /* so we can compile on threaded perls */ +/* #include "XSUB.h" so we can compile on threaded perls */ +#include "imagei.h" -/* These functions are all shared - then comes platform dependant code */ +static symbol_table_t symbol_table={i_has_format,ICL_set_internal,ICL_info, + i_img_new,i_img_empty,i_img_empty_ch,i_img_exorcise, + i_img_info,i_img_setmask,i_img_getmask, + i_box,i_line,i_arc,i_copyto,i_copyto_trans,i_rubthru}; -int getstr(void *hv_t,char *key,char **store) { - SV** svpp; - HV* hv=(HV*)hv_t; - - mm_log((1,"getstr(hv_t 0x%X, key %s, store 0x%X)\n",hv_t,key,store)); - - if ( !hv_exists(hv,key,strlen(key)) ) return 0; - - svpp=hv_fetch(hv, key, strlen(key), 0); - *store=SvPV(*svpp, PL_na ); - - return 1; -} - -int getint(void *hv_t,char *key,int *store) { - SV** svpp; - HV* hv=(HV*)hv_t; - - mm_log((1,"getint(hv_t 0x%X, key %s, store 0x%X)\n",hv_t,key,store)); - - if ( !hv_exists(hv,key,strlen(key)) ) return 0; - - svpp=hv_fetch(hv, key, strlen(key), 0); - *store=(int)SvIV(*svpp); - return 1; -} - -int getdouble(void *hv_t,char* key,double *store) { - SV** svpp; - HV* hv=(HV*)hv_t; - - mm_log((1,"getdouble(hv_t 0x%X, key %s, store 0x%X)\n",hv_t,key,store)); - - if ( !hv_exists(hv,key,strlen(key)) ) return 0; - svpp=hv_fetch(hv, key, strlen(key), 0); - *store=(float)SvNV(*svpp); - return 1; -} - -int getvoid(void *hv_t,char* key,void **store) { - SV** svpp; - HV* hv=(HV*)hv_t; - - mm_log((1,"getvoid(hv_t 0x%X, key %s, store 0x%X)\n",hv_t,key,store)); - - if ( !hv_exists(hv,key,strlen(key)) ) return 0; - - svpp=hv_fetch(hv, key, strlen(key), 0); - *store=(void*)SvIV(*svpp); - - return 1; -} - -int getobj(void *hv_t,char *key,char *type,void **store) { - SV** svpp; - HV* hv=(HV*)hv_t; - - mm_log((1,"getobj(hv_t 0x%X, key %s,type %s, store 0x%X)\n",hv_t,key,type,store)); - - if ( !hv_exists(hv,key,strlen(key)) ) return 0; - - svpp=hv_fetch(hv, key, strlen(key), 0); - - if (sv_derived_from(*svpp,type)) { - IV tmp = SvIV((SV*)SvRV(*svpp)); - *store = (void*) tmp; - } else { - mm_log((1,"getobj: key exists in hash but is not of correct type")); - return 0; - } - - return 1; -} - - -UTIL_table_t UTIL_table={getstr,getint,getdouble,getvoid,getobj}; -extern symbol_table_t symbol_table; - /* Dynamic loading works like this: dynaload opens the shared object and @@ -120,21 +47,24 @@ DSO_open(char* file,char** evalstring) { if ( (shl_findsym(&tt_handle, "symbol_table",TYPE_UNDEFINED,(void*)&plugin_symtab))) return NULL; if ( (shl_findsym(&tt_handle, "util_table",TYPE_UNDEFINED,&plugin_utiltab))) return NULL; (*plugin_symtab)=&symbol_table; - (*plugin_utiltab)=&UTIL_table; + (*plugin_utiltab)=&i_UTIL_table; */ if ( (shl_findsym(&tt_handle, I_INSTALL_TABLES ,TYPE_UNDEFINED, &f ))) return NULL; mm_log( (1,"Calling install_tables\n") ); - f(&symbol_table,&UTIL_table); + f(&symbol_table,&i_UTIL_table); mm_log( (1,"Call ok.\n") ); if ( (shl_findsym(&tt_handle, I_FUNCTION_LIST ,TYPE_UNDEFINED,(func_ptr*)&function_list))) return NULL; - if ( (dso_handle=(DSO_handle*)malloc(sizeof(DSO_handle))) == NULL) return NULL; + if ( (dso_handle=(DSO_handle*)malloc(sizeof(DSO_handle))) == NULL) /* checked 17jul05 tonyc */ + return NULL; dso_handle->handle=tt_handle; /* needed to close again */ dso_handle->function_list=function_list; - if ( (dso_handle->filename=(char*)malloc(strlen(file))) == NULL) { free(dso_handle); return NULL; } + if ( (dso_handle->filename=(char*)malloc(strlen(file)+1)) == NULL) { /* checked 17jul05 tonyc */ + free(dso_handle); return NULL; + } strcpy(dso_handle->filename,file); mm_log((1,"DSO_open <- (0x%X)\n",dso_handle)); @@ -176,7 +106,7 @@ DSO_open(char *file, char **evalstring) { return NULL; } mm_log((1, "Calling install tables\n")); - f(&symbol_table, &UTIL_table); + f(&symbol_table, &i_UTIL_table); mm_log((1, "Call ok\n")); if ( (function_list = (func_ptr *)GetProcAddress(d_handle, I_FUNCTION_LIST)) == NULL) { @@ -184,14 +114,18 @@ DSO_open(char *file, char **evalstring) { FreeLibrary(d_handle); return NULL; } - if ( (dso_handle = (DSO_handle*)malloc(sizeof(DSO_handle))) == NULL) { + if ( (dso_handle = (DSO_handle*)malloc(sizeof(DSO_handle))) == NULL) { /* checked 17jul05 tonyc */ mm_log( (1, "DSO_Open: out of memory\n") ); FreeLibrary(d_handle); return NULL; } dso_handle->handle=d_handle; /* needed to close again */ dso_handle->function_list=function_list; - if ( (dso_handle->filename=(char*)malloc(strlen(file))) == NULL) { free(dso_handle); FreeLibrary(d_handle); return NULL; } + if ( (dso_handle->filename=(char*)malloc(strlen(file)+1)) == NULL) { /* checked 17jul05 tonyc */ + free(dso_handle); + FreeLibrary(d_handle); + return NULL; + } strcpy(dso_handle->filename,file); mm_log( (1,"DSO_open <- 0x%X\n",dso_handle) ); @@ -202,9 +136,11 @@ DSO_open(char *file, char **evalstring) { undef_int DSO_close(void *ptr) { DSO_handle *handle = (DSO_handle *)ptr; - FreeLibrary(handle->handle); + BOOL result = FreeLibrary(handle->handle); free(handle->filename); free(handle); + + return result; } #else @@ -217,6 +153,86 @@ dlclose(minthandle_t h) { } #endif /* __EMX__ */ +#ifdef OS_darwin + +#import + +static char *dl_error = "unknown"; + +static char *dlopen(char *path, int mode /* mode is ignored */) +{ + int dyld_result; + NSObjectFileImage ofile; + NSModule handle = NULL; + + + + dyld_result = NSCreateObjectFileImageFromFile(path, &ofile); + if (dyld_result != NSObjectFileImageSuccess) + { + switch (dyld_result) { + case NSObjectFileImageFailure: + dl_error = "object file setup failure"; + break; + case NSObjectFileImageInappropriateFile: + dl_error = "not a Mach-O MH_BUNDLE file type"; + break; + case NSObjectFileImageArch: + dl_error = "no object for this architecture"; + break; + case NSObjectFileImageFormat: + dl_error = "bad object file format"; + break; + case NSObjectFileImageAccess: + dl_error = "can't read object file"; + break; + default: + dl_error = "unknown error from NSCreateObjectFileImageFromFile()"; + break; + } + } + else + { + // NSLinkModule will cause the run to abort on any link error's + // not very friendly but the error recovery functionality is limited. + handle = NSLinkModule(ofile, path, TRUE); + } + + return handle; +} + +static void * +dlsym(void *handle, char *symbol) +{ + void *addr; + + if (NSIsSymbolNameDefined(symbol)) + { + addr = NSAddressOfSymbol(NSLookupAndBindSymbol(symbol)); + } + else + { + dl_error = "cannot find symbol"; + addr = NULL; + } + + return addr; +} + +static int dlclose(void *handle) /* stub only */ +{ + return 0; +} + +static char *dlerror(void) /* stub only */ +{ + printf("Error occurred\n"); + return dl_error; +} + +#define RTLD_LAZY 0 + +#endif void* DSO_open(char* file,char** evalstring) { @@ -266,11 +282,11 @@ DSO_open(char* file,char** evalstring) { } mm_log( (1,"Calling install_tables\n") ); - f(&symbol_table,&UTIL_table); + f(&symbol_table,&i_UTIL_table); mm_log( (1,"Call ok.\n") ); /* (*plugin_symtab)=&symbol_table; - (*plugin_utiltab)=&UTIL_table; */ + (*plugin_utiltab)=&i_UTIL_table; */ mm_log( (1,"DSO_open: going to dlsym '%s'\n", I_FUNCTION_LIST )); if ( (function_list=(func_ptr *)dlsym(d_handle, I_FUNCTION_LIST)) == NULL) { @@ -278,11 +294,15 @@ DSO_open(char* file,char** evalstring) { return NULL; } - if ( (dso_handle=(DSO_handle*)malloc(sizeof(DSO_handle))) == NULL) return NULL; + if ( (dso_handle=(DSO_handle*)malloc(sizeof(DSO_handle))) == NULL) /* checked 17jul05 tonyc */ + return NULL; dso_handle->handle=d_handle; /* needed to close again */ dso_handle->function_list=function_list; - if ( (dso_handle->filename=(char*)malloc(strlen(file))) == NULL) { free(dso_handle); return NULL; } + if ( (dso_handle->filename=(char*)malloc(strlen(file)+1)) == NULL) { /* checked 17jul05 tonyc */ + free(dso_handle); + return NULL; + } strcpy(dso_handle->filename,file); mm_log( (1,"DSO_open <- 0x%X\n",dso_handle) );