From 9c0e19a3be2288db79e2502e5fa450c3e20a668d Mon Sep 17 00:00:00 2001 From: Guenter Geiger Date: Fri, 9 May 2003 16:04:00 +0000 Subject: This commit was generated by cvs2svn to compensate for changes in r610, which included commits to RCS files with non-trunk default branches. svn path=/trunk/; revision=611 --- pd/src/s_loader.c | 139 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 81 insertions(+), 58 deletions(-) (limited to 'pd/src/s_loader.c') diff --git a/pd/src/s_loader.c b/pd/src/s_loader.c index 4c0ef972..c210206c 100644 --- a/pd/src/s_loader.c +++ b/pd/src/s_loader.c @@ -9,7 +9,7 @@ #include #include #endif -#ifdef NT +#ifdef MSW #include #include #endif @@ -17,7 +17,8 @@ #include #endif #include -#include "m_imp.h" +#include "m_pd.h" +#include "s_stuff.h" #include typedef void (*t_xxx)(void); @@ -39,96 +40,118 @@ static char sys_dllextent[] = #ifdef MACOSX ".pd_darwin"; #endif -#ifdef NT +#ifdef MSW ".dll"; #endif +void class_set_extern_dir(t_symbol *s); int sys_load_lib(char *dirname, char *classname) { char symname[MAXPDSTRING], filename[MAXPDSTRING], dirbuf[MAXPDSTRING], - *nameptr, *lastdot; + classname2[MAXPDSTRING], *nameptr, *lastdot; void *dlobj; - t_xxx makeout; + t_xxx makeout = NULL; int fd; -#ifdef NT +#ifdef MSW HINSTANCE ntdll; #endif #if 0 fprintf(stderr, "lib %s %s\n", dirname, classname); #endif + /* try looking in the path for (classname).(sys_dllextent) ... */ if ((fd = open_via_path(dirname, classname, sys_dllextent, dirbuf, &nameptr, MAXPDSTRING, 1)) < 0) { - return (0); + /* next try (classname)/(classname).(sys_dllextent) ... */ + strncpy(classname2, classname, MAXPDSTRING); + filename[MAXPDSTRING-2] = 0; + strcat(classname2, "/"); + strncat(classname2, classname, MAXPDSTRING-strlen(classname2)); + filename[MAXPDSTRING-1] = 0; + if ((fd = open_via_path(dirname, classname2, sys_dllextent, + dirbuf, &nameptr, MAXPDSTRING, 1)) < 0) + { + return (0); + } } - else - { - close(fd); - /* refabricate the pathname */ - strcpy(filename, dirbuf); - strcat(filename, "/"); - strcat(filename, nameptr); - /* extract the setup function name */ - if (lastdot = strrchr(nameptr, '.')) - *lastdot = 0; + + + close(fd); + class_set_extern_dir(gensym(dirbuf)); + + /* refabricate the pathname */ + strncpy(filename, dirbuf, MAXPDSTRING); + filename[MAXPDSTRING-2] = 0; + strcat(filename, "/"); + strncat(filename, nameptr, MAXPDSTRING-strlen(filename)); + filename[MAXPDSTRING-1] = 0; + /* extract the setup function name */ + if (lastdot = strrchr(nameptr, '.')) + *lastdot = 0; #ifdef MACOSX - strcpy(symname, "_"); - strcat(symname, nameptr); + strcpy(symname, "_"); + strcat(symname, nameptr); #else - strcpy(symname, nameptr); + strcpy(symname, nameptr); #endif - /* if the last character is a tilde, replace with "_tilde" */ - if (symname[strlen(symname) - 1] == '~') - strcpy(symname + (strlen(symname) - 1), "_tilde"); - /* and append _setup to form the C setup function name */ - strcat(symname, "_setup"); + /* if the last character is a tilde, replace with "_tilde" */ + if (symname[strlen(symname) - 1] == '~') + strcpy(symname + (strlen(symname) - 1), "_tilde"); + /* and append _setup to form the C setup function name */ + strcat(symname, "_setup"); #ifdef DL_OPEN - dlobj = dlopen(filename, RTLD_NOW | RTLD_GLOBAL); - if (!dlobj) - { - post("%s: %s", filename, dlerror()); - return (0); - } - makeout = (t_xxx)dlsym(dlobj, symname); -#endif -#ifdef NT - sys_bashfilename(filename, filename); - ntdll = LoadLibrary(filename); - if (!ntdll) - { - post("%s: couldn't load", filename); - return (0); - } - makeout = (t_xxx)GetProcAddress(ntdll, symname); + dlobj = dlopen(filename, RTLD_NOW | RTLD_GLOBAL); + if (!dlobj) + { + post("%s: %s", filename, dlerror()); + class_set_extern_dir(&s_); + return (0); + } + makeout = (t_xxx)dlsym(dlobj, symname); +#endif +#ifdef MSW + sys_bashfilename(filename, filename); + ntdll = LoadLibrary(filename); + if (!ntdll) + { + post("%s: couldn't load", filename); + class_set_extern_dir(&s_); + return (0); + } + makeout = (t_xxx)GetProcAddress(ntdll, symname); #endif #ifdef MACOSX + { + NSObjectFileImage image; + void *ret; + NSSymbol s; + if ( NSCreateObjectFileImageFromFile( filename, &image) != NSObjectFileImageSuccess ) { - NSObjectFileImage image; - void *ret; - NSSymbol s; - if ( NSCreateObjectFileImageFromFile( filename, &image) != NSObjectFileImageSuccess ) - { - post("%s: couldn't load", filename); - return 0; - } - ret = NSLinkModule( image, filename, NSLINKMODULE_OPTION_BINDNOW); - - s = NSLookupSymbolInModule(ret, symname); - - if (s) - makeout = (t_xxx)NSAddressOfSymbol( s); - else makeout = 0; + post("%s: couldn't load", filename); + class_set_extern_dir(&s_); + return 0; } -#endif + ret = NSLinkModule( image, filename, + NSLINKMODULE_OPTION_BINDNOW + NSLINKMODULE_OPTION_PRIVATE); + + s = NSLookupSymbolInModule(ret, symname); + + if (s) + makeout = (t_xxx)NSAddressOfSymbol( s); + else makeout = 0; } +#endif + if (!makeout) { post("load_object: Symbol \"%s\" not found", symname); + class_set_extern_dir(&s_); return 0; } (*makeout)(); + class_set_extern_dir(&s_); return (1); } -- cgit v1.2.1