aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/pool/data.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'externals/grill/pool/data.cpp')
-rw-r--r--externals/grill/pool/data.cpp77
1 files changed, 70 insertions, 7 deletions
diff --git a/externals/grill/pool/data.cpp b/externals/grill/pool/data.cpp
index 4984129b..8d5d41c4 100644
--- a/externals/grill/pool/data.cpp
+++ b/externals/grill/pool/data.cpp
@@ -16,9 +16,9 @@ WARRANTIES, see the file, "license.txt," in this distribution.
#include <stdlib.h>
-pooldata::pooldata(const S *s):
+pooldata::pooldata(const S *s,I vcnt,I dcnt):
sym(s),nxt(NULL),refs(0),
- root(nullatom,NULL)
+ root(nullatom,NULL,vcnt,dcnt)
{
LOG1("new pool %s",sym?flext_base::GetString(sym):"<private>");
}
@@ -28,17 +28,18 @@ pooldata::~pooldata()
LOG1("free pool %s",sym?flext_base::GetString(sym):"<private>");
}
+
const A pooldata::nullatom = { A_NULL };
V pooldata::Reset()
{
- root.Clear(true);
+ root.Reset();
}
-BL pooldata::MkDir(const AtomList &d)
+BL pooldata::MkDir(const AtomList &d,I vcnt,I dcnt)
{
- root.AddDir(d);
+ root.AddDir(d,vcnt,dcnt);
return true;
}
@@ -117,6 +118,12 @@ I pooldata::GetAll(const AtomList &d,A *&keys,AtomList *&lst)
}
}
+I pooldata::CntSub(const AtomList &d)
+{
+ pooldir *pd = root.GetDir(d);
+ return pd?pd->CntSub():0;
+}
+
I pooldata::GetSub(const AtomList &d,const t_atom **&dirs)
{
pooldir *pd = root.GetDir(d);
@@ -144,7 +151,7 @@ pooldir *pooldata::Copy(const AtomList &d,const A &key,BL cut)
if(pd) {
AtomList *val = pd->GetVal(key,cut);
if(val) {
- pooldir *ret = new pooldir(nullatom,NULL);
+ pooldir *ret = new pooldir(nullatom,NULL,pd->VSize(),pd->DSize());
ret->SetVal(key,val);
return ret;
}
@@ -159,7 +166,8 @@ pooldir *pooldata::CopyAll(const AtomList &d,I depth,BL cut)
{
pooldir *pd = root.GetDir(d);
if(pd) {
- pooldir *ret = new pooldir(nullatom,NULL);
+ // What sizes should we choose here?
+ pooldir *ret = new pooldir(nullatom,NULL,pd->VSize(),pd->DSize());
if(pd->Copy(ret,depth,cut))
return ret;
else {
@@ -220,4 +228,59 @@ BL pooldata::SvDir(const AtomList &d,const C *flnm,I depth,BL absdir)
return false;
}
+BL pooldata::LdDirXML(const AtomList &d,const C *flnm,I depth,BL mkdir)
+{
+ pooldir *pd = root.GetDir(d);
+ if(pd) {
+ C tmp[1024];
+ const C *t = CnvFlnm(tmp,flnm,sizeof tmp);
+ if(t) {
+ ifstream fl(t);
+ BL ret = fl.good() != 0;
+ if(ret) {
+ fl.getline(tmp,sizeof tmp);
+ ret = !strncmp(tmp,"<?xml",5);
+ }
+ if(ret) {
+ fl.getline(tmp,sizeof tmp);
+ // DOCTYPE need not be present / only external DOCTYPE is allowed!
+ if(!strncmp(tmp,"<!DOCTYPE",9))
+ fl.getline(tmp,sizeof tmp);
+ ret = !strncmp(tmp,"<pool>",6);
+ }
+ if(ret)
+ ret = pd->LdDirXML(fl,depth,mkdir);
+ return ret;
+ }
+ else return false;
+ }
+ else
+ return false;
+}
+
+BL pooldata::SvDirXML(const AtomList &d,const C *flnm,I depth,BL absdir)
+{
+ pooldir *pd = root.GetDir(d);
+ if(pd) {
+ C tmp[1024];
+ const C *t = CnvFlnm(tmp,flnm,sizeof tmp);
+ if(t) {
+ ofstream fl(t);
+ AtomList tmp;
+ if(absdir) tmp = d;
+ if(fl.good()) {
+ fl << "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" << endl;
+ fl << "<!DOCTYPE pool SYSTEM \"pool.dtd\">" << endl;
+ fl << "<pool>" << endl;
+ BL ret = pd->SvDirXML(fl,depth,tmp);
+ fl << "</pool>" << endl;
+ return ret;
+ }
+ }
+ else return false;
+ }
+ else
+ return false;
+}
+