[PD-dev] proposed fix for objects named with +,-,*,^, etc.
Hans-Christoph Steiner
hans at eds.org
Wed Nov 16 20:44:49 CET 2005
Nice! I'll include it on the extended builds that I am working on right
now.
.hc
IOhannes m zmoelnig wrote:
> just for a start i hacked this together (doesn't do the conversion when
> trying to load the .pd-files though!)
>
> mfg.asd.r
> IOhannes
>
>
> ------------------------------------------------------------------------
>
> --- s_loader.c.org 2005-11-16 19:45:32.550161296 +0100
> +++ s_loader.c 2005-11-16 19:41:13.935476704 +0100
> @@ -46,10 +46,45 @@
>
> void class_set_extern_dir(t_symbol *s);
>
> +/* replace everything but [a-zA-Z0-9_] by "0x%x" */
> +static char*alternative_classname(char*classname)
> +{
> + char *altname=(char*)getbytes(sizeof(char)*MAXPDSTRING);
> + int count=0;
> + int i=0;
> + for(i=0; i<MAXPDSTRING; i++)
> + altname[i]=0;
> + i=0;
> + while(*classname)
> + {
> + char c=*classname;
> + if((c>=48 && c<=57)|| /* [0-9] */
> + (c>=65 && c<=90)|| /* [A-Z] */
> + (c>=97 && c<=122)||/* [a-z] */
> + (c==95)) /* [_] */
> + {
> + altname[i]=c;
> + i++;
> + }
> + else /* a "bad" character */
> + {
> + sprintf(altname+i, "0x%02x", c);
> + i+=4;
> + count++;
> + }
> + classname++;
> + }
> + if(count>0)return altname;
> + /* seems like the given classname is fine as can be */
> + freebytes(altname, sizeof(char)*MAXPDSTRING);
> + return 0;
> +}
> +
> int sys_load_lib(char *dirname, char *classname)
> {
> char symname[MAXPDSTRING], filename[MAXPDSTRING], dirbuf[MAXPDSTRING],
> - classname2[MAXPDSTRING], *nameptr, *lastdot;
> + classname2[MAXPDSTRING], *nameptr, *lastdot,
> + altsymname[MAXPDSTRING], *altname=0;
> void *dlobj;
> t_xxx makeout = NULL;
> int fd;
> @@ -59,6 +94,7 @@
> #if 0
> fprintf(stderr, "lib %s %s\n", dirname, classname);
> #endif
> + altname=alternative_classname(classname);
> /* try looking in the path for (classname).(sys_dllextent) ... */
> if ((fd = open_via_path(dirname, classname, sys_dllextent,
> dirbuf, &nameptr, MAXPDSTRING, 1)) < 0)
> @@ -72,6 +108,25 @@
> if ((fd = open_via_path(dirname, classname2, sys_dllextent,
> dirbuf, &nameptr, MAXPDSTRING, 1)) < 0)
> {
> + /* next try (alternative_classname).(sys_dllextent) */
> + if(altname)
> + {
> + if ((fd = open_via_path(dirname, altname, sys_dllextent,
> + dirbuf, &nameptr, MAXPDSTRING, 1)) < 0)
> +
> + /* next try (alternative_classname)/(alternative_classname).(sys_dllextent) ... */
> + strncpy(classname2, altname, MAXPDSTRING);
> + filename[MAXPDSTRING-2] = 0;
> + strcat(classname2, "/");
> + strncat(classname2, altname, MAXPDSTRING-strlen(classname2));
> + filename[MAXPDSTRING-1] = 0;
> + if ((fd = open_via_path(dirname, classname2, sys_dllextent,
> + dirbuf, &nameptr, MAXPDSTRING, 1)) < 0)
> + {
> + return 0;
> + }
> + }
> + else
> return (0);
> }
> }
> @@ -93,9 +148,20 @@
> #ifdef MACOSX
> strcpy(symname, "_");
> strcat(symname, nameptr);
> + if(altname)
> + {
> + strcpy(altsymname, "_setup_");
> + strcat(symname, altname);
> + }
> #else
> strcpy(symname, nameptr);
> + if(altname)
> + {
> + strcpy(altsymname, "setup_");
> + strcat(altsymname, altname);
> + }
> #endif
> +
> /* if the last character is a tilde, replace with "_tilde" */
> if (symname[strlen(symname) - 1] == '~')
> strcpy(symname + (strlen(symname) - 1), "_tilde");
> @@ -110,6 +176,7 @@
> return (0);
> }
> makeout = (t_xxx)dlsym(dlobj, symname);
> + if(!makeout)makeout = (t_xxx)dlsym(dlobj, altsymname);
> #endif
> #ifdef MSW
> sys_bashfilename(filename, filename);
> @@ -121,6 +188,7 @@
> return (0);
> }
> makeout = (t_xxx)GetProcAddress(ntdll, symname);
> + if(!makeout)makeout = (t_xxx)GetProcAddress(ntdll, altsymname);
> #endif
> #ifdef MACOSX
> {
> @@ -147,6 +215,8 @@
> }
> s = NSLookupSymbolInModule(ret, symname);
>
> + if(!s)s=NSLookupSymbolInModule(ret, altsymname);
> +
> if (s)
> makeout = (t_xxx)NSAddressOfSymbol( s);
> else makeout = 0;
> @@ -156,6 +226,8 @@
> if (!makeout)
> {
> post("load_object: Symbol \"%s\" not found", symname);
> + if(altname)
> + post("load_object: Symbol \"%s\" not found", altsymname);
> class_set_extern_dir(&s_);
> return 0;
> }
More information about the Pd-dev
mailing list