From 5e37af09e119b1f6a1b0548731d885c8131af1a4 Mon Sep 17 00:00:00 2001 From: Thomas Grill Date: Sat, 6 Dec 2003 03:38:13 +0000 Subject: "" svn path=/trunk/; revision=1206 --- externals/grill/pool/data.cpp | 16 ++- externals/grill/pool/main.cpp | 124 ++++++++++++++----- externals/grill/pool/pool.cpp | 258 ++++++++++++++++++++++++++++++++++------ externals/grill/pool/pool.dtd | 10 +- externals/grill/pool/pool.h | 4 +- externals/grill/pool/pool.pd | 92 ++++++++------ externals/grill/pool/readme.txt | 5 +- 7 files changed, 389 insertions(+), 120 deletions(-) diff --git a/externals/grill/pool/data.cpp b/externals/grill/pool/data.cpp index d99d83c2..26b5464b 100644 --- a/externals/grill/pool/data.cpp +++ b/externals/grill/pool/data.cpp @@ -119,6 +119,15 @@ I pooldata::GetAll(const AtomList &d,A *&keys,AtomList *&lst) } } +I pooldata::PrintAll(const AtomList &d) +{ + char tmp[1024]; + d.Print(tmp,sizeof tmp); + pooldir *pd = root.GetDir(d); + strcat(tmp," , "); + return pd?pd->PrintAll(tmp,sizeof tmp):0; +} + I pooldata::CntSub(const AtomList &d) { pooldir *pd = root.GetDir(d); @@ -242,13 +251,13 @@ BL pooldata::LdDirXML(const AtomList &d,const C *flnm,I depth,BL mkdir) fl.getline(tmp,sizeof tmp); ret = !strncmp(tmp,"",6); + ret = !strncmp(tmp,"LdDirXML(fl,depth,mkdir); return ret; @@ -270,6 +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; BL ret = pd->SvDirXML(fl,depth,tmp); diff --git a/externals/grill/pool/main.cpp b/externals/grill/pool/main.cpp index 0cf73ccd..dd2567b5 100644 --- a/externals/grill/pool/main.cpp +++ b/externals/grill/pool/main.cpp @@ -71,6 +71,11 @@ protected: V m_cntrec(I argc,const A *argv); // also subdirectories V m_cntsub(I argc,const A *argv); // only subdirectories + // print directories + V m_printall(); // print values in current dir + V m_printrec(I argc,const A *argv,BL fromroot = false); // print values recursively + V m_printroot() { m_printrec(0,NULL,true); } // print values recursively from root + // cut/copy/paste V m_paste(I argc,const A *argv) { paste(MakeSymbol("paste"),argc,argv,true); } // paste contents of clipboard V m_pasteadd(I argc,const A *argv) { paste(MakeSymbol("pasteadd"),argc,argv,false); } // paste but don't replace @@ -106,10 +111,12 @@ private: static BL ValChk(const AtomList &l) { return ValChk(l.Count(),l.Atoms()); } V ToOutAtom(I ix,const A &a); + enum get_t { get_norm,get_cnt,get_print }; + V set(const S *tag,I argc,const A *argv,BL over); V getdir(const S *tag); - I getrec(const S *tag,I level,BL order,BL cntonly = false,const AtomList &rdir = AtomList()); - I getsub(const S *tag,I level,BL order,BL cntonly = false,const AtomList &rdir = AtomList()); + I getrec(const S *tag,I level,BL order,get_t how = get_norm,const AtomList &rdir = AtomList()); + I getsub(const S *tag,I level,BL order,get_t how = get_norm,const AtomList &rdir = AtomList()); V paste(const S *tag,I argc,const A *argv,BL repl); V copy(const S *tag,I argc,const A *argv,BL cut); @@ -178,6 +185,9 @@ private: FLEXT_CALLBACK(m_cntall) FLEXT_CALLBACK_V(m_cntrec) FLEXT_CALLBACK_V(m_cntsub) + FLEXT_CALLBACK(m_printall) + FLEXT_CALLBACK_V(m_printrec) + FLEXT_CALLBACK(m_printroot) FLEXT_CALLBACK_V(m_paste) FLEXT_CALLBACK_V(m_pasteadd) @@ -253,6 +263,10 @@ V pool::setup(t_classid c) FLEXT_CADDMETHOD_(c,0,"cntrec",m_cntrec); FLEXT_CADDMETHOD_(c,0,"cntsub",m_cntsub); + FLEXT_CADDMETHOD_(c,0,"printall",m_printall); + FLEXT_CADDMETHOD_(c,0,"printrec",m_printrec); + FLEXT_CADDMETHOD_(c,0,"printroot",m_printroot); + FLEXT_CADDMETHOD_(c,0,"paste",m_paste); FLEXT_CADDMETHOD_(c,0,"pasteadd",m_pasteadd); FLEXT_CADDMETHOD_(c,0,"clrclip",m_clrclip); @@ -284,7 +298,7 @@ pool::pool(I argc,const A *argv): { holdname = argc >= 1 && IsSymbol(argv[0])?GetSymbol(argv[0]):NULL; - AddInAnything(); + AddInAnything("Commands in"); AddOutList(); AddOutAnything(); AddOutList(); @@ -549,32 +563,38 @@ V pool::m_geti(I ix) echodir(); } -I pool::getrec(const S *tag,I level,BL order,BL cntonly,const AtomList &rdir) +I pool::getrec(const S *tag,I level,BL order,get_t how,const AtomList &rdir) { AtomList gldir(curdir); gldir.Append(rdir); I ret = 0; - if(cntonly) - ret = pl->CntAll(gldir); - else { - A *k; - AtomList *r; - I cnt = pl->GetAll(gldir,k,r); - if(!k) - post("%s - %s: error retrieving values",thisName(),GetString(tag)); - else { - for(I i = 0; i < cnt; ++i) { - ToOutAnything(3,tag,0,NULL); - ToOutList(2,absdir?gldir:rdir); - ToOutAtom(1,k[i]); - ToOutList(0,r[i]); - } - delete[] k; - delete[] r; - } - ret = cnt; + switch(how) { + case get_cnt: + ret = pl->CntAll(gldir); + break; + case get_print: + ret = pl->PrintAll(gldir); + break; + case get_norm: { + A *k; + AtomList *r; + I cnt = pl->GetAll(gldir,k,r); + if(!k) + post("%s - %s: error retrieving values",thisName(),GetString(tag)); + else { + for(I i = 0; i < cnt; ++i) { + ToOutAnything(3,tag,0,NULL); + ToOutList(2,absdir?gldir:rdir); + ToOutAtom(1,k[i]); + ToOutList(0,r[i]); + } + delete[] k; + delete[] r; + } + ret = cnt; + } } if(level != 0) { @@ -585,7 +605,7 @@ I pool::getrec(const S *tag,I level,BL order,BL cntonly,const AtomList &rdir) else { I lv = level > 0?level-1:-1; for(I i = 0; i < cnt; ++i) { - ret += getrec(tag,lv,order,cntonly,AtomList(rdir).Append(*r[i])); + ret += getrec(tag,lv,order,how,AtomList(rdir).Append(*r[i])); } delete[] r; } @@ -648,7 +668,7 @@ V pool::m_ogetrec(I argc,const A *argv) } -I pool::getsub(const S *tag,I level,BL order,BL cntonly,const AtomList &rdir) +I pool::getsub(const S *tag,I level,BL order,get_t how,const AtomList &rdir) { AtomList gldir(curdir); gldir.Append(rdir); @@ -666,7 +686,7 @@ I pool::getsub(const S *tag,I level,BL order,BL cntonly,const AtomList &rdir) AtomList ndir(absdir?gldir:rdir); ndir.Append(*r[i]); - if(!cntonly) { + if(how == get_norm) { ToOutAnything(3,tag,0,NULL); ToOutList(2,curdir); ToOutList(1,ndir); @@ -674,7 +694,7 @@ I pool::getsub(const S *tag,I level,BL order,BL cntonly,const AtomList &rdir) } if(level != 0) - ret += getsub(tag,lv,order,cntonly,AtomList(rdir).Append(*r[i])); + ret += getsub(tag,lv,order,how,AtomList(rdir).Append(*r[i])); } delete[] r; } @@ -725,7 +745,7 @@ V pool::m_ogetsub(I argc,const A *argv) V pool::m_cntall() { const S *tag = MakeSymbol("cntall"); - I cnt = getrec(tag,0,false,true); + I cnt = getrec(tag,0,false,get_cnt); ToOutSymbol(3,tag); ToOutBang(2); ToOutBang(1); @@ -749,7 +769,7 @@ V pool::m_cntrec(I argc,const A *argv) post("%s - %s: invalid level specification - set to infinite",thisName(),GetString(tag)); } - I cnt = getrec(tag,lvls,false,true); + I cnt = getrec(tag,lvls,false,get_cnt); ToOutSymbol(3,tag); ToOutBang(2); ToOutBang(1); @@ -774,7 +794,7 @@ V pool::m_cntsub(I argc,const A *argv) post("%s - %s: invalid level specification - set to 0",thisName(),GetString(tag)); } - I cnt = getsub(tag,lvls,false,true); + I cnt = getsub(tag,lvls,false,get_cnt); ToOutSymbol(3,tag); ToOutBang(2); ToOutBang(1); @@ -783,6 +803,37 @@ V pool::m_cntsub(I argc,const A *argv) echodir(); } +V pool::m_printall() +{ + const S *tag = MakeSymbol("printall"); + I cnt = getrec(tag,0,false,get_print); + post(""); +} + +V pool::m_printrec(I argc,const A *argv,BL fromroot) +{ + const S *tag = MakeSymbol(fromroot?"printroot":"printrec"); + + I lvls = -1; + if(argc > 0) { + if(CanbeInt(argv[0])) { + if(argc > 1) + post("%s - %s: superfluous arguments ignored",thisName(),GetString(tag)); + lvls = GetAInt(argv[0]); + } + else + post("%s - %s: invalid level specification - set to infinite",thisName(),GetString(tag)); + } + + AtomList svdir(curdir); + if(fromroot) curdir.Clear(); + + I cnt = getrec(tag,lvls,false,get_print); + post(""); + + curdir = svdir; +} + V pool::paste(const S *tag,I argc,const A *argv,BL repl) { @@ -1069,15 +1120,22 @@ V pool::RmvPool(pooldata *p) std::string pool::MakeFilename(const C *fn) const { #if FLEXT_SYS == FLEXT_SYS_PD - C *sl = strrchr(fn,'/'); - if(!sl) sl = strrchr(fn,'\\'); - if(!sl) { + // / and \ must not be mixed! + C *sl = strchr(fn,'/'); + if(!sl) sl = strchr(fn,'\\'); + if(!sl || (sl != fn +#if FLEXT_OS == FLEXT_OS_WIN + && sl[-1] != ':' // look for drive specification with ":/" or ":\\" +#endif + )) { + // prepend absolute canvas path if filename has no absolute path const C *p = GetString(canvas_getdir(thisCanvas())); return string(p)+'/'+fn; } else return fn; #else +#pragma message("Relative file paths not implemented") return fn; #endif } diff --git a/externals/grill/pool/pool.cpp b/externals/grill/pool/pool.cpp index 25bb0b79..52c6a60c 100644 --- a/externals/grill/pool/pool.cpp +++ b/externals/grill/pool/pool.cpp @@ -294,6 +294,28 @@ I pooldir::CntAll() const return cnt; } +I pooldir::PrintAll(char *buf,int len) const +{ + int offs = strlen(buf); + + I cnt = 0; + for(I vix = 0; vix < vsize; ++vix) { + poolval *ix = vals[vix].v; + for(I i = 0; ix; ++i,ix = ix->nxt) { + PrintAtom(ix->key,buf+offs,len-offs); + strcat(buf+offs," , "); + int l = strlen(buf+offs)+offs; + ix->data->Print(buf+l,len-l); + post(buf); + } + cnt += vals[vix].cnt; + } + + buf[offs] = 0; + + return cnt; +} + I pooldir::GetKeys(AtomList &keys) { I cnt = CntAll(); @@ -452,12 +474,8 @@ static C *ReadAtom(C *c,A *a) return c; } -static BL ReadAtoms(istream &is,flext::AtomList &l,C del) +static BL ParseAtoms(C *tmp,flext::AtomList &l) { - C tmp[1024]; - is.getline(tmp,sizeof tmp,del); - if(is.eof() || !is.good()) return false; - I i,cnt; C *t = tmp; for(cnt = 0; ; ++cnt) { @@ -473,6 +491,21 @@ static BL ReadAtoms(istream &is,flext::AtomList &l,C del) return true; } +static BL ParseAtoms(string &s,flext::AtomList &l) +{ + return ParseAtoms((C *)s.c_str(),l); +} + +static BL ReadAtoms(istream &is,flext::AtomList &l,C del) +{ + C tmp[1024]; + is.getline(tmp,sizeof tmp,del); + if(is.eof() || !is.good()) + return false; + else + return ParseAtoms(tmp,l); +} + static V WriteAtom(ostream &os,const A &a) { switch(a.a_type) { @@ -551,52 +584,196 @@ BL pooldir::SvDir(ostream &os,I depth,const AtomList &dir) return true; } -BL pooldir::LdDirXML(istream &is,I depth,BL mkdir) +class xmltag { +public: + string tag,attr; + bool Ok() const { return tag.length() > 0; } + bool operator ==(const C *t) const { return !tag.compare(t); } + void Clear() { tag.clear(); attr.clear(); } + enum { t_start,t_end,t_empty } type; +}; + +static bool gettag(istream &is,xmltag &t) +{ + 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; + + for(; isspace(*tb); ++tb); + if(*tb == '/') { + t.type = xmltag::t_end; + for(++tb; isspace(*tb); ++tb); + } + else { + for(; isspace(*te); --te); + if(*te == '/') { + for(--te; isspace(*te); --te); + t.type = xmltag::t_empty; + } + else + t.type = xmltag::t_start; + } + + 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; + } +} + +static void getvalue(istream &is,string &s) { -/* - 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(); + char tmp[1024],*t = tmp; + bool intx = false; + for(;;) { + char c = is.peek(); + if(c == '"') intx = !intx; + else if(c == '<' && !intx) break; + *(t++) = is.get(); + } + *t = 0; + s = tmp; +} - if(r) { - if(depth < 0 || d.Count() <= depth) { - pooldir *nd = mkdir?AddDir(d):GetDir(d); - if(nd) { - nd->SetVal(k[0],v); v = NULL; - } - #ifdef FLEXT_DEBUG - else - post("pool - directory was not found",i); - #endif - } - } - else if(!is.eof()) - post("pool - format mismatch encountered, skipped line %i",i); +BL pooldir::LdDirXML(istream &is,I depth,BL mkdir) +{ + AtomList d,k,v; + bool inpool = false,inval = false,inkey = false,indata = false; + while(!is.eof()) { + xmltag tag; + gettag(is,tag); + if(!tag.Ok()) { + // look for value + string s; + getvalue(is,s); + + if(s.length() && inpool && + ( + (!inval && inkey && d.Count()) || /* dir */ + (inval && (inkey || indata)) /* value */ + ) + ) { + BL ret; + if(indata) + ret = ParseAtoms(s,v); + else // inkey + if(inval) + ret = ParseAtoms(s,k); + else { + SetString(d[d.Count()-1],s.c_str()); + ret = true; + } + if(!ret) post("pool - error interpreting XML value (%s)",s.c_str()); + } + else + post("pool - error reading XML data"); + } + else if(tag == "pool") { + if(tag.type == xmltag::t_end) break; + else inpool = true; + } + else if(inpool) { + if(tag == "dir") { + if(tag.type == xmltag::t_start) { + t_atom at; SetString(at,""); + d.Append(at); + } + else if(tag.type == xmltag::t_end) { + if(d.Count()) + d.Set(d.Count()-1,d.Atoms(),0,true); + else + post("pool - superfluous in XML data"); + } + } + else if(tag == "value") { + if(tag.type == xmltag::t_start) { + inval = true; + k.Clear(); v.Clear(); + } + else if(tag.type == xmltag::t_end) { + if(depth < 0 || d.Count() <= depth) { + // NOW set value + pooldir *nd = mkdir?AddDir(d):GetDir(d); + if(nd) { + // only use first word of key + if(k.Count() == 1) + nd->SetVal(k[0],new AtomList(v)); + else + post("pool - Invalid key (!= 1 atom)"); + } + } + inval = false; + } + } + else if(tag == "key") { + if(tag.type == xmltag::t_start) { + inkey = true; + } + else if(tag.type == xmltag::t_end) { + inkey = false; + } + } + else if(tag == "data") { + if(!inval) + post("pool - XML tag not within "); + + if(tag.type == xmltag::t_start) { + indata = true; + } + else if(tag.type == xmltag::t_end) { + indata = false; + } + } +#ifdef FLEXT_DEBUG + else { + post("pool - unknown XML tag '%s'",tag.tag.c_str()); + } +#endif + } + else if(tag == "!DOCTYPE") { + // ignore + } +#ifdef FLEXT_DEBUG + else { + post("pool - unknown XML tag '%s'",tag.tag.c_str()); + } +#endif + } + return true; +} - if(v) delete v; - } - return true; -*/ - return false; +static void indent(ostream &s,I cnt) +{ + for(I i = 0; i < cnt; ++i) s << '\t'; } -BL pooldir::SvDirXML(ostream &os,I depth,const AtomList &dir) +BL pooldir::SvDirXML(ostream &os,I depth,const AtomList &dir,I ind) { if(dir.Count()) { - os << "" << endl; + indent(os,ind+1); + os << ""; WriteAtom(os,dir[dir.Count()-1]); - os << "\">" << endl; + os << "" << endl; } for(I vi = 0; vi < vsize; ++vi) { for(poolval *ix = vals[vi].v; ix; ix = ix->nxt) { - os << ""; WriteAtom(os,ix->key); - os << "\">"; + os << ""; WriteAtoms(os,*ix->data); - os << "" << endl; + os << "" << endl; } } @@ -604,12 +781,15 @@ BL pooldir::SvDirXML(ostream &os,I depth,const AtomList &dir) I nd = depth > 0?depth-1:-1; for(I di = 0; di < dsize; ++di) { for(pooldir *ix = dirs[di].d; ix; ix = ix->nxt) { - ix->SvDirXML(os,nd,AtomList(dir).Append(ix->dir)); + ix->SvDirXML(os,nd,AtomList(dir).Append(ix->dir),ind+1); } } } - if(dir.Count()) os << "" << endl; + if(dir.Count()) { + indent(os,ind); + os << "" << endl; + } return true; } diff --git a/externals/grill/pool/pool.dtd b/externals/grill/pool/pool.dtd index c5cb5568..57a48498 100644 --- a/externals/grill/pool/pool.dtd +++ b/externals/grill/pool/pool.dtd @@ -1,5 +1,5 @@ - - - - - + + + + + diff --git a/externals/grill/pool/pool.h b/externals/grill/pool/pool.h index e4a55647..99e271b3 100644 --- a/externals/grill/pool/pool.h +++ b/externals/grill/pool/pool.h @@ -74,6 +74,7 @@ public: AtomList *GetVal(const A &key,BL cut = false); I CntAll() const; I GetAll(A *&keys,AtomList *&lst,BL cut = false); + I PrintAll(char *buf,int len) const; I GetKeys(AtomList &keys); I CntSub() const; I GetSub(const A **&dirs); @@ -87,7 +88,7 @@ public: BL LdDir(istream &is,I depth,BL mkdir); BL LdDirXML(istream &is,I depth,BL mkdir); BL SvDir(ostream &os,I depth,const AtomList &dir = AtomList()); - BL SvDirXML(ostream &os,I depth,const AtomList &dir = AtomList()); + BL SvDirXML(ostream &os,I depth,const AtomList &dir = AtomList(),I ind = 0); int VSize() const { return vsize; } int DSize() const { return dsize; } @@ -132,6 +133,7 @@ public: poolval *Ref(const AtomList &d,const A &key); poolval *Refi(const AtomList &d,I ix); I CntAll(const AtomList &d); + I PrintAll(const AtomList &d); I GetAll(const AtomList &d,A *&keys,AtomList *&lst); I CntSub(const AtomList &d); I GetSub(const AtomList &d,const t_atom **&dirs); diff --git a/externals/grill/pool/pool.pd b/externals/grill/pool/pool.pd index eab56fc3..2c1c75d5 100644 --- a/externals/grill/pool/pool.pd +++ b/externals/grill/pool/pool.pd @@ -1,23 +1,23 @@ -#N canvas 12 3 936 692 12; -#X msg 295 108 set 1 2 3; +#N canvas 12 3 946 702 12; +#X msg 296 105 set 1 2 3; #X obj 308 619 print K; #X msg 607 211 getall; -#X msg 295 137 set A k g; +#X msg 296 134 set A k g; #X obj 259 648 print V; #X obj 357 593 print D; -#X msg 295 167 set A l m; -#X msg 298 196 set 2 34; -#X msg 428 105 clr A; -#X msg 428 168 get A; -#X msg 428 193 get 2; +#X msg 296 164 set A l m; +#X msg 299 193 set 2 34; +#X msg 429 102 clr A; +#X msg 429 165 get A; +#X msg 429 190 get 2; #X msg 40 132 echodir \$1; #X obj 40 111 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X obj 40 213 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X msg 40 234 absdir \$1; -#X text 427 85 clear value; -#X text 424 146 get value; +#X text 428 82 clear value; +#X text 425 143 get value; #X obj 406 564 print C; #X text 478 564 command; #X text 430 593 directory (abs or rel to current); @@ -28,12 +28,12 @@ #X text 86 343 set to private; #X msg 42 405 reset; #X text 41 384 clear all pool data; -#X msg 613 111 clrall; -#X text 604 89 clear all values in dir; +#X msg 608 111 clrall; +#X text 599 89 clear all values in dir; #X text 607 190 get all values in dir; #X text 175 500 pool name can be given as argument; -#X text 603 136 clear all values and dirs; -#X msg 611 158 clrrec; +#X text 598 136 clear all values and dirs; +#X msg 606 158 clrrec; #X msg 605 258 getrec; #X text 605 236 get all values in dir and subdirs; #X text 670 289 bang at EOL; @@ -42,19 +42,19 @@ #X text 43 291 set pool name; #X text 40 89 at each command; #X text 40 73 echo current dir; -#X text 292 83 set values; +#X text 293 80 set values; #X text 35 194 (default on); #X text 27 178 report absolute dirs; #X msg 43 452 help; #X text 86 453 get some info; #X text 670 274 default=-1 (= infinite); -#X msg 609 338 cntall; -#X text 675 336 count all values in dir; -#X msg 609 364 cntrec; -#X text 677 362 ... and subdirs; -#X text 673 376 (depth may be given); -#X text 294 261 set but don't replace; -#N canvas 0 0 514 540 dirs 0; +#X msg 609 340 cntall; +#X text 675 338 count all values in dir; +#X msg 609 366 cntrec; +#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; @@ -92,9 +92,9 @@ #X connect 13 0 26 0; #X connect 22 0 26 0; #X connect 23 0 26 0; -#X restore 718 511 pd dirs; -#X text 715 485 directory operations; -#N canvas 0 0 821 453 file 0; +#X restore 716 496 pd dirs; +#X text 713 470 directory operations; +#N canvas 0 0 829 461 file 0; #X text 117 207 save dir and subdirs; #X text 117 165 save data in current dir; #X text 117 253 load data into current dir; @@ -141,10 +141,10 @@ the folder containing the current patcher will be used.; #X connect 29 0 18 0; #X connect 30 0 18 0; #X connect 31 0 18 0; -#X restore 719 566 pd file; -#X text 717 543 file operations; -#X text 717 600 clipboard operations; -#N canvas 0 0 535 583 clip 0; +#X restore 717 551 pd file; +#X text 715 528 file operations; +#X text 715 585 clipboard operations; +#N canvas 0 0 541 589 clip 0; #X text 97 56 copy value associated to key into clipboard; #X msg 100 77 copy A; #X msg 98 119 cut B; @@ -182,9 +182,9 @@ the folder containing the current patcher will be used.; #X connect 14 0 26 0; #X connect 21 0 26 0; #X connect 23 0 26 0; -#X restore 719 623 pd clip; -#X text 717 454 more commands:; -#X obj 289 389 r \$0-pool; +#X restore 716 606 pd clip; +#X text 715 439 more commands:; +#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 @@ -198,13 +198,31 @@ the folder containing the current patcher will be used.; #X msg 146 313 getpool; #X text 272 13 a hierarchical storage object \, (C)2002-2003 Thomas Grill; -#X msg 296 282 add 2 14; +#X msg 297 279 add 2 14; #X obj 260 478 pool @valcnt 10 @dircnt 5; -#X text 332 442 expected value and directory counts; -#X text 332 457 can be given for optimal performance; -#X msg 428 218 get 3; -#X msg 299 227 set 3 -1 1; +#X text 330 437 expected value and directory counts; +#X text 330 452 can be given for optimal performance; +#X msg 429 215 get 3; +#X msg 300 224 set 3 -1 1; #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; +#X obj 21 231 s \$0-pool; +#X msg 109 80 printall; +#X msg 109 132 printrec; +#X text 110 60 print all values in dir; +#X text 109 112 print values in dir and subdirs; +#X text 179 131 (depth may be given); +#X text 22 12 print-to-console operations; +#X text 190 185 (depth may be given); +#X msg 109 181 printroot; +#X text 109 161 print values in dir and subdirs (starting from root) +; +#X connect 1 0 0 0; +#X connect 2 0 0 0; +#X connect 8 0 0 0; +#X restore 717 659 pd print; #X connect 0 0 72 0; #X connect 2 0 72 0; #X connect 3 0 72 0; diff --git a/externals/grill/pool/readme.txt b/externals/grill/pool/readme.txt index 3d9b5f1a..98671bdf 100644 --- a/externals/grill/pool/readme.txt +++ b/externals/grill/pool/readme.txt @@ -63,7 +63,8 @@ Version history: - extensive use of hashing for keys and directories - database can be saved/loaded as XML data - fixed bug with stored numbers starting with - or + -- file names without paths will use the folder of the current patcher +- relative file names will be based on the folder of the current patcher +- added printall, printrec, printroot messages for console printout 0.1.0: - first public release @@ -78,5 +79,5 @@ TODO list: general: - what is output as value if it is key only? (Max->nothing!) -- XML interpretation? (only files written by pool or others too) +- XML format ok? -- cgit v1.2.1