added Artur's OSX dlload() emulation, with minor changes
[imager.git] / dynaload.c
index b5486a5..4ebd3c0 100644 (file)
@@ -1,6 +1,12 @@
 #include "dynaload.h"
 #include "XSUB.h" /* so we can compile on threaded perls */
 
+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_draw,i_arc,i_copyto,i_copyto_trans,i_rubthru};
+
+
 /* These functions are all shared - then comes platform dependant code */
 
 
@@ -80,7 +86,6 @@ int getobj(void *hv_t,char *key,char *type,void **store) {
 
 
 UTIL_table_t UTIL_table={getstr,getint,getdouble,getvoid,getobj};
-extern symbol_table_t symbol_table;
 
 /*
   Dynamic loading works like this:
@@ -217,6 +222,90 @@ dlclose(minthandle_t h) {
 }
 #endif /* __EMX__ */
 
+#ifdef OS_darwin
+
+#import <mach-o/dyld.h>
+
+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;
+}
+
+void *
+dlsym(handle, symbol)
+     void *handle;
+     char *symbol;
+{
+  void *addr;
+
+  if (NSIsSymbolNameDefined(symbol))
+  {
+    addr = NSAddressOfSymbol(NSLookupAndBindSymbol(symbol));
+  }
+  else
+  {
+    dl_error = "cannot find symbol";
+    addr = NULL;
+  }
+
+  return addr;
+}
+
+int dlclose(handle) /* stub only */
+     void *handle;
+{
+  return 0;
+}
+
+char *dlerror(handle) /* stub only */
+     void *handle;
+{
+  printf("Error occured\n");
+  return dl_error; 
+}
+
+#define RTLD_LAZY 0
+
+#endif 
 
 void*
 DSO_open(char* file,char** evalstring) {