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.