Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29662
Modified Files: Tag: devel_0_39 m_binbuf.c Log Message: integrated Iohannes' multi-dollarg patch #1405137
Index: m_binbuf.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/m_binbuf.c,v retrieving revision 1.4.4.1.2.5 retrieving revision 1.4.4.1.2.6 diff -C2 -d -r1.4.4.1.2.5 -r1.4.4.1.2.6 *** m_binbuf.c 13 Jun 2006 07:45:33 -0000 1.4.4.1.2.5 --- m_binbuf.c 29 Jun 2006 13:02:34 -0000 1.4.4.1.2.6 *************** *** 437,460 **** int canvas_getdollarzero( void);
/* LATER remove the dependence on the current canvas for $0; should be another argument. */ t_symbol *binbuf_realizedollsym(t_symbol *s, int ac, t_atom *av, int tonew) { ! int argno = atol(s->s_name), lastnum; ! char buf[MAXPDSTRING], c, *sp; ! for (lastnum = 0, sp = s->s_name; ((c = *sp) && c >= '0' && c <= '9'); ! sp++, lastnum++) ! if (!c || argno < 0 || argno > ac) ! { ! if (!tonew) ! return (0); ! else sprintf(buf, "$%d", argno); } ! else if (argno == 0) ! sprintf(buf, "%d", canvas_getdollarzero()); ! else ! atom_string(av+(argno-1), buf, MAXPDSTRING/2-1); ! strncat(buf, sp, MAXPDSTRING/2-1); ! return (gensym(buf)); }
--- 437,541 ---- int canvas_getdollarzero( void);
+ /* JMZ: + * s points to the first character after the $ + * (e.g. if the org.symbol is "$1-bla", then s will point to "1-bla") + * (e.g. org.symbol="hu-$1mu", s="1mu") + * LATER: think about more complex $args, like ${$1+3} + * + * the return value holds the length of the $arg (in most cases: 1) + * buf holds the expanded $arg + * + * if some error occured, "-1" is returned + * + * e.g. "$1-bla" with list "10 20 30" + * s="1-bla" + * buf="10" + * return value = 1; (s+1=="-bla") + */ + int binbuf_expanddollsym(char*s, char*buf,t_atom dollar0, int ac, t_atom *av, int tonew) + { + int argno=atol(s); + int arglen=0; + char*cs=s; + char c=*cs; + *buf=0; + + while(c&&(c>='0')&&(c<='9')){ + c=*cs++; + arglen++; + } + + if (cs==s) { /* invalid $-expansion (like "$bla") */ + sprintf(buf, "$"); + return 0; + } + else if (argno < 0 || argno > ac) /* undefined argument */ + { + if(!tonew)return 0; + sprintf(buf, "$%d", argno); + } + else if (argno == 0){ /* $0 */ + atom_string(&dollar0, buf, MAXPDSTRING/2-1); + } + else{ /* fine! */ + atom_string(av+(argno-1), buf, MAXPDSTRING/2-1); + } + return (arglen-1); + } + /* LATER remove the dependence on the current canvas for $0; should be another argument. */ t_symbol *binbuf_realizedollsym(t_symbol *s, int ac, t_atom *av, int tonew) { ! char buf[MAXPDSTRING]; ! char buf2[MAXPDSTRING]; ! char*str=s->s_name; ! char*substr; ! int next=0, i=MAXPDSTRING; ! t_atom dollarnull; ! SETFLOAT(&dollarnull, canvas_getdollarzero()); ! while(i--)buf2[i]=0; ! ! #if 0 ! /* JMZ: currently, a symbol is detected to be A_DOLLSYM if it starts with '$' ! * the leading $ is stripped and the rest stored in "s" ! * i would suggest to NOT strip the leading $ ! * and make everything a A_DOLLSYM that contains(!) a $ ! * ! * whenever this happened, enable this code ! */ ! substr=strchr(str, '$'); ! if(substr){ ! strncat(buf2, str, (substr-str)); ! str=substr+1; } ! #endif ! ! while((next=binbuf_expanddollsym(str, buf, dollarnull, ac, av, tonew))>=0) ! { ! /* ! * JMZ: i am not sure what this means, so i might have broken it ! * it seems like that if "tonew" is set and the $arg cannot be expanded (or the dollarsym is in reality a A_DOLLAR) ! * 0 is returned from binbuf_realizedollsym ! * this happens, when expanding in a message-box, but does not happen when the A_DOLLSYM is the name of a subpatch ! */ ! if(!tonew&&(0==next)&&(0==*buf)){ ! return 0; /* JMZ: this should mimick the original behaviour */ ! } ! ! strncat(buf2, buf, MAXPDSTRING/2-1); ! str+=next; ! substr=strchr(str, '$'); ! if(substr){ ! strncat(buf2, str, (substr-str)); ! str=substr+1; ! } else { ! strcat(buf2, str); ! ! return gensym(buf2); ! } ! } ! ! return (gensym(buf2)); }