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)();
43 display_w32_error_msg(
const char* additional_message) {
47 FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, GetLastError(), 0, (LPTSTR)&msg_buf, 0, NULL
49 fprintf(stderr, _(
"scheme load-extension: %s: %s"), additional_message, (
char*)msg_buf);
54 dl_attach(
const char* module) {
55 HMODULE dll = LoadLibrary(module);
57 display_w32_error_msg(module);
62 dl_proc(HMODULE mo,
const char* proc) {
63 FARPROC procedure = GetProcAddress(mo, proc);
65 display_w32_error_msg(proc);
69 static void dl_detach(HMODULE mo) {
70 (void)FreeLibrary(mo);
81 dl_attach(
const char* module) {
82 HMODULE so = dlopen(module, RTLD_LAZY);
84 fprintf(stderr, _(
"Error loading scheme extension \"%s\": %s\n"), module, dlerror());
90 dl_proc(HMODULE mo,
const char* proc) {
92 FARPROC fp = (FARPROC)dlsym(mo, proc);
93 if ((errmsg = dlerror()) == 0) {
96 fprintf(stderr, _(
"Error initializing scheme module \"%s\": %s\n"), proc, errmsg);
100 static void dl_detach(HMODULE mo) {
107 scm_load_ext(scheme* sc, pointer args) {
110 char filename[MAXPATHLEN], init_fn[MAXPATHLEN + 6];
113 void (*module_init)(scheme * sc);
115 if ((args != sc->NIL) && is_string((first_arg = pair_car(args)))) {
116 name = string_value(first_arg);
117 make_filename(name, filename);
118 make_init_fn(name, init_fn);
119 dll_handle = dl_attach(filename);
120 if (dll_handle == 0) {
123 module_init = (void (*)(scheme*))dl_proc(dll_handle, init_fn);
124 if (module_init != 0) {
139 make_filename(
const char* name,
char* filename) {
140 strcpy(filename, name);
141 strcat(filename, SUFFIX);
145 make_init_fn(
const char* name,
char* init_fn) {
146 const char* p = strrchr(name,
'/');
152 strcpy(init_fn,
"init_");
Header info for the dynamic loader functions for TinyScheme.
Header info for the file parsing support functions.