Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30927
Modified Files: Tag: desiredata makefile.in s_path.c Log Message: more C++
Index: makefile.in =================================================================== RCS file: /cvsroot/pure-data/pd/src/makefile.in,v retrieving revision 1.4.4.2.2.21.2.22 retrieving revision 1.4.4.2.2.21.2.23 diff -C2 -d -r1.4.4.2.2.21.2.22 -r1.4.4.2.2.21.2.23 *** makefile.in 3 Jan 2007 20:46:57 -0000 1.4.4.2.2.21.2.22 --- makefile.in 16 Jan 2007 00:27:17 -0000 1.4.4.2.2.21.2.23 *************** *** 21,27 **** CFLAGS += -DINSTALL_PREFIX="$(prefix)"
! SRCXX = desire.c kernel.c builtins.c builtins_dsp.c SRC = m_fifo.c m_simd.c \ ! m_sched.c s_main.c s_inter.c s_loader.c s_path.c s_audio.c s_midi.c \ d_ugen.c d_mayer_fft.c d_fftroutine.c d_resample.c d_soundfile.c
--- 21,27 ---- CFLAGS += -DINSTALL_PREFIX="$(prefix)"
! SRCXX = desire.c kernel.c builtins.c builtins_dsp.c s_path.c SRC = m_fifo.c m_simd.c \ ! m_sched.c s_main.c s_inter.c s_loader.c s_audio.c s_midi.c \ d_ugen.c d_mayer_fft.c d_fftroutine.c d_resample.c d_soundfile.c
Index: s_path.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/s_path.c,v retrieving revision 1.3.4.6.2.8.2.6 retrieving revision 1.3.4.6.2.8.2.7 diff -C2 -d -r1.3.4.6.2.8.2.6 -r1.3.4.6.2.8.2.7 *** s_path.c 20 Dec 2006 04:20:39 -0000 1.3.4.6.2.8.2.6 --- s_path.c 16 Jan 2007 00:27:17 -0000 1.3.4.6.2.8.2.7 *************** *** 29,42 **** #include <ctype.h>
! t_namelist *sys_externlist; t_namelist *sys_searchpath; t_namelist *sys_helppath;
! /* change '/' characters to the system's native file separator */ ! void sys_bashfilename(const char *from, char *to) ! { char c; ! while (c = *from++) ! { #ifdef MSW if (c == '/') c = '\'; --- 29,40 ---- #include <ctype.h>
! extern t_namelist *sys_externlist; t_namelist *sys_searchpath; t_namelist *sys_helppath;
! /* change '/' characters to the system's native file separator */ ! void sys_bashfilename(const char *from, char *to) { char c; ! while ((c = *from++)) { #ifdef MSW if (c == '/') c = '\'; *************** *** 47,56 **** }
! /* change the system's native file separator to '/' characters */ ! void sys_unbashfilename(const char *from, char *to) ! { char c; ! while (c = *from++) ! { #ifdef MSW if (c == '\') c = '/'; --- 45,52 ---- }
! /* change the system's native file separator to '/' characters */ ! void sys_unbashfilename(const char *from, char *to) { char c; ! while ((c = *from++)) { #ifdef MSW if (c == '\') c = '/'; *************** *** 66,109 **** /* if it was the last substring, return NULL */
! static const char* strtokcpy(char *to, const char *from, int delim) ! { int size = 0; ! ! while (from[size] != (char)delim && from[size] != '\0') ! size++; ! strncpy(to,from,size); to[size] = '\0'; if (from[size] == '\0') return NULL; ! if (size) return from+size+1; ! else return NULL; }
/* add a single item to a namelist. If "allowdup" is true, duplicates may be added; othewise they're dropped. */ ! ! t_namelist *namelist_append(t_namelist *listwas, const char *s, int allowdup) ! { t_namelist *nl, *nl2; nl2 = (t_namelist *)(getbytes(sizeof(*nl))); nl2->nl_next = 0; ! nl2->nl_string = (char *)getbytes(strlen(s) + 1); ! strcpy(nl2->nl_string, s); sys_unbashfilename(nl2->nl_string, nl2->nl_string); ! if (!listwas) ! return (nl2); ! else ! { ! for (nl = listwas; ;) ! { ! if (!allowdup && !strcmp(nl->nl_string, s)) ! return (listwas); ! if (!nl->nl_next) ! break; ! nl = nl->nl_next; ! } ! nl->nl_next = nl2; } ! return (listwas); }
--- 62,90 ---- /* if it was the last substring, return NULL */
! static const char* strtokcpy(char *to, const char *from, int delim) { int size = 0; ! while (from[size] != (char)delim && from[size] != '\0') size++; strncpy(to,from,size); to[size] = '\0'; if (from[size] == '\0') return NULL; ! return size ? from+size+1 : 0; }
/* add a single item to a namelist. If "allowdup" is true, duplicates may be added; othewise they're dropped. */ ! t_namelist *namelist_append(t_namelist *listwas, const char *s, int allowdup) { t_namelist *nl, *nl2; nl2 = (t_namelist *)(getbytes(sizeof(*nl))); nl2->nl_next = 0; ! nl2->nl_string = strdup(s); sys_unbashfilename(nl2->nl_string, nl2->nl_string); ! if (!listwas) return nl2; ! for (nl = listwas; ;) { ! if (!allowdup && !strcmp(nl->nl_string, s)) return listwas; ! if (!nl->nl_next) break; ! nl = nl->nl_next; } ! nl->nl_next = nl2; ! return listwas; }
*************** *** 116,154 **** #endif
! t_namelist *namelist_append_files(t_namelist *listwas, const char *s) ! { ! const char *npos; char temp[MAXPDSTRING]; ! t_namelist *nl = listwas, *rtn = listwas; ! ! npos = s; ! do ! { npos = strtokcpy(temp, npos, SEPARATOR); ! if (! *temp) continue; nl = namelist_append(nl, temp, 0); ! } ! while (npos); ! return (nl); }
! void namelist_free(t_namelist *listwas) ! { ! t_namelist *nl, *nl2; ! for (nl = listwas; nl; nl = nl2) ! { nl2 = nl->nl_next; ! t_freebytes(nl->nl_string, strlen(nl->nl_string) + 1); ! t_freebytes(nl, sizeof(*nl)); } }
! char *namelist_get(t_namelist *namelist, int n) ! { ! int i; ! t_namelist *nl; ! for (i = 0, nl = namelist; i < n && nl; i++, nl = nl->nl_next) ! ; ! return (nl ? nl->nl_string : 0); }
--- 97,125 ---- #endif
! t_namelist *namelist_append_files(t_namelist *listwas, const char *s) { char temp[MAXPDSTRING]; ! const char *npos = s; ! t_namelist *nl = listwas; ! do { npos = strtokcpy(temp, npos, SEPARATOR); ! if (!*temp) continue; nl = namelist_append(nl, temp, 0); ! } while (npos); ! return nl; }
! void namelist_free(t_namelist *listwas) { ! t_namelist *nl2; ! for (t_namelist *nl = listwas; nl; nl = nl2) { nl2 = nl->nl_next; ! free(nl->nl_string); ! free(nl); } }
! char *namelist_get(t_namelist *namelist, int n) { ! int i=0; ! for (t_namelist *nl = namelist; i < n && nl; nl = nl->nl_next) {if (i==n) return nl->nl_string; else i++;} ! return 0; }
*************** *** 157,162 **** int sys_usestdpath = 1;
! void sys_setextrapath(const char *p) ! { namelist_free(pd_extrapath); pd_extrapath = namelist_append(0, p, 0); --- 128,132 ---- int sys_usestdpath = 1;
! void sys_setextrapath(const char *p) { namelist_free(pd_extrapath); pd_extrapath = namelist_append(0, p, 0); *************** *** 180,234 **** { int fd; ! if (strlen(dir) + strlen(name) + strlen(ext) + 4 > size) ! return (-1); strcpy(dirresult, dir); ! if (*dirresult && dirresult[strlen(dirresult)-1] != '/') ! strcat(dirresult, "/"); strcat(dirresult, name); strcat(dirresult, ext); sys_bashfilename(dirresult, dirresult); - DEBUG(post("looking for %s",dirresult)); ! /* see if we can open the file for reading */ ! if ((fd=open(dirresult,O_RDONLY | MSWOPENFLAG(bin))) >= 0) ! { ! /* in unix, further check that it's not a directory */ #ifdef UNISTD struct stat statbuf; ! int ok = ((fstat(fd, &statbuf) >= 0) && ! !S_ISDIR(statbuf.st_mode)); ! if (!ok) ! { ! if (sys_verbose) post("tried %s; stat failed or directory", ! dirresult); close (fd); fd = -1; ! } ! else #endif { - char *slash; if (sys_verbose) post("tried %s and succeeded", dirresult); sys_unbashfilename(dirresult, dirresult); ! slash = strrchr(dirresult, '/'); ! if (slash) ! { *slash = 0; *nameresult = slash + 1; ! } ! else *nameresult = dirresult; ! ! return (fd); } ! } ! else ! { if (sys_verbose) post("tried %s and failed", dirresult); } ! return (-1); }
! /* 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) --- 150,190 ---- { int fd; ! if (strlen(dir) + strlen(name) + strlen(ext) + 4 > size) return -1; strcpy(dirresult, dir); ! if (*dirresult && dirresult[strlen(dirresult)-1] != '/') strcat(dirresult, "/"); strcat(dirresult, name); strcat(dirresult, ext); sys_bashfilename(dirresult, dirresult); DEBUG(post("looking for %s",dirresult)); ! /* see if we can open the file for reading */ ! if ((fd=open(dirresult,O_RDONLY | MSWOPENFLAG(bin))) >= 0) { ! /* in unix, further check that it's not a directory */ #ifdef UNISTD struct stat statbuf; ! int ok = (fstat(fd, &statbuf) >= 0) && !S_ISDIR(statbuf.st_mode); ! if (!ok) { ! if (sys_verbose) post("tried %s; stat failed or directory", dirresult); close (fd); fd = -1; ! } else #endif { if (sys_verbose) post("tried %s and succeeded", dirresult); sys_unbashfilename(dirresult, dirresult); ! char *slash = strrchr(dirresult, '/'); ! if (slash) { *slash = 0; *nameresult = slash + 1; ! } else *nameresult = dirresult; ! return fd; } ! } else { if (sys_verbose) post("tried %s and failed", dirresult); } ! return -1; }
! /* 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) *************** *** 238,254 **** || (name[1] == ':' && name[2] == '/') #endif ! ) ! { char dirbuf[MAXPDSTRING]; ! int dirlen = (strrchr(name, '/') - 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); }
--- 194,206 ---- || (name[1] == ':' && name[2] == '/') #endif ! ) { char dirbuf[MAXPDSTRING]; ! int dirlen = strrchr(name, '/') - 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; }
*************** *** 270,306 **** t_namelist *nl; int fd = -1; ! ! /* first check if "name" is absolute (and if so, try to open) */ ! if (sys_open_absolute(name, ext, dirresult, nameresult, size, bin, &fd)) ! return (fd); ! ! /* otherwise "name" is relative; try the directory "dir" first. */ ! if ((fd = sys_trytoopenone(dir, name, ext, ! dirresult, nameresult, size, bin)) >= 0) ! return (fd); ! ! /* next go through the search path */ for (nl = searchpath; nl; nl = nl->nl_next) ! if ((fd = sys_trytoopenone(nl->nl_string, name, ext, ! dirresult, nameresult, size, bin)) >= 0) ! return (fd); ! ! /* next look in "extra" */ if (sys_usestdpath && ! (fd = sys_trytoopenone(pd_extrapath->nl_string, name, ext, ! dirresult, nameresult, size, bin)) >= 0) ! return (fd); ! *dirresult = 0; *nameresult = dirresult; ! return (-1); }
/* open via path, using the global search path. */ ! int open_via_path(const char *dir, const char *name, const char *ext, char *dirresult, char **nameresult, unsigned int size, int bin) { ! return (do_open_via_path(dir, name, ext, dirresult, nameresult, ! size, bin, sys_searchpath)); }
--- 222,247 ---- t_namelist *nl; int fd = -1; ! /* first check if "name" is absolute (and if so, try to open) */ ! if (sys_open_absolute(name, ext, dirresult, nameresult, size, bin, &fd)) return fd; ! /* otherwise "name" is relative; try the directory "dir" first. */ ! if ((fd = sys_trytoopenone(dir, name, ext, dirresult, nameresult, size, bin)) >= 0) return fd; ! /* next go through the search path */ for (nl = searchpath; nl; nl = nl->nl_next) ! if ((fd = sys_trytoopenone(nl->nl_string, name, ext, dirresult, nameresult, size, bin)) >= 0) return fd; ! /* next look in "extra" */ if (sys_usestdpath && ! (fd = sys_trytoopenone(pd_extrapath->nl_string, name, ext, dirresult, nameresult, size, bin)) >= 0) ! return fd; *dirresult = 0; *nameresult = dirresult; ! return -1; }
/* open via path, using the global search path. */ ! extern "C" int open_via_path(const char *dir, const char *name, const char *ext, char *dirresult, char **nameresult, unsigned int size, int bin) { ! return do_open_via_path(dir, name, ext, dirresult, nameresult, ! size, bin, sys_searchpath); }
*************** *** 308,344 **** suffix here, even though we have to tear it back off for one of the search attempts. */ ! void open_via_helppath(const char *name, const char *dir) ! { char realname[MAXPDSTRING], dirbuf[MAXPDSTRING], *basename; /* make up a silly "dir" if none is supplied */ - const char *usedir = (*dir ? dir : "./"); int fd; ! ! /* 1. "objectname-help.pd" */ strncpy(realname, name, MAXPDSTRING-10); realname[MAXPDSTRING-10] = 0; ! if (strlen(realname) > 3 && !strcmp(realname+strlen(realname)-3, ".pd")) ! realname[strlen(realname)-3] = 0; strcat(realname, "-help.pd"); ! if ((fd = do_open_via_path(dir, realname, "", dirbuf, &basename, ! MAXPDSTRING, 0, sys_helppath)) >= 0) goto gotone; ! ! /* 2. "help-objectname.pd" */ strcpy(realname, "help-"); strncat(realname, name, MAXPDSTRING-10); realname[MAXPDSTRING-1] = 0; ! if ((fd = do_open_via_path(dir, realname, "", dirbuf, &basename, ! MAXPDSTRING, 0, sys_helppath)) >= 0) goto gotone; ! ! /* 3. "objectname.pd" */ ! if ((fd = do_open_via_path(dir, name, "", dirbuf, &basename, ! MAXPDSTRING, 0, sys_helppath)) >= 0) goto gotone; post("sorry, couldn't find help patch for "%s"", name); return; gotone: ! close (fd); glob_evalfile(0, gensym((char*)basename), gensym(dirbuf)); } --- 249,276 ---- suffix here, even though we have to tear it back off for one of the search attempts. */ ! extern "C" void open_via_helppath(const char *name, const char *dir) { char realname[MAXPDSTRING], dirbuf[MAXPDSTRING], *basename; /* make up a silly "dir" if none is supplied */ int fd; ! /* 1. "objectname-help.pd" */ strncpy(realname, name, MAXPDSTRING-10); realname[MAXPDSTRING-10] = 0; ! if (strlen(realname) > 3 && !strcmp(realname+strlen(realname)-3, ".pd")) realname[strlen(realname)-3] = 0; strcat(realname, "-help.pd"); ! if ((fd = do_open_via_path(dir, realname, "", dirbuf, &basename, MAXPDSTRING, 0, sys_helppath)) >= 0) goto gotone; ! /* 2. "help-objectname.pd" */ strcpy(realname, "help-"); strncat(realname, name, MAXPDSTRING-10); realname[MAXPDSTRING-1] = 0; ! if ((fd = do_open_via_path(dir, realname, "", dirbuf, &basename, MAXPDSTRING, 0, sys_helppath)) >= 0) goto gotone; ! /* 3. "objectname.pd" */ ! if ((fd = do_open_via_path(dir, name, "", dirbuf, &basename, MAXPDSTRING, 0, sys_helppath)) >= 0) goto gotone; post("sorry, couldn't find help patch for "%s"", name); return; gotone: ! close(fd); glob_evalfile(0, gensym((char*)basename), gensym(dirbuf)); } *************** *** 347,507 **** deprecated in favor of the "settings" mechanism */
! int sys_argparse(int argc, char **argv);
#define NUMARGS 1000
! int sys_parsercfile(char*filename) ! { ! FILE* file; int i; - int k; int rcargc; char* rcargv[NUMARGS]; ! char* buffer; ! char buf[1000]; ! char c[MAXPDSTRING]; ! int retval = 1; /* that's what we will return at the end; for now, let's think it'll be an error */ ! ! /* initialize rc-arg-array so we can safely clean up at the end */ ! for (i = 1; i < NUMARGS-1; i++) ! rcargv[i]=0; ! ! /* parse a startup file */ ! ! if (!(file = fopen(filename, "r"))) ! return 1; ! post("reading startup file: %s", filename); - rcargv[0] = "."; /* this no longer matters to sys_argparse() */ ! ! /* tb: comments in pdrc file { */ ! i=1; ! while ( (fgets(c,MAXPDSTRING,file)) != 0) ! { ! if ( c[strlen(c)-1] !='\n') ! { ! //it is unlikely that this is ever the case ! fprintf(stderr, "startup file contains a line that's too long\n"); ! while ( fgetc(file) != '\n'); ! } ! ! if (c[0] != '#') ! { ! long n; ! while (sscanf(c,"%999s%ln",buf,&n) != EOF) ! { ! buf[999] = 0; ! if (!(rcargv[i] = (char *)malloc(strlen(buf) + 1))) ! goto cleanup; ! strcpy(rcargv[i], buf); ! strcpy(buf,c+n); ! strcpy(c,buf); ! ++i; ! } } } ! /* } tb */ ! if (i >= NUMARGS-1) ! fprintf(stderr, "startup file too long; extra args dropped\n"); rcargv[i] = 0; - rcargc = i; - /* parse the options */ - fclose(file); ! if (sys_verbose) ! { ! if (rcargv) ! { post("startup args from RC file:"); ! for (i = 1; i < rcargc; i++) ! post("%s", rcargv[i]); ! } ! else post("no RC file arguments found"); } ! if (sys_argparse(rcargc-1, rcargv+1)) ! { post("error parsing RC arguments"); ! goto cleanup; } ! retval=0; /* we made it without an error */ ! ! cleanup: /* prevent memleak */ ! for (i = 1; i < NUMARGS-1; i++) ! if(rcargv[i])free(rcargv[i]); ! ! return(retval); }
- #ifndef MSW - #define STARTUPNAME ".pdrc" ! ! int sys_rcfile(void) ! { ! char fname[MAXPDSTRING], *home = getenv("HOME"); ! ! // parse a startup file */ ! *fname = '\0'; ! ! strncat(fname, home? home : ".", MAXPDSTRING-10); ! strcat(fname, "/"); ! ! strcat(fname, STARTUPNAME); ! ! return sys_parsercfile(fname); } - - #endif /* MSW */
! void sys_doflags( void) ! { ! int i, beginstring = 0, state = 0, len = strlen(sys_flags->s_name); int rcargc = 0; char *rcargv[MAXPDSTRING]; ! ! if (len > MAXPDSTRING) ! { post("flags: %s: too long", sys_flags->s_name); return; } ! for (i = 0; i < len+1; i++) ! { int c = sys_flags->s_name[i]; ! if (state == 0) ! { ! if (c && !isspace(c)) ! { beginstring = i; state = 1; } ! } ! else ! { ! if (!c || isspace(c)) ! { char *foo = (char *)malloc(i - beginstring + 1); ! if (!foo) ! return; strncpy(foo, sys_flags->s_name + beginstring, i - beginstring); foo[i - beginstring] = 0; rcargv[rcargc] = foo; rcargc++; ! if (rcargc >= MAXPDSTRING) ! break; state = 0; } } } ! if (sys_argparse(rcargc, rcargv)) ! post("error parsing startup arguments"); }
! void glob_update_path (void) { t_namelist *nl; sys_vgui("global pd_path; set pd_path {"); --- 279,387 ---- deprecated in favor of the "settings" mechanism */
! extern "C" int sys_argparse(int argc, char **argv);
#define NUMARGS 1000
! extern "C" int sys_parsercfile(char*filename) { int i; int rcargc; char* rcargv[NUMARGS]; ! char buf[1000]; ! char c[MAXPDSTRING]; ! int retval = 1; /* that's what we will return at the end; for now, let's think it'll be an error */ ! /* initialize rc-arg-array so we can safely clean up at the end */ ! for (i = 1; i < NUMARGS-1; i++) rcargv[i]=0; /* parse a startup file */ ! FILE* file = fopen(filename, "r"); ! if (!file) return 1; post("reading startup file: %s", filename); rcargv[0] = "."; /* this no longer matters to sys_argparse() */ ! /* tb: comments in pdrc file { */ ! i=1; ! while ((fgets(c,MAXPDSTRING,file)) != 0) { ! if ( c[strlen(c)-1] !='\n') { ! //it is unlikely that this is ever the case ! fprintf(stderr, "startup file contains a line that's too long\n"); ! while(fgetc(file) != '\n') {} ! } ! if (c[0] != '#') { ! long n; ! while (sscanf(c,"%999s%ln",buf,&n) != EOF) { ! buf[999] = 0; ! if (!(rcargv[i] = (char *)malloc(strlen(buf) + 1))) goto cleanup; ! strcpy(rcargv[i], buf); ! strcpy(buf,c+n); ! strcpy(c,buf); ! ++i; } + } } ! /* } tb */ ! if (i >= NUMARGS-1) fprintf(stderr, "startup file too long; extra args dropped\n"); rcargv[i] = 0; rcargc = i; /* parse the options */ fclose(file); ! if (sys_verbose) { ! if (rcargv) { post("startup args from RC file:"); ! for (i = 1; i < rcargc; i++) post("%s", rcargv[i]); ! } else post("no RC file arguments found"); } ! if (sys_argparse(rcargc-1, rcargv+1)) { post("error parsing RC arguments"); ! goto cleanup; } ! retval=0; /* we made it without an error */ ! cleanup: /* prevent memleak */ ! for (i=1; i<NUMARGS-1; i++) if (rcargv[i]) free(rcargv[i]); ! return retval; }
#ifndef MSW #define STARTUPNAME ".pdrc" ! extern "C" int sys_rcfile(void) { ! char fname[MAXPDSTRING], *home = getenv("HOME"); ! // parse a startup file */ ! *fname = '\0'; ! strncat(fname, home? home : ".", MAXPDSTRING-10); ! strcat(fname, "/"); ! strcat(fname, STARTUPNAME); ! return sys_parsercfile(fname); } #endif /* MSW */
! void sys_doflags(void) { ! int beginstring = 0, state = 0, len = strlen(sys_flags->s_name); int rcargc = 0; char *rcargv[MAXPDSTRING]; ! if (len > MAXPDSTRING) { post("flags: %s: too long", sys_flags->s_name); return; } ! for (int i=0; i<len+1; i++) { int c = sys_flags->s_name[i]; ! if (state == 0) { ! if (c && !isspace(c)) { beginstring = i; state = 1; } ! } else { ! if (!c || isspace(c)) { char *foo = (char *)malloc(i - beginstring + 1); ! if (!foo) return; strncpy(foo, sys_flags->s_name + beginstring, i - beginstring); foo[i - beginstring] = 0; rcargv[rcargc] = foo; rcargc++; ! if (rcargc >= MAXPDSTRING) break; state = 0; } } } ! if (sys_argparse(rcargc, rcargv)) post("error parsing startup arguments"); }
! extern "C" void glob_update_path (void) { t_namelist *nl; sys_vgui("global pd_path; set pd_path {");