aboutsummaryrefslogtreecommitdiff
path: root/pd/src/s_loader.c
diff options
context:
space:
mode:
authorGuenter Geiger <ggeiger@users.sourceforge.net>2003-05-09 16:04:00 +0000
committerGuenter Geiger <ggeiger@users.sourceforge.net>2003-05-09 16:04:00 +0000
commit9c0e19a3be2288db79e2502e5fa450c3e20a668d (patch)
treeca97ce615e037a533304fc4660dcf372ca3b9cd6 /pd/src/s_loader.c
parentef50dd62804d54af7da18d8bd8413c0dccd729b8 (diff)
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
Diffstat (limited to 'pd/src/s_loader.c')
-rw-r--r--pd/src/s_loader.c139
1 files changed, 81 insertions, 58 deletions
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 <stdlib.h>
#include <unistd.h>
#endif
-#ifdef NT
+#ifdef MSW
#include <io.h>
#include <windows.h>
#endif
@@ -17,7 +17,8 @@
#include <mach-o/dyld.h>
#endif
#include <string.h>
-#include "m_imp.h"
+#include "m_pd.h"
+#include "s_stuff.h"
#include <stdio.h>
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);
}