* included in the distribution.
*
* $RCSfile: dynamic.c,v $
- * $Revision: 1.10 $
- * $Date: 1999/10/26 17:27:39 $
+ * $Revision: 1.11 $
+ * $Date: 1999/10/28 14:32:06 $
* ------------------------------------------------------------------------*/
#include "prelude.h"
#include <windows.h>
-ObjectFile loadLibrary(fn)
-String fn; {
- return LoadLibrary(fn);
-}
-
-void* lookupSymbol(file,symbol)
-ObjectFile file;
-String symbol; {
- return GetProcAddress(file,symbol);
-}
-
-const char *dlerror(void)
-{
- return "<unknown>";
-}
-
-void* getDLLSymbol(dll,symbol) /* load dll and lookup symbol */
-String dll;
+void* getDLLSymbol(line,dll0,symbol) /* load dll and lookup symbol */
+Int line;
+String dll0;
String symbol; {
- ObjectFile instance = LoadLibrary(dll);
+ void* sym;
+ char dll[1000];
+ ObjectFile instance;
+ if (strlen(dll0) > 996) {
+ ERRMSG(line) "Excessively long library name:\n%s\n",dll
+ EEND;
+ }
+ strcpy(dll,dll0);
+ strcat(dll, ".dll");
+ instance = LoadLibrary(dll);
if (NULL == instance) {
/* GetLastError allegedly provides more detail - in practice,
* it tells you nothing more.
*/
- ERRMSG(0) "Error while importing DLL \"%s\"", dll
+ ERRMSG(line) "Can't open library \"%s\"", dll
EEND;
}
return GetProcAddress(instance,symbol);
#include <stdio.h>
#include <dlfcn.h>
-ObjectFile loadLibrary(fn)
-String fn; {
- return dlopen(fn,RTLD_NOW | RTLD_GLOBAL);
-}
-
-void* lookupSymbol(file,symbol)
-ObjectFile file;
-String symbol; {
- return dlsym(file,symbol);
-}
-
-void* getDLLSymbol(dll,symbol) /* load dll and lookup symbol */
-String dll;
+void* getDLLSymbol(line,dll0,symbol) /* load dll and lookup symbol */
+Int line;
+String dll0;
String symbol; {
+ void* sym;
+ char dll[1000];
+ ObjectFile instance;
+ if (strlen(dll0) > 996) {
+ ERRMSG(line) "Excessively long library name:\n%s\n",dll
+ EEND;
+ }
+ strcpy(dll,dll0);
+ strcat(dll, ".so");
#ifdef RTLD_NOW
- ObjectFile instance = dlopen(dll,RTLD_NOW);
+ instance = dlopen(dll,RTLD_NOW);
#elif defined RTLD_LAZY /* eg SunOS4 doesn't have RTLD_NOW */
- ObjectFile instance = dlopen(dll,RTLD_LAZY);
+ instance = dlopen(dll,RTLD_LAZY);
#else /* eg FreeBSD doesn't have RTLD_LAZY */
- ObjectFile instance = dlopen(dll,1);
+ instance = dlopen(dll,1);
#endif
- void *sym;
if (NULL == instance) {
- ERRMSG(0) "Error while importing DLL \"%s\":\n%s\n", dll, dlerror()
+ ERRMSG(line) "Can't open library \"%s\":\n %s\n",dll,dlerror()
EEND;
}
if ((sym = dlsym(instance,symbol)))
return sym;
- ERRMSG(0) "Error loading sym:\n%s\n", dlerror()
+ ERRMSG(line) "Can't find symbol \"%s\" in library \"%s\"",symbol,dll
EEND;
}
#include <dl.h>
-void* getDLLSymbol(dll,symbol) /* load dll and lookup symbol */
-String dll;
+void* getDLLSymbol(line,dll0,symbol) /* load dll and lookup symbol */
+Int line;
+String dll0;
String symbol; {
ObjectFile instance = shl_load(dll,BIND_IMMEDIATE,0L);
void* r;
if (NULL == instance) {
- ERRMSG(0) "Error while importing DLL \"%s\"", dll
+ ERRMSG(line) "Error while importing DLL \"%s\"", dll
EEND;
}
return (0 == shl_findsym(&instance,symbol,TYPE_PROCEDURE,&r)) ? r : 0;
#else /* Dynamic loading not available */
-void* getDLLSymbol(dll,symbol) /* load dll and lookup symbol */
-String dll;
+void* getDLLSymbol(line,dll0,symbol) /* load dll and lookup symbol */
+Int line;
+String dll0;
String symbol; {
#if 1 /* very little to choose between these options */
return 0;
#else
- ERRMSG(0) "This Hugs build does not support dynamic loading\n"
+ ERRMSG(line) "This Hugs build does not support dynamic loading\n"
EEND;
#endif
}
-extern void* getDLLSymbol Args((String,String));
-extern void* lookupSymbol Args((ObjectFile file, String symbol));
-extern ObjectFile loadLibrary Args((String fn));
+extern void* getDLLSymbol Args((Int,String,String));
extern Bool stdcallAllowed Args((void));
type FILE_STAR = Int -- FILE *
-foreign import "nHandle.so" "nh_stdin" nh_stdin :: IO FILE_STAR
-foreign import "nHandle.so" "nh_stdout" nh_stdout :: IO FILE_STAR
-foreign import "nHandle.so" "nh_stderr" nh_stderr :: IO FILE_STAR
-foreign import "nHandle.so" "nh_write" nh_write :: FILE_STAR -> Int -> IO ()
-foreign import "nHandle.so" "nh_read" nh_read :: FILE_STAR -> IO Int
-foreign import "nHandle.so" "nh_open" nh_open :: Addr -> Int -> IO FILE_STAR
-foreign import "nHandle.so" "nh_flush" nh_flush :: FILE_STAR -> IO ()
-foreign import "nHandle.so" "nh_close" nh_close :: FILE_STAR -> IO ()
-foreign import "nHandle.so" "nh_errno" nh_errno :: IO Int
-
-foreign import "nHandle.so" "nh_malloc" nh_malloc :: Int -> IO Addr
-foreign import "nHandle.so" "nh_free" nh_free :: Addr -> IO ()
-foreign import "nHandle.so" "nh_store" nh_store :: Addr -> Int -> IO ()
-foreign import "nHandle.so" "nh_load" nh_load :: Addr -> IO Int
-
-foreign import "nHandle.so" "nh_argc" nh_argc :: IO Int
-foreign import "nHandle.so" "nh_argvb" nh_argvb :: Int -> Int -> IO Int
-foreign import "nHandle.so" "nh_getenv" nh_getenv :: Addr -> IO Addr
+foreign import "nHandle" "nh_stdin" nh_stdin :: IO FILE_STAR
+foreign import "nHandle" "nh_stdout" nh_stdout :: IO FILE_STAR
+foreign import "nHandle" "nh_stderr" nh_stderr :: IO FILE_STAR
+foreign import "nHandle" "nh_write" nh_write :: FILE_STAR -> Int -> IO ()
+foreign import "nHandle" "nh_read" nh_read :: FILE_STAR -> IO Int
+foreign import "nHandle" "nh_open" nh_open :: Addr -> Int -> IO FILE_STAR
+foreign import "nHandle" "nh_flush" nh_flush :: FILE_STAR -> IO ()
+foreign import "nHandle" "nh_close" nh_close :: FILE_STAR -> IO ()
+foreign import "nHandle" "nh_errno" nh_errno :: IO Int
+
+foreign import "nHandle" "nh_malloc" nh_malloc :: Int -> IO Addr
+foreign import "nHandle" "nh_free" nh_free :: Addr -> IO ()
+foreign import "nHandle" "nh_store" nh_store :: Addr -> Int -> IO ()
+foreign import "nHandle" "nh_load" nh_load :: Addr -> IO Int
+
+foreign import "nHandle" "nh_argc" nh_argc :: IO Int
+foreign import "nHandle" "nh_argvb" nh_argvb :: Int -> Int -> IO Int
+foreign import "nHandle" "nh_getenv" nh_getenv :: Addr -> IO Addr
copy_String_to_cstring :: String -> IO Addr
copy_String_to_cstring s
* included in the distribution.
*
* $RCSfile: translate.c,v $
- * $Revision: 1.12 $
- * $Date: 1999/10/27 11:57:32 $
+ * $Revision: 1.13 $
+ * $Date: 1999/10/28 14:32:07 $
* ------------------------------------------------------------------------*/
#include "prelude.h"
{
Pair extName = name(n).defn;
- void* funPtr = getDLLSymbol(textToStr(textOf(fst(extName))),
+ void* funPtr = getDLLSymbol(name(n).line,
+ textToStr(textOf(fst(extName))),
textToStr(textOf(snd(extName))));
List extra_args = doubleton(mkPtr(descriptor),mkPtr(funPtr));
StgRhs rhs = makeStgPrim(n,addState,extra_args,descriptor->arg_tys,
type FILE_STAR = Int -- FILE *
-foreign import "nHandle.so" "nh_stdin" nh_stdin :: IO FILE_STAR
-foreign import "nHandle.so" "nh_stdout" nh_stdout :: IO FILE_STAR
-foreign import "nHandle.so" "nh_stderr" nh_stderr :: IO FILE_STAR
-foreign import "nHandle.so" "nh_write" nh_write :: FILE_STAR -> Int -> IO ()
-foreign import "nHandle.so" "nh_read" nh_read :: FILE_STAR -> IO Int
-foreign import "nHandle.so" "nh_open" nh_open :: Addr -> Int -> IO FILE_STAR
-foreign import "nHandle.so" "nh_flush" nh_flush :: FILE_STAR -> IO ()
-foreign import "nHandle.so" "nh_close" nh_close :: FILE_STAR -> IO ()
-foreign import "nHandle.so" "nh_errno" nh_errno :: IO Int
-
-foreign import "nHandle.so" "nh_malloc" nh_malloc :: Int -> IO Addr
-foreign import "nHandle.so" "nh_free" nh_free :: Addr -> IO ()
-foreign import "nHandle.so" "nh_store" nh_store :: Addr -> Int -> IO ()
-foreign import "nHandle.so" "nh_load" nh_load :: Addr -> IO Int
-
-foreign import "nHandle.so" "nh_argc" nh_argc :: IO Int
-foreign import "nHandle.so" "nh_argvb" nh_argvb :: Int -> Int -> IO Int
-foreign import "nHandle.so" "nh_getenv" nh_getenv :: Addr -> IO Addr
+foreign import "nHandle" "nh_stdin" nh_stdin :: IO FILE_STAR
+foreign import "nHandle" "nh_stdout" nh_stdout :: IO FILE_STAR
+foreign import "nHandle" "nh_stderr" nh_stderr :: IO FILE_STAR
+foreign import "nHandle" "nh_write" nh_write :: FILE_STAR -> Int -> IO ()
+foreign import "nHandle" "nh_read" nh_read :: FILE_STAR -> IO Int
+foreign import "nHandle" "nh_open" nh_open :: Addr -> Int -> IO FILE_STAR
+foreign import "nHandle" "nh_flush" nh_flush :: FILE_STAR -> IO ()
+foreign import "nHandle" "nh_close" nh_close :: FILE_STAR -> IO ()
+foreign import "nHandle" "nh_errno" nh_errno :: IO Int
+
+foreign import "nHandle" "nh_malloc" nh_malloc :: Int -> IO Addr
+foreign import "nHandle" "nh_free" nh_free :: Addr -> IO ()
+foreign import "nHandle" "nh_store" nh_store :: Addr -> Int -> IO ()
+foreign import "nHandle" "nh_load" nh_load :: Addr -> IO Int
+
+foreign import "nHandle" "nh_argc" nh_argc :: IO Int
+foreign import "nHandle" "nh_argvb" nh_argvb :: Int -> Int -> IO Int
+foreign import "nHandle" "nh_getenv" nh_getenv :: Addr -> IO Addr
copy_String_to_cstring :: String -> IO Addr
copy_String_to_cstring s