From 09caaa0fed198a2b62fc154f04c66dd7c7369ce8 Mon Sep 17 00:00:00 2001 From: Thomas Grill Date: Wed, 17 Dec 2003 03:37:55 +0000 Subject: "" svn path=/trunk/; revision=1225 --- externals/grill/pool/data.cpp | 3 +- externals/grill/pool/main.cpp | 18 +++-- externals/grill/pool/pool-0.2.dtd | 5 ++ externals/grill/pool/pool.cpp | 138 +++++++++++++++++++++++++++----------- externals/grill/pool/pool.dtd | 5 -- externals/grill/pool/pool.pd | 70 ++++++++++--------- externals/grill/pool/pool.vcproj | 3 - externals/grill/pool/readme.txt | 4 +- 8 files changed, 161 insertions(+), 85 deletions(-) create mode 100644 externals/grill/pool/pool-0.2.dtd delete mode 100644 externals/grill/pool/pool.dtd (limited to 'externals/grill/pool') diff --git a/externals/grill/pool/data.cpp b/externals/grill/pool/data.cpp index 26b5464b..9eda196b 100644 --- a/externals/grill/pool/data.cpp +++ b/externals/grill/pool/data.cpp @@ -279,8 +279,7 @@ BL pooldata::SvDirXML(const AtomList &d,const C *flnm,I depth,BL absdir) if(absdir) tmp = d; if(fl.good()) { fl << "" << endl; -// fl << "" << endl; - fl << "" << endl; + fl << "" << endl; fl << "" << endl; BL ret = pd->SvDirXML(fl,depth,tmp); fl << "" << endl; diff --git a/externals/grill/pool/main.cpp b/externals/grill/pool/main.cpp index f9b6993c..5f75f07d 100644 --- a/externals/grill/pool/main.cpp +++ b/externals/grill/pool/main.cpp @@ -43,12 +43,14 @@ protected: // handle directories V m_getdir(); - V m_mkdir(I argc,const A *argv,BL abs = true); // make and change to dir + V m_mkdir(I argc,const A *argv,BL abs = true,BL chg = false); // make (and change) to dir + V m_mkchdir(I argc,const A *argv) { m_mkdir(argc,argv,true,true); } // make and change to dir V m_chdir(I argc,const A *argv,BL abs = true); // change to dir V m_rmdir(I argc,const A *argv,BL abs = true); // remove dir V m_updir(I argc,const A *argv); // one or more levels up V m_mksub(I argc,const A *argv) { m_mkdir(argc,argv,false); } + V m_mkchsub(I argc,const A *argv) { m_mkdir(argc,argv,false,true); } V m_chsub(I argc,const A *argv) { m_chdir(argc,argv,false); } V m_rmsub(I argc,const A *argv) { m_rmdir(argc,argv,false); } @@ -162,10 +164,12 @@ private: FLEXT_CALLBACK(m_getdir) FLEXT_CALLBACK_V(m_mkdir) FLEXT_CALLBACK_V(m_chdir) + FLEXT_CALLBACK_V(m_mkchdir) FLEXT_CALLBACK_V(m_updir) FLEXT_CALLBACK_V(m_rmdir) FLEXT_CALLBACK_V(m_mksub) FLEXT_CALLBACK_V(m_chsub) + FLEXT_CALLBACK_V(m_mkchsub) FLEXT_CALLBACK_V(m_rmsub) FLEXT_CALLBACK_V(m_set) @@ -240,10 +244,12 @@ V pool::setup(t_classid c) FLEXT_CADDMETHOD_(c,0,"getdir",m_getdir); FLEXT_CADDMETHOD_(c,0,"mkdir",m_mkdir); FLEXT_CADDMETHOD_(c,0,"chdir",m_chdir); + FLEXT_CADDMETHOD_(c,0,"mkchdir",m_mkchdir); FLEXT_CADDMETHOD_(c,0,"rmdir",m_rmdir); FLEXT_CADDMETHOD_(c,0,"updir",m_updir); FLEXT_CADDMETHOD_(c,0,"mksub",m_mksub); FLEXT_CADDMETHOD_(c,0,"chsub",m_chsub); + FLEXT_CADDMETHOD_(c,0,"mkchsub",m_mkchsub); FLEXT_CADDMETHOD_(c,0,"rmsub",m_rmsub); FLEXT_CADDMETHOD_(c,0,"set",m_set); @@ -380,17 +386,21 @@ V pool::getdir(const S *tag) V pool::m_getdir() { getdir(MakeSymbol("getdir")); } -V pool::m_mkdir(I argc,const A *argv,BL abs) +V pool::m_mkdir(I argc,const A *argv,BL abs,BL chg) { + const char *nm = chg?"mkchdir":"mkdir"; if(!ValChk(argc,argv)) - post("%s - mkdir: invalid directory name",thisName()); + post("%s - %s: invalid directory name",thisName(),nm); else { AtomList ndir; if(abs) ndir(argc,argv); else (ndir = curdir).Append(argc,argv); if(!pl->MkDir(ndir,vcnt,dcnt)) { - post("%s - mkdir: directory couldn't be created",thisName()); + post("%s - %s: directory couldn't be created",thisName(),nm); } + else if(chg) + // change to newly created directory + curdir = ndir; } echodir(); diff --git a/externals/grill/pool/pool-0.2.dtd b/externals/grill/pool/pool-0.2.dtd new file mode 100644 index 00000000..57a48498 --- /dev/null +++ b/externals/grill/pool/pool-0.2.dtd @@ -0,0 +1,5 @@ + + + + + diff --git a/externals/grill/pool/pool.cpp b/externals/grill/pool/pool.cpp index 1be84ec2..76a61cc0 100644 --- a/externals/grill/pool/pool.cpp +++ b/externals/grill/pool/pool.cpp @@ -537,9 +537,10 @@ BL pooldir::LdDir(istream &is,I depth,BL mkdir) { for(I i = 1; !is.eof(); ++i) { AtomList d,k,*v = new AtomList; - BL r = ReadAtoms(is,d,','); - r = r && ReadAtoms(is,k,',') && k.Count() == 1; - r = r && ReadAtoms(is,*v,'\n') && v->Count(); + BL r = + ReadAtoms(is,d,',') && + ReadAtoms(is,k,',') && k.Count() == 1 && + ReadAtoms(is,*v,'\n'); if(r) { if(depth < 0 || d.Count() <= depth) { @@ -593,40 +594,86 @@ public: enum { t_start,t_end,t_empty } type; }; -static bool gettag(istream &is,xmltag &t) +static bool gettag(istream &is,xmltag &tag) { - while(isspace(is.peek())) is.get(); - if(is.peek() == '<') { - is.get(); - char tmp[256]; - is.getline(tmp,sizeof tmp,'>'); - char *tb = tmp,*te = tmp+strlen(tmp)-1,*tf; + static const char *commstt = ""; - for(; isspace(*tb); ++tb); - if(*tb == '/') { - t.type = xmltag::t_end; - for(++tb; isspace(*tb); ++tb); + for(;;) { + // eat whitespace + while(isspace(is.peek())) is.get(); + + // no tag begin -> break + if(is.peek() != '<') break; + is.get(); // swallow < + + char tmp[1024],*t = tmp; + + // parse for comment start + const char *c = commstt; + while(*++c) { + if(*c != is.peek()) break; + *(t++) = is.get(); } - else { - for(; isspace(*te); --te); - if(*te == '/') { - for(--te; isspace(*te); --te); - t.type = xmltag::t_empty; + + if(!*c) { // is comment + char cmp[2] = {0,0}; + for(int ic = 0; ; ic = (++ic)%2) { + char c = is.get(); + if(c == '>') { + for(int i = 0; i < 2 && cmp[(ic+i)%2] == commend[i]; ++i); + if(i == 2) break; // comment end! + } + else + cmp[ic] = c; } - else - t.type = xmltag::t_start; } + else { + // parse until > with consideration of "s + bool intx = false; + for(;;) { + *t = is.get(); + if(*t == '"') intx = !intx; + else if(*t == '>' && !intx) { + *t = 0; + break; + } + t++; + } - for(tf = tb; tf <= te && *tf && !isspace(*tf); ++tf); - t.tag.assign(tb,tf-tb); - while(isspace(*tf)) ++tf; - t.attr.assign(tf,te-tf+1); - return true; - } - else { - t.Clear(); - return false; + // look for tag slashes + + char *tb = tmp,*te = t-1,*tf; + + for(; isspace(*tb); ++tb); + if(*tb == '/') { + // slash at the beginning -> end tag + tag.type = xmltag::t_end; + for(++tb; isspace(*tb); ++tb); + } + else { + for(; isspace(*te); --te); + if(*te == '/') { + // slash at the end -> empty tag + for(--te; isspace(*te); --te); + tag.type = xmltag::t_empty; + } + else + // no slash -> begin tag + tag.type = xmltag::t_start; + } + + // copy tag text without slashes + for(tf = tb; tf <= te && *tf && !isspace(*tf); ++tf); + tag.tag.assign(tb,tf-tb); + while(isspace(*tf)) ++tf; + tag.attr.assign(tf,te-tf+1); + + return true; + } } + + tag.Clear(); + return false; } static void getvalue(istream &is,string &s) @@ -647,6 +694,8 @@ BL pooldir::LdDirXML(istream &is,I depth,BL mkdir) { AtomList d,k,v; bool inpool = false,inval = false,inkey = false,indata = false; + const t_symbol *empty = MakeSymbol(""); + while(!is.eof()) { xmltag tag; gettag(is,tag); @@ -697,8 +746,12 @@ BL pooldir::LdDirXML(istream &is,I depth,BL mkdir) else if(inpool) { if(tag == "dir") { if(tag.type == xmltag::t_start) { + // warn if last directory key was not given + if(d.Count() && GetSymbol(d[d.Count()-1]) == empty) + post("pool - XML load: dir key must be given prior to subdirs, ignoring items"); + // initialize dir key as empty - t_atom at; SetString(at,""); + t_atom at; SetSymbol(at,empty); d.Append(at); } else if(tag.type == xmltag::t_end) { @@ -716,14 +769,23 @@ BL pooldir::LdDirXML(istream &is,I depth,BL mkdir) else if(tag.type == xmltag::t_end) { if(depth < 0 || d.Count() <= depth) { // NOW set value - const char *ds = d.Count()?GetString(d[d.Count()-1]):NULL; - if(!ds || !*ds) - post("pool - XML load: dir key must be given prior to dir values"); + + int fnd; + for(fnd = d.Count()-1; fnd >= 0; --fnd) + if(GetSymbol(d[fnd]) == empty) break; + + // look if last dir key has been given + if(fnd >= 0) { + if(fnd == d.Count()-1) + post("pool - XML load: dir key must be given prior to values"); + + // else: one directoy level has been left unintialized, ignore items + } else { - pooldir *nd = mkdir?AddDir(d):GetDir(d); - if(nd) { - // only use first word of key - if(k.Count() == 1) + // only use first word of key + if(k.Count() == 1) { + pooldir *nd = mkdir?AddDir(d):GetDir(d); + if(nd) nd->SetVal(k[0],new AtomList(v)); else post("pool - XML load: value key must be exactly one word, value not stored"); diff --git a/externals/grill/pool/pool.dtd b/externals/grill/pool/pool.dtd deleted file mode 100644 index 57a48498..00000000 --- a/externals/grill/pool/pool.dtd +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/externals/grill/pool/pool.pd b/externals/grill/pool/pool.pd index 2c1c75d5..8af2223e 100644 --- a/externals/grill/pool/pool.pd +++ b/externals/grill/pool/pool.pd @@ -1,4 +1,4 @@ -#N canvas 12 3 946 702 12; +#N canvas 12 3 948 704 12; #X msg 296 105 set 1 2 3; #X obj 308 619 print K; #X msg 607 211 getall; @@ -54,34 +54,38 @@ #X text 677 364 ... and subdirs; #X text 673 378 (depth may be given); #X text 295 258 set but don't replace; -#N canvas 0 0 520 546 dirs 0; -#X msg 109 27 mkdir fld1; -#X msg 111 122 chdir; -#X msg 110 217 updir; -#X msg 111 354 getsub -1; -#X text 110 7 make absolute dir; -#X text 109 51 make relative dir; -#X msg 110 72 mksub fld2; -#X text 109 104 change to absolute dir; -#X msg 110 165 chsub fld2; -#X text 108 146 change to relative dir; -#X text 106 198 change to upper dir; -#X text 107 250 remove absolute dir; -#X msg 108 269 rmdir fld1; -#X msg 110 308 rmsub fld2; -#X text 109 289 remove relative dir; -#X text 109 336 get subdirs; -#X text 251 380 -1 ... infinite; -#X text 167 213 depth may be given; -#X text 168 229 default=1; -#X text 209 349 depth may be given; -#X text 207 365 default=1; -#X text 108 377 count subdirs; -#X msg 111 398 cntsub -1; -#X msg 111 458 getdir; -#X text 110 438 get current dir; -#X text 176 458 always absolute; -#X obj 11 239 s \$0-pool; +#N canvas 472 45 416 627 dirs 0; +#X msg 111 40 mkdir fld1; +#X msg 113 135 chdir; +#X msg 109 331 updir; +#X msg 110 468 getsub -1; +#X text 112 20 make absolute dir; +#X text 111 64 make relative dir; +#X msg 112 85 mksub fld2; +#X text 111 117 change to absolute dir; +#X msg 112 178 chsub fld2; +#X text 110 159 change to relative dir; +#X text 105 312 change to upper dir; +#X text 106 364 remove absolute dir; +#X msg 107 383 rmdir fld1; +#X msg 109 422 rmsub fld2; +#X text 108 403 remove relative dir; +#X text 108 450 get subdirs; +#X text 250 494 -1 ... infinite; +#X text 166 327 depth may be given; +#X text 167 343 default=1; +#X text 208 463 depth may be given; +#X text 206 479 default=1; +#X text 107 491 count subdirs; +#X msg 110 512 cntsub -1; +#X msg 110 572 getdir; +#X text 109 552 get current dir; +#X text 175 572 always absolute; +#X obj 13 252 s \$0-pool; +#X msg 111 231 mkchdir fld1; +#X text 112 211 make and change to absolute dir; +#X msg 109 276 mkchsub fld2; +#X text 110 256 make and change to relative dir; #X connect 0 0 26 0; #X connect 1 0 26 0; #X connect 2 0 26 0; @@ -92,6 +96,8 @@ #X connect 13 0 26 0; #X connect 22 0 26 0; #X connect 23 0 26 0; +#X connect 27 0 26 0; +#X connect 29 0 26 0; #X restore 716 496 pd dirs; #X text 713 470 directory operations; #N canvas 0 0 829 461 file 0; @@ -187,8 +193,8 @@ the folder containing the current patcher will be used.; #X obj 298 389 r \$0-pool; #X text 174 517 data is shared among pool objects with the same name ; -#X obj 26 10 cnv 15 850 40 empty empty pool 10 22 0 24 -260818 -1 0 -; +#X obj 26 10 cnv 15 850 40 empty empty empty 10 22 0 24 -260818 -1 +0; #X text 272 33 http://www.parasitaere-kapazitaeten.net; #X obj 456 541 print A; #X text 521 541 attributes; @@ -207,7 +213,7 @@ Grill; #X msg 41 518 getmethods; #X text 328 466 (see attributes in properties dialog); #X text 715 638 console printout; -#N canvas 0 0 553 284 print 0; +#N canvas 0 0 559 290 print 0; #X obj 21 231 s \$0-pool; #X msg 109 80 printall; #X msg 109 132 printrec; diff --git a/externals/grill/pool/pool.vcproj b/externals/grill/pool/pool.vcproj index 6370595d..7e0e6999 100644 --- a/externals/grill/pool/pool.vcproj +++ b/externals/grill/pool/pool.vcproj @@ -394,9 +394,6 @@ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_MBCS;_USRDLL;FLEXT_SYS=1"/> - - diff --git a/externals/grill/pool/readme.txt b/externals/grill/pool/readme.txt index 98671bdf..62a14e0c 100644 --- a/externals/grill/pool/readme.txt +++ b/externals/grill/pool/readme.txt @@ -65,6 +65,7 @@ Version history: - fixed bug with stored numbers starting with - or + - relative file names will be based on the folder of the current patcher - added printall, printrec, printroot messages for console printout +- added mkchdir, mkchsub to create and change to directories at once 0.1.0: - first public release @@ -72,10 +73,11 @@ Version history: --------------------------------------------------------------------------- BUGS: -- pool does not handle symbols with spaces or all digits +- pool does not handle symbols with spaces, colons or all digits TODO list: +- check for invalid symbols (spaces, colons) general: - what is output as value if it is key only? (Max->nothing!) -- cgit v1.2.1