static void normalize_path(t_folder_list* x, char *normalized, const char *original) { char buf[FILENAME_MAX]; t_symbol *cwd = canvas_getdir(x->x_canvas); #ifdef _WIN32 sys_unbashfilename(original, buf); #else strncpy(buf, original, FILENAME_MAX); #endif if(sys_isabsolutepath(buf)) { strncpy(normalized, buf, FILENAME_MAX); return; } strncpy(normalized, cwd->s_name, FILENAME_MAX); if(normalized[(strlen(normalized)-1)] != '/') { strncat(normalized, "/", 1); } if(buf[0] == '.') { if(buf[1] == '/') { strncat(normalized, buf + 2, FILENAME_MAX - strlen(normalized)); } else if(buf[1] == '.' && buf[2] == '/') { strncat(normalized, buf, FILENAME_MAX - strlen(normalized)); } } else if(buf[0] != '/') { strncat(normalized, buf, FILENAME_MAX - strlen(normalized)); } else { strncpy(normalized, buf, FILENAME_MAX); } }
static int libdir_add_to_path(const char*dirbuf, t_canvas*canvas) { if(sys_isabsolutepath(dirbuf)) { // only include actual full paths if (canvas) { t_canvasenvironment *canvasenvironment = canvas_getenv(canvas); canvasenvironment->ce_path = namelist_append(canvasenvironment->ce_path, dirbuf, 0); } else { return libdir_add_to_globalpath(dirbuf); } return 1; } return 0; }
int sys_load_lib(t_canvas *canvas, const char *classname) { int dspstate = canvas_suspend_dsp(); struct _loadlib_data data; data.canvas = canvas; data.ok = 0; if (sys_onloadlist(classname)) { verbose(1, "%s: already loaded", classname); return (1); } /* if classname is absolute, try this first */ if (sys_isabsolutepath(classname)) { /* this is just copied from sys_open_absolute() LATER avoid code duplication */ char dirbuf[MAXPDSTRING], *z = strrchr(classname, '/'); int dirlen; if (!z) return (0); dirlen = (int)(z - classname); if (dirlen > MAXPDSTRING-1) dirlen = MAXPDSTRING-1; strncpy(dirbuf, classname, dirlen); dirbuf[dirlen] = 0; data.classname=classname+(dirlen+1); sys_loadlib_iter(dirbuf, &data); } data.classname = classname; if(!data.ok) canvas_path_iterate(canvas, (t_canvas_path_iterator)sys_loadlib_iter, &data); /* if loaders failed so far, we try a last time without a PATH * let the loaders search wherever they want */ if (!data.ok) sys_loadlib_iter(0, &data); if(data.ok) sys_putonloadlist(classname); canvas_resume_dsp(dspstate); return data.ok; }
/* check if we were given an absolute pathname, if so try to open it and return 1 to signal the caller to cancel any path searches */ int sys_open_absolute(const char *name, const char* ext, char *dirresult, char **nameresult, unsigned int size, int bin, int *fdp) { if (sys_isabsolutepath(name)) { char dirbuf[MAXPDSTRING], *z = strrchr(name, '/'); int dirlen; if (!z) return (0); dirlen = z - name; if (dirlen > MAXPDSTRING-1) dirlen = MAXPDSTRING-1; strncpy(dirbuf, name, dirlen); dirbuf[dirlen] = 0; *fdp = sys_trytoopenone(dirbuf, name+(dirlen+1), ext, dirresult, nameresult, size, bin); return (1); } else return (0); }
/* this routine tries to figure out where to find the auxilliary files Pd will need to run. This is either done by looking at the command line invokation for Pd, or if that fails, by consulting the variable INSTALL_PREFIX. In MSW, we don't try to use INSTALL_PREFIX. */ void sys_findprogdir(char *progname) { char sbuf[MAXPDSTRING], sbuf2[MAXPDSTRING], *sp; char *lastslash; #ifndef _WIN32 struct stat statbuf; #endif /* NOT _WIN32 */ /* find out by what string Pd was invoked; put answer in "sbuf". */ #ifdef _WIN32 GetModuleFileName(NULL, sbuf2, sizeof(sbuf2)); sbuf2[MAXPDSTRING-1] = 0; sys_unbashfilename(sbuf2, sbuf); #else strncpy(sbuf, progname, MAXPDSTRING); sbuf[MAXPDSTRING-1] = 0; #endif /* _WIN32 */ lastslash = strrchr(sbuf, '/'); if (lastslash) { /* bash last slash to zero so that sbuf is directory pd was in, e.g., ~/pd/bin */ *lastslash = 0; /* go back to the parent from there, e.g., ~/pd */ lastslash = strrchr(sbuf, '/'); if (lastslash) { strncpy(sbuf2, sbuf, lastslash-sbuf); sbuf2[lastslash-sbuf] = 0; } else strcpy(sbuf2, ".."); } else { /* no slashes found. Try INSTALL_PREFIX. */ #ifdef INSTALL_PREFIX strcpy(sbuf2, INSTALL_PREFIX); #else strcpy(sbuf2, "."); #endif } /* now we believe sbuf2 holds the parent directory of the directory pd was found in. We now want to infer the "lib" directory and the "gui" directory. In "simple" unix installations, the layout is .../bin/pd .../bin/pd-watchdog (etc) .../bin/pd-gui.tcl .../doc and in "complicated" unix installations, it's: .../bin/pd .../lib/pd/bin/pd-watchdog .../lib/pd/bin/pd-gui.tcl .../lib/pd/doc To decide which, we stat .../lib/pd; if that exists, we assume it's the complicated layout. In MSW, it's the "simple" layout, but "wish" is found in bin: .../bin/pd .../bin/wish80.exe .../doc */ #ifdef MSW sys_libdir = gensym(sbuf2); #else /* normalize all paths to absolute */ if (sys_isabsolutepath(sbuf2)) strncpy(sbuf, sbuf2, MAXPDSTRING-30); else { char buf[MAXPDSTRING]; getcwd(buf, MAXPDSTRING-30); strncat(buf, "/", MAXPDSTRING-30); strncat(buf, sbuf2, MAXPDSTRING-30); strncpy(sbuf2, buf, MAXPDSTRING-30); } sbuf[MAXPDSTRING-30] = 0; strcat(sbuf, "/lib/pd-extended"); if (stat(sbuf, &statbuf) >= 0) { /* complicated layout: lib dir is the one we just stat-ed above */ sys_libdir = gensym(sbuf); } else { /* simple layout: lib dir is the parent */ sys_libdir = gensym(sbuf2); } #endif }