[PD-cvs] pd/src makefile.in, 1.4.4.2.2.21.2.22, 1.4.4.2.2.21.2.23 s_path.c, 1.3.4.6.2.8.2.6, 1.3.4.6.2.8.2.7

Mathieu Bouchard matju at users.sourceforge.net
Tue Jan 16 01:27:20 CET 2007


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 {");





More information about the Pd-cvs mailing list