10 #define _SCHEME_SOURCE
20 # define MAXPATHLEN 1024
23 static void make_filename(
const char *name,
char *filename);
24 static void make_init_fn(
const char *name,
char *init_fn);
29 typedef void *HMODULE;
30 typedef void (*FARPROC)();
42 static void display_w32_error_msg(
const char *additional_message)
46 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
47 NULL, GetLastError(), 0,
48 (LPTSTR)&msg_buf, 0, NULL);
49 fprintf(stderr, _(
"scheme load-extension: %s: %s"), additional_message, (
char *) msg_buf);
53 static HMODULE dl_attach(
const char *module) {
54 HMODULE dll = LoadLibrary(module);
55 if (!dll) display_w32_error_msg(module);
59 static FARPROC dl_proc(HMODULE mo,
const char *proc) {
60 FARPROC procedure = GetProcAddress(mo,proc);
61 if (!procedure) display_w32_error_msg(proc);
65 static void dl_detach(HMODULE mo) {
66 (void)FreeLibrary(mo);
76 static HMODULE dl_attach(
const char *module) {
77 HMODULE so=dlopen(module,RTLD_LAZY);
79 fprintf(stderr, _(
"Error loading scheme extension \"%s\": %s\n"), module, dlerror());
84 static FARPROC dl_proc(HMODULE mo,
const char *proc) {
86 FARPROC fp=(FARPROC)dlsym(mo,proc);
87 if ((errmsg = dlerror()) == 0) {
90 fprintf(stderr, _(
"Error initializing scheme module \"%s\": %s\n"), proc, errmsg);
94 static void dl_detach(HMODULE mo) {
100 pointer scm_load_ext(scheme *sc, pointer args)
104 char filename[MAXPATHLEN], init_fn[MAXPATHLEN+6];
107 void (*module_init)(scheme *sc);
109 if ((args != sc->NIL) && is_string((first_arg = pair_car(args)))) {
110 name = string_value(first_arg);
111 make_filename(name,filename);
112 make_init_fn(name,init_fn);
113 dll_handle = dl_attach(filename);
114 if (dll_handle == 0) {
118 module_init = (void(*)(scheme *))dl_proc(dll_handle, init_fn);
119 if (module_init != 0) {
135 static void make_filename(
const char *name,
char *filename) {
136 strcpy(filename,name);
137 strcat(filename,SUFFIX);
140 static void make_init_fn(
const char *name,
char *init_fn) {
141 const char *p=strrchr(name,
'/');
147 strcpy(init_fn,
"init_");