Update of /cvsroot/pure-data/externals/grill/pool/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14880/source
Modified Files: pool.cpp Log Message: enhanced and optimized atom parsing roll back to working version conform to ISO C++
Index: pool.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/pool/source/pool.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** pool.cpp 9 Nov 2004 03:33:19 -0000 1.10 --- pool.cpp 18 Nov 2004 03:32:31 -0000 1.11 *************** *** 476,507 **** const C *m = c; // remember position
! // check for word type (s = 0,1,2 ... int,float,symbol) ! I s = 0; ! for(; *c && !isspace(*c); ++c) { ! if(!isdigit(*c)) ! if(!s && (*c == '-' || *c == '+')) {} // minus or plus is ok ! else ! s = (*c != '.' || s == 1)?2:1; ! }
! if(a) { ! switch(s) { ! case 0: // integer ! #if FLEXT_SYS == FLEXT_SYS_MAX ! flext::SetInt(*a,atoi(m)); ! break; ! #endif ! case 1: // float ! flext::SetFloat(*a,(F)atof(m)); ! break; ! default: { // anything else is a symbol ! C t = *c; *c = 0; ! flext::SetString(*a,m); ! *c = t; ! break; ! } ! } ! }
return c; } --- 476,504 ---- const C *m = c; // remember position
! // go to next whitespace ! // \todo recognize symbol escapes ! for(; *c && !isspace(*c); ++c) {}
! // save character and set delimiter ! char t = *c; *c = 0;
+ float fres; + // first try float + if(sscanf(m,"%f",&fres)) { + if(a) { + int ires = (int)fres; // try a cast + if(fres == ires) + flext::SetInt(*a,ires); + else + flext::SetFloat(*a,fres); + } + } + // no, it's a symbol + else { + if(a) flext::SetString(*a,m); + } + + // set back the saved character + *c = t; return c; } *************** *** 509,524 **** static BL ParseAtoms(C *tmp,flext::AtomList &l) { ! I i,cnt; ! C *t = tmp; ! for(cnt = 0; ; ++cnt) { ! t = ReadAtom(t,NULL); ! if(!t) break; ! } ! ! l(cnt); ! if(cnt) { ! for(i = 0,t = tmp; i < cnt; ++i) ! t = ReadAtom(t,&l[i]); ! } return true; } --- 506,517 ---- static BL ParseAtoms(C *tmp,flext::AtomList &l) { ! const int MAXATOMS = 1024; ! int cnt = 0; ! t_atom atoms[MAXATOMS]; ! for(char *t = tmp; *t && cnt < MAXATOMS; ++cnt) { ! t = ReadAtom(t,&atoms[cnt]); ! if(!t) break; ! } ! l(cnt,atoms); return true; }