From 6ce33fd36eaaebfe3df5d262785ab2fe74499252 Mon Sep 17 00:00:00 2001 From: Thomas Grill Date: Fri, 25 Jul 2003 02:32:45 +0000 Subject: "" svn path=/trunk/; revision=797 --- externals/grill/flext/source/flattr.cpp | 77 +++--- externals/grill/flext/source/flattr_ed.cpp | 365 ++++++++++++++++++++--------- externals/grill/flext/source/flbind.cpp | 18 +- externals/grill/flext/source/flclass.h | 130 +++++----- externals/grill/flext/source/flext.cpp | 10 +- externals/grill/flext/source/flitem.cpp | 40 ++-- externals/grill/flext/source/flmeth.cpp | 14 +- externals/grill/flext/source/flmsg.cpp | 28 +-- 8 files changed, 420 insertions(+), 262 deletions(-) (limited to 'externals') diff --git a/externals/grill/flext/source/flattr.cpp b/externals/grill/flext/source/flattr.cpp index 660743f5..97c1dd34 100644 --- a/externals/grill/flext/source/flattr.cpp +++ b/externals/grill/flext/source/flattr.cpp @@ -22,43 +22,43 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define STD #endif -flext_base::attritem::attritem(const t_symbol *t,metharg tp,methfun f,int fl): - item(t,0,NULL), +flext_base::AttrItem::AttrItem(const t_symbol *t,metharg tp,methfun f,int fl): + Item(t,0,NULL), flags(fl),argtp(tp),fun(f) {} -flext_base::attritem::~attritem() +flext_base::AttrItem::~AttrItem() { // if(nxt) delete nxt; } //! Add get and set attributes -void flext_base::AddAttrib(itemarr *aa,itemarr *ma,const char *attr,metharg tp,methfun gfun,methfun sfun) +void flext_base::AddAttrib(ItemCont *aa,ItemCont *ma,const char *attr,metharg tp,methfun gfun,methfun sfun) { const t_symbol *asym = MakeSymbol(attr); // if(sfun) // if commented out, there will be a warning at run-time (more user-friendly) { - attritem *a = new attritem(asym,tp,sfun,attritem::afl_bothexist|attritem::afl_set); + AttrItem *a = new AttrItem(asym,tp,sfun,AttrItem::afl_bothexist|AttrItem::afl_set); aa->Add(a); // bind attribute to a method - methitem *mi = new methitem(0,asym,a); + MethItem *mi = new MethItem(0,asym,a); mi->SetArgs(sfun,1,new metharg(tp)); ma->Add(mi); } // if(gfun) // if commented out, there will be a warning at run-time (more user-friendly) { - attritem *a = new attritem(asym,tp,gfun,attritem::afl_bothexist|attritem::afl_get); + AttrItem *a = new AttrItem(asym,tp,gfun,AttrItem::afl_bothexist|AttrItem::afl_get); aa->Add(a); static char tmp[256] = "get"; strcpy(tmp+3,attr); // bind attribute to a method - methitem *mi = new methitem(0,MakeSymbol(tmp),a); + MethItem *mi = new MethItem(0,MakeSymbol(tmp),a); mi->SetArgs(gfun,0,NULL); ma->Add(mi); } @@ -92,12 +92,11 @@ int flext_base::ListAttrib(AtomList &la) const int ix = 0; for(int i = 0; i <= 1; ++i) { - itemarr *a = i?attrhead:clattrhead; + ItemCont *a = i?attrhead:clattrhead; if(a) { for(int ai = 0; ai < a->Size(); ++ai) { - for(item *l = a->Item(ai); l; l = l->nxt) - { - attritem *aa = (attritem *)l; + for(Item *l = a->GetItem(ai); l; l = l->nxt) { + AttrItem *aa = (AttrItem *)l; // only list once! if(!aa->BothExist() || aa->IsGet()) @@ -119,12 +118,11 @@ int flext_base::ListMethods(AtomList &la,int inlet) const int ix = 0; for(int i = 0; i <= 1; ++i) { - itemarr *a = i?methhead:clmethhead; + ItemCont *a = i?methhead:clmethhead; if(a) { for(int ai = 0; ai < a->Size(); ++ai) { - for(item *l = a->Item(ai); l; l = l->nxt) - { - methitem *aa = (methitem *)l; + for(Item *l = a->GetItem(ai); l; l = l->nxt) { + MethItem *aa = (MethItem *)l; // match inlet and see that it's not related to an attribute if(aa->inlet == inlet && !aa->IsAttr()) @@ -156,10 +154,17 @@ bool flext_base::InitAttrib(int argc,const t_atom *argv) if(IsString(argv[nxt]) && *GetString(argv[nxt]) == '@') break; const t_symbol *tag = MakeSymbol(GetString(argv[cur])+1); - attritem *attr = FindAttrib(tag,false,true); + + // find puttable attribute + AttrItem *attr = FindAttrib(tag,false,true); if(attr) { - if(SetAttrib(attr,nxt-cur-1,argv+cur+1)) - SetAttribSave(attr,true); + // make an entry (there are none beforehand...) + AttrData &a = (*attrdata)[tag]; + a.SetInit(true); + a.SetInitValue(nxt-cur-1,argv+cur+1); + + // pass value to object + SetAttrib(attr,a.GetInitValue()); } } return true; @@ -197,16 +202,16 @@ bool flext_base::cb_ListMethods(flext_base *c,int argc,const t_atom *argv) return false; } -flext_base::attritem *flext_base::FindAttrib(const t_symbol *tag,bool get,bool msg) const +flext_base::AttrItem *flext_base::FindAttrib(const t_symbol *tag,bool get,bool msg) const { // first search within object scope - attritem *a = (attritem *)attrhead->Find(tag); - while(a && (a->tag != tag || a->inlet != 0 || (get?a->IsSet():a->IsGet()))) a = (attritem *)a->nxt; + AttrItem *a = (AttrItem *)attrhead->Find(tag); + while(a && (a->tag != tag || a->inlet != 0 || (get?a->IsSet():a->IsGet()))) a = (AttrItem *)a->nxt; // then (if nothing found) search within class scope if(!a) { - a = (attritem *)clattrhead->Find(tag); - while(a && (a->tag != tag || a->inlet != 0 || (get?a->IsSet():a->IsGet()))) a = (attritem *)a->nxt; + a = (AttrItem *)clattrhead->Find(tag); + while(a && (a->tag != tag || a->inlet != 0 || (get?a->IsSet():a->IsGet()))) a = (AttrItem *)a->nxt; } if(!a && msg) { @@ -219,14 +224,14 @@ flext_base::attritem *flext_base::FindAttrib(const t_symbol *tag,bool get,bool m bool flext_base::SetAttrib(const t_symbol *tag,int argc,const t_atom *argv) { // search for matching attribute - attritem *a = FindAttrib(tag,false,true); + AttrItem *a = FindAttrib(tag,false,true); if(a) return SetAttrib(a,argc,argv); else return true; } -bool flext_base::SetAttrib(attritem *a,int argc,const t_atom *argv) +bool flext_base::SetAttrib(AttrItem *a,int argc,const t_atom *argv) { if(a->fun) { bool ok = true; @@ -272,7 +277,7 @@ bool flext_base::SetAttrib(attritem *a,int argc,const t_atom *argv) } -bool flext_base::GetAttrib(attritem *a,AtomList &la) const +bool flext_base::GetAttrib(AttrItem *a,AtomList &la) const { bool ok = true; // main attribute tag @@ -320,7 +325,7 @@ bool flext_base::GetAttrib(attritem *a,AtomList &la) const return ok; } -bool flext_base::GetAttrib(attritem *a) +bool flext_base::GetAttrib(AttrItem *a) { AtomList la; bool ret = GetAttrib(a,la); @@ -330,25 +335,13 @@ bool flext_base::GetAttrib(attritem *a) bool flext_base::GetAttrib(const t_symbol *s,AtomList &a) const { - attritem *attr = FindAttrib(s,true); + AttrItem *attr = FindAttrib(s,true); return attr && GetAttrib(attr,a); } bool flext_base::DumpAttrib(const t_symbol *attr) const { - attritem *item = FindAttrib(attr,true); + AttrItem *item = FindAttrib(attr,true); return item && const_cast(this)->GetAttrib(item); } - -void flext_base::SetAttribSave(attritem *a,bool save) -{ - a->SetSave(save); - if(a->BothExist()) { - // find opposite attribute item - attritem *b = FindAttrib(a->tag,!a->IsGet()); - FLEXT_ASSERT(b != NULL); - - b->SetSave(save); - } -} diff --git a/externals/grill/flext/source/flattr_ed.cpp b/externals/grill/flext/source/flattr_ed.cpp index 4f851f36..be86e04a 100644 --- a/externals/grill/flext/source/flattr_ed.cpp +++ b/externals/grill/flext/source/flattr_ed.cpp @@ -21,6 +21,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #endif // This is problematic... non-public headers! +// compilation may be specific for one version of PD!! #include #include @@ -56,33 +57,45 @@ void flext_base::SetAttrEditor(t_classid c) // make a list of the attribute values (including save flags) "set lst {}\n" - "for {set ix 0} {$ix < $alen} {incr ix} {\n" + "for {set ix 1} {$ix <= $alen} {incr ix} {\n" "set var_attr_name [concat [concat var_name_$ix]_$vid ]\n" "global $var_attr_name\n" + "set var_attr_init [concat [concat var_init_$ix]_$vid ]\n" + "global $var_attr_init\n" "set var_attr_val [concat [concat var_val_$ix]_$vid ]\n" "global $var_attr_val\n" "set var_attr_save [concat [concat var_save_$ix]_$vid ]\n" "global $var_attr_save\n" "lappend lst [eval concat $$var_attr_name]\n" - // see if it's a list + + // process current value "set len [llength [expr $$var_attr_val]]\n" + // see if it's a list "if { $len > 1 } {\n" - "set lst [concat $lst \"list\" $len [expr $$var_attr_val]]\n" + "set lst [concat $lst {list} $len [expr $$var_attr_val]]\n" "} else {\n" "lappend lst [expr $$var_attr_val]\n" "}\n" + + // process init value + "set len [llength [expr $$var_attr_init]]\n" + // see if it's a list + "if { $len > 1 } {\n" + "set lst [concat $lst {list} $len [expr $$var_attr_init]]\n" + "} else {\n" + "lappend lst [expr $$var_attr_init]\n" + "}\n" + "lappend lst [eval concat $$var_attr_save]\n" "}\n" "set cmd [concat $id attributedialog $lst \\;]\n" - // puts stderr $cmd "pd $cmd\n" "}\n" "proc flext_cancel {id} {\n" "set cmd [concat $id cancel \\;]\n" - // puts stderr $cmd "pd $cmd\n" "}\n" @@ -91,43 +104,61 @@ void flext_base::SetAttrEditor(t_classid c) "flext_cancel $id\n" "}\n" - "proc pdtk_flext_dialog {id attrlist} {\n" + "proc flext_copyval {dst src} {\n" + "global $src\n" + "global $dst\n" + "set $dst [expr $$src]\n" + "}\n" + + "proc pdtk_flext_dialog {id title attrlist} {\n" "set vid [string trimleft $id .]\n" - "set alen [expr [llength $attrlist] / 4 ]\n" + "set alen [expr [llength $attrlist] / 5 ]\n" "toplevel $id\n" - "wm title $id {object attributes}\n" + "wm title $id $title\n" "wm protocol $id WM_DELETE_WINDOW [concat flext_cancel $id]\n" -/* - "label $id.label -text {Attributes}\n" - "pack $id.label -side top\n" -*/ - "set ix 0\n" - "foreach {an av asv afl} $attrlist {\n" - // generate variable name - "set nm [concat $id.nm-$ix]\n" + "set row 0\n" + // set column labels + "label $id.label -text {attribute} -height 2 -font {Helvetica 9 bold}\n" + "label $id.init -text {initial value} -height 2 -font {Helvetica 9 bold}\n" + "label $id.copy -text {copy} -height 2 -font {Helvetica 9 bold}\n" + "label $id.val -text {current value} -height 2 -font {Helvetica 9 bold}\n" + "foreach {i txt} {0 {don't\rsave} 1 {do\rinit} 2 {always\rsave} } {\n" + "label $id.b$i -text $txt -height 2 -font {Helvetica 9 bold}\n" + "}\n" +// "label $id.options -text {options} -height 2\n" + + "grid config $id.label -column 0 -row $row \n" + "grid config $id.init -column 1 -row $row \n" + "grid config $id.copy -column 2 -columnspan 2 -row $row \n" + "grid config $id.val -column 4 -row $row \n" + "foreach i {0 1 2} { grid config $id.b$i -column [expr $i + 5] -row $row }\n" +// "grid config $id.options -column 3 -row 0 \n" + "incr row\n" + + // Separator + "frame $id.sep -relief ridge -bd 1 -height 2\n" + "grid config $id.sep -column 0 -columnspan 8 -row $row -pady 2 -sticky {snew}\n" + "incr row\n" + + "set ix 1\n" + "foreach {an av ai asv afl} $attrlist {\n" // get attribute name "set var_attr_name [concat [concat var_name_$ix]_$vid ]\n" "global $var_attr_name\n" "set $var_attr_name $an\n" + // get attribute init value (list) + "set var_attr_init [concat [concat var_init_$ix]_$vid ]\n" + "global $var_attr_init\n" + "set $var_attr_init $ai\n" + // get attribute value (list) "set var_attr_val [concat [concat var_val_$ix]_$vid ]\n" "global $var_attr_val\n" - - // format value list - "set $var_attr_val {}\n" - "foreach i $av {\n" - "if { [string is double $i] } {\n" - // it's a number.. take as many digits as necessary - "lappend $var_attr_val [format %g $i]\n" - "} else {\n" - // it's a string, append unchanged - "lappend $var_attr_val $i\n" - "}\n" - "}\n" + "set $var_attr_val $av\n" // get save flag "set var_attr_save [concat [concat var_save_$ix]_$vid ]\n" @@ -135,90 +166,150 @@ void flext_base::SetAttrEditor(t_classid c) "set $var_attr_save $asv\n" // add dialog elements to window - "frame $nm\n" - "pack $nm -side top\n" - "label $nm.lwidth -text \"$an :\"\n" - "entry $nm.width -textvariable $var_attr_val -width 20\n" - "bind $nm.width [concat flext_ok $id $alen]\n" - - "foreach i {0 1 2} { radiobutton $nm.b$i -value $i -variable $var_attr_save }\n" - "pack $nm.lwidth $nm.width $nm.b0 $nm.b1 $nm.b2 -side left\n" + // attribute label + "label $id.label-$ix -text \"$an :\" -font {Helvetica 8 bold}\n" + "grid config $id.label-$ix -column 0 -row $row -padx 5 -sticky {e}\n" + // entry field for initial value + "entry $id.init-$ix -textvariable $var_attr_init\n" + "grid config $id.init-$ix -column 1 -row $row -padx 5 -sticky {ew}\n" + + "button $id.b2i-$ix -text {<-} -height 1 -command \" flext_copyval $var_attr_init $var_attr_val \"\n" + "grid config $id.b2i-$ix -column 2 -row $row -sticky {ew}\n" + "button $id.b2c-$ix -text {->} -height 1 -command \" flext_copyval $var_attr_val $var_attr_init \"\n" + "grid config $id.b2c-$ix -column 3 -row $row -sticky {ew}\n" + + // entry field for current value + "entry $id.val-$ix -textvariable $var_attr_val\n" + "grid config $id.val-$ix -column 4 -row $row -padx 5 -sticky {ew}\n" + +// "tk_optionMenu $id.opt-$ix $var_attr_save {don't save} {initialize} {always save}\n" +// "grid config $id.opt-$ix -column 5 -row $ix \n" + + // radiobuttons + "foreach {i c} {0 black 1 blue 2 red} {\n" + "radiobutton $id.b$i-$ix -value $i -foreground $c -variable $var_attr_save \n" + "grid config $id.b$i-$ix -column [expr $i + 5] -row $row \n" + "}\n" // increase counter "incr ix\n" + "incr row\n" "}\n" -// "focus $id.1-rangef.width\n" - + // Separator + "frame $id.sep2 -relief ridge -bd 1 -height 2\n" + "grid config $id.sep2 -column 0 -columnspan 8 -row $row -pady 5 -sticky {snew}\n" + "incr row\n" // Buttons - "frame $id.buttonframe\n" - "pack $id.buttonframe -side bottom -fill x -pady 2m\n" + "pack $id.buttonframe -side bottom -fill x\n" - "button $id.buttonframe.cancel -text {Cancel} -command \"flext_cancel $id\"\n" - "button $id.buttonframe.apply -text {Apply} -command \"flext_apply $id $alen\"\n" - "button $id.buttonframe.ok -text {OK} -command \"flext_ok $id $alen\"\n" + "button $id.buttonframe.cancel -text {Cancel} -width 20 -command \" flext_cancel $id \"\n" + "button $id.buttonframe.apply -text {Apply} -width 20 -command \" flext_apply $id $alen \"\n" + "button $id.buttonframe.ok -text {OK} -width 20 -command \" flext_ok $id $alen \"\n" "pack $id.buttonframe.cancel -side left -expand 1\n" "pack $id.buttonframe.apply -side left -expand 1\n" "pack $id.buttonframe.ok -side left -expand 1\n" + "grid config $id.buttonframe -column 0 -columnspan 8 -row $row -pady 5 -sticky {ew}\n" + + // Key bindings + "bind $id {} \" flext_cancel $id \"\n" + "bind $id {} \" flext_ok $id $alen \"\n" + "bind $id {} \" flext_apply $id $alen \"\n" "}\n" ); } +static int PrintList(char *buf,int argc,const t_atom *argv) +{ + char *b = buf; + for(int j = 0; j < argc; ++j) { + const t_atom &at = argv[j]; + if(flext::IsString(at)) + STD::sprintf(b,"%s",flext::GetString(at)); + else if(flext::IsFloat(at)) + STD::sprintf(b,"%g",flext::GetFloat(at)); + else if(flext::IsInt(at)) + STD::sprintf(b,"%i",flext::GetInt(at)); + else + FLEXT_ASSERT(false); + b += strlen(b); + + if(j < argc-1) *(b++) = ' '; + } + return b-buf; +} void flext_base::cb_GfxProperties(t_gobj *c, t_glist *) { flext_base *th = thisObject(c); - char buf[1000],*b = buf; + char buf[10000],*b = buf; + + STD::sprintf(b, "pdtk_flext_dialog %%s { "); b += strlen(b); + + t_text *x = (t_text *)c; + FLEXT_ASSERT(x->te_binbuf); + + int argc = binbuf_getnatom(x->te_binbuf); + t_atom *argv = binbuf_getvec(x->te_binbuf); + b += PrintList(b,argc,argv); + + STD::sprintf(b, " } { "); b += strlen(b); AtomList la; int cnt = th->ListAttrib(la); - STD::sprintf(b, "pdtk_flext_dialog %%s { "); b += strlen(b); - for(int i = 0; i < cnt; ++i) { - STD::sprintf(b,"%s {",GetString(la[i])); b += strlen(b); + const t_symbol *sym = GetSymbol(la[i]); + + // get flags + int sv; + const AtomList *initdata; + AttrDataCont::iterator it = th->attrdata->find(sym); + if(it == th->attrdata->end()) + sv = 0,initdata = NULL; + else { + const AttrData &a = it->second; + if(a.IsSaved()) + sv = 2; + else if(a.IsInit()) + sv = 1; + else + sv = 0; + + initdata = a.IsInitValue()?&a.GetInitValue():NULL; + } - bool sv; + STD::sprintf(b,"%s {",GetString(sym)); b += strlen(b); // get attribute - attritem *attr = th->FindAttrib(GetSymbol(la[i]),true); + AttrItem *gattr = th->FindAttrib(sym,true); - if(attr) { - // Attribute is gettable - - // Get attribute value - AtomList lv; - th->GetAttrib(attr,lv); - - sv = th->GetAttribSave(attr); - - for(int j = 0; j < lv.Count(); ++j) { - if(IsString(lv[j])) - STD::sprintf(b,"%s",GetString(lv[j])); - else if(IsFloat(lv[j])) - STD::sprintf(b,"%f",GetFloat(lv[j])); - else if(IsInt(lv[j])) - STD::sprintf(b,"%i",GetInt(lv[j])); - else - FLEXT_ASSERT(false); - b += strlen(b); - - if(j < lv.Count()-1) *(b++) = ' '; - } + AtomList lv; + if(gattr) { // gettable attribute is present + // Retrieve attribute value + th->GetAttrib(gattr,lv); + + b += PrintList(b,lv.Count(),lv.Atoms()); } - else { - // Attribute is not gettable - sv = false; - // \TODO set flag for tcl/tk dialog + STD::sprintf(b, "} {"); b += strlen(b); + + // get puttable attribute + AttrItem *pattr = th->FindAttrib(GetSymbol(la[i]),false); + + if(pattr) { + // if there is initialization data take this, otherwise take the current data + const AtomList &lp = initdata?*initdata:lv; + + b += PrintList(b,lp.Count(),lp.Atoms()); } - STD::sprintf(b, "} %i %i ", sv?1:0,attr?(attr->BothExist()?2:1):0); b += strlen(b); + STD::sprintf(b, "} %i %i ", sv,pattr?(pattr->BothExist()?2:1):0); b += strlen(b); } strcpy(b, " }\n"); @@ -247,6 +338,18 @@ void flext_base::cb_GfxVis(t_gobj *c, t_glist *gl, int vis) ori_vis(c,gl,vis); } +static void BinbufAdd(t_binbuf *b,const t_atom &at) +{ + if(flext::IsString(at)) + binbuf_addv(b,"s",flext::GetSymbol(at)); + else if(flext::IsFloat(at)) + binbuf_addv(b,"f",flext::GetFloat(at)); + else if(flext::IsInt(at)) + binbuf_addv(b,"i",flext::GetInt(at)); + else + FLEXT_ASSERT(false); +} + void flext_base::cb_GfxSave(t_gobj *c, t_binbuf *b) { flext_base *th = thisObject(c); @@ -258,16 +361,7 @@ void flext_base::cb_GfxSave(t_gobj *c, t_binbuf *b) int cnt = CheckAttrib(argc,argv); // process the creation arguments - for(int i = 1; i < cnt; ++i) { - if(IsString(argv[i])) - binbuf_addv(b,"s",GetSymbol(argv[i])); - else if(IsFloat(argv[i])) - binbuf_addv(b,"f",GetFloat(argv[i])); - else if(IsInt(argv[i])) - binbuf_addv(b,"i",GetInt(argv[i])); - else - FLEXT_ASSERT(false); - } + for(int i = 1; i < cnt; ++i) BinbufAdd(b,argv[i]); // process the attributes AtomList la; @@ -275,28 +369,35 @@ void flext_base::cb_GfxSave(t_gobj *c, t_binbuf *b) char attrname[100]; *attrname= '@'; - for(int i = 0; i < cnt; ++i) { - // must be both settable and gettable.... - attritem *attr = th->FindAttrib(GetSymbol(la[i]),true); - if(attr && attr->BothExist() && th->GetAttribSave(attr)) { - // Get attribute value - AtomList lv; - th->GetAttrib(attr,lv); + for(int i = 0; i < cnt; ++i) { + const t_symbol *sym = GetSymbol(la[i]); + AtomList lv; + const AtomList *lref = NULL; + AttrDataCont::iterator it = th->attrdata->find(sym); + + if(it != th->attrdata->end()) { + const AttrData &a = it->second; + if(a.IsInit() && a.IsInitValue()) + lref = &a.GetInitValue(); + else if(a.IsSaved()) { + AttrItem *attr = th->FindAttrib(sym,true); + + // attribute must be gettable (so that the data can be retrieved) and puttable (so that the data can be inited) + if(attr && attr->BothExist()) { + th->GetAttrib(attr,lv); + lref = &lv; + } + } + } - strcpy(attrname+1,GetString(la[i])); + if(lref) { + // store name + strcpy(attrname+1,GetString(sym)); binbuf_addv(b,"s",MakeSymbol(attrname)); - for(int j = 0; j < lv.Count(); ++j) { - if(IsString(lv[j])) - binbuf_addv(b,"s",GetSymbol(lv[j])); - else if(IsFloat(lv[j])) - binbuf_addv(b,"f",GetFloat(lv[j])); - else if(IsInt(lv[j])) - binbuf_addv(b,"i",GetInt(lv[j])); - else - FLEXT_ASSERT(false); - } + // store value + for(int j = 0; j < lref->Count(); ++j) BinbufAdd(b,(*lref)[j]); } } @@ -311,31 +412,68 @@ bool flext_base::cb_AttrDialog(flext_base *th,int argc,const t_atom *argv) for(; i < argc; ) { FLEXT_ASSERT(IsSymbol(argv[i])); + // get name const t_symbol *aname = GetSymbol(argv[i]); i++; - int cnt,offs; + // get current value + int ccnt,coffs; if(IsSymbol(argv[i]) && GetSymbol(argv[i]) == sym_list) { i++; FLEXT_ASSERT(CanbeInt(argv[i])); - cnt = GetAInt(argv[i]); - offs = ++i; + ccnt = GetAInt(argv[i]); + coffs = ++i; } else - offs = i,cnt = 1; + coffs = i,ccnt = 1; + i += ccnt; - i += cnt; + // get init value + int icnt,ioffs; + if(IsSymbol(argv[i]) && GetSymbol(argv[i]) == sym_list) { + i++; + FLEXT_ASSERT(CanbeInt(argv[i])); + icnt = GetAInt(argv[i]); + ioffs = ++i; + } + else + ioffs = i,icnt = 1; + i += icnt; FLEXT_ASSERT(i < argc); int sv = GetAInt(argv[i]); ++i; - // find settable attribute - attritem *attr = th->FindAttrib(aname,false); + // find puttable attribute + AttrItem *attr = th->FindAttrib(aname,false); if(attr) { - th->SetAttribSave(attr,sv != 0); - bool ret = th->SetAttrib(attr,cnt,argv+offs); + bool ret = th->SetAttrib(attr,ccnt,argv+coffs); FLEXT_ASSERT(ret); + + AttrDataCont::iterator it = th->attrdata->find(aname); + + if(sv >= 1) { + // if data not present create it + if(it == th->attrdata->end()) { + AttrDataPair pair; pair.first = aname; + it = th->attrdata->insert(th->attrdata->begin(),pair); + } + + AttrData &a = it->second; + a.SetSave(sv == 2); + a.SetInit(true); + a.SetInitValue(icnt,argv+ioffs); + } + else { + if(it != th->attrdata->end()) { + AttrData &a = it->second; + // if data is present reset flags + a.SetSave(false); + a.SetInit(false); + + // let init data as is + } + } } else { post("%s - Attribute %s can't be set",th->thisName(),GetString(aname)); @@ -344,5 +482,4 @@ bool flext_base::cb_AttrDialog(flext_base *th,int argc,const t_atom *argv) return true; } - #endif // FLEXT_SYS_PD diff --git a/externals/grill/flext/source/flbind.cpp b/externals/grill/flext/source/flbind.cpp index 4422eac6..a74ed33b 100644 --- a/externals/grill/flext/source/flbind.cpp +++ b/externals/grill/flext/source/flbind.cpp @@ -56,11 +56,11 @@ void flext_base::SetupBindProxy() } -flext_base::binditem::binditem(int in,const t_symbol *sym,bool (*f)(flext_base *,t_symbol *s,int,t_atom *,void *data),pxbnd_object *p): - item(sym,0,NULL),fun(f),px(p) +flext_base::BindItem::BindItem(int in,const t_symbol *sym,bool (*f)(flext_base *,t_symbol *s,int,t_atom *,void *data),pxbnd_object *p): + Item(sym,0,NULL),fun(f),px(p) {} -flext_base::binditem::~binditem() +flext_base::BindItem::~BindItem() { if(px) { #if FLEXT_SYS == FLEXT_SYS_PD @@ -92,7 +92,7 @@ flext_base::binditem::~binditem() bool flext_base::BindMethod(const t_symbol *sym,bool (*fun)(flext_base *,t_symbol *s,int argc,t_atom *argv,void *data),void *data) { if(!bindhead) - bindhead = new itemarr; + bindhead = new ItemCont; else { // Search for symbol if(bindhead->Find(sym,0)) { @@ -117,7 +117,7 @@ bool flext_base::BindMethod(const t_symbol *sym,bool (*fun)(flext_base *,t_symbo #endif if(px) { - binditem *mi = new binditem(0,sym,fun,px); + BindItem *mi = new BindItem(0,sym,fun,px); bindhead->Add(mi); px->init(this,mi,data); @@ -145,9 +145,9 @@ bool flext_base::UnbindMethod(const t_symbol *sym,bool (*fun)(flext_base *,t_sym bool ok = false; if(bindhead) { - binditem *it = NULL; + BindItem *it = NULL; if(sym) { - it = (binditem *)bindhead->Find(sym,0); + it = (BindItem *)bindhead->Find(sym,0); while(it) { if(it->tag == sym && (!fun || it->fun == fun)) break; } @@ -157,7 +157,7 @@ bool flext_base::UnbindMethod(const t_symbol *sym,bool (*fun)(flext_base *,t_sym if(!sz) sz = 1; for(int i = 0; i < sz; ++i) { - for(it = (binditem *)bindhead->Item(i); it; it = (binditem *)it->nxt) { + for(it = (BindItem *)bindhead->GetItem(i); it; it = (BindItem *)it->nxt) { if(it->tag == sym && (!fun || it->fun == fun)) break; } if(it) break; @@ -180,7 +180,7 @@ bool flext_base::UnbindAll() if(!sz) sz = 1; for(int i = 0; i < sz; ++i) { - for(binditem *it = (binditem *)bindhead->Item(i); it; it = (binditem *)it->nxt) { + for(BindItem *it = (BindItem *)bindhead->GetItem(i); it; it = (BindItem *)it->nxt) { // if(it->px->data) memleak = true; if(bindhead->Remove(it)) delete it; } diff --git a/externals/grill/flext/source/flclass.h b/externals/grill/flext/source/flclass.h index 6536590f..689767d2 100644 --- a/externals/grill/flext/source/flclass.h +++ b/externals/grill/flext/source/flclass.h @@ -20,6 +20,9 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include "flbase.h" #include "flsupport.h" +#include +#include +#include #ifdef _MSC_VER #pragma warning(disable: 4786) @@ -573,33 +576,33 @@ protected: public: - class attritem; + class AttrItem; - class item { + class Item { public: - item(const t_symbol *t,int inl,attritem *a); - virtual ~item(); + Item(const t_symbol *t,int inl,AttrItem *a); + virtual ~Item(); bool IsAttr() const { return attr != NULL; } const t_symbol *tag; int inlet; - attritem *attr; - item *nxt; + AttrItem *attr; + Item *nxt; }; //! This class holds hashed item entries - class itemarr { + class ItemCont { public: - itemarr(); - ~itemarr(); + ItemCont(); + ~ItemCont(); //! Add an entry - void Add(item *it); + void Add(Item *it); //! Remove an entry - bool Remove(item *it); - //! Find an entry in the item array - item *Find(const t_symbol *tag,int inlet = 0) const; + bool Remove(Item *it); + //! Find an entry in the Item array + Item *Find(const t_symbol *tag,int inlet = 0) const; //! Create hash table out of the preliminary linked lists void Finalize(); @@ -612,22 +615,22 @@ protected: int Size() const { return bits?1< AttrDataCont; + typedef std::pair AttrDataPair; + + // these outlet functions don't check for thread but send directly to the real-time system void ToSysBang(int n) const; void ToSysFloat(int n,float f) const; @@ -674,11 +698,12 @@ private: public: //! \brief This represents an item of the symbol-bound method list - class binditem: - public item { + class BindItem + :public Item + { public: - binditem(int inlet,const t_symbol *sym,bool (*f)(flext_base *,t_symbol *s,int,t_atom *,void *),pxbnd_object *px); - virtual ~binditem(); + BindItem(int inlet,const t_symbol *sym,bool (*f)(flext_base *,t_symbol *s,int,t_atom *,void *),pxbnd_object *px); + virtual ~BindItem(); bool (*fun)(flext_base *,t_symbol *s,int,t_atom *,void *); pxbnd_object *px; @@ -686,15 +711,15 @@ public: //! @} FLEXT_CLASS - itemarr *ThMeths() { return methhead; } - static itemarr *ClMeths(t_classid c) { return GetClassArr(c,0); } + ItemCont *ThMeths() { return methhead; } + static ItemCont *ClMeths(t_classid c) { return GetClassArr(c,0); } - static void AddMethod(itemarr *ma,int inlet,const char *tag,methfun fun,metharg tp,...); + static void AddMethod(ItemCont *ma,int inlet,const char *tag,methfun fun,metharg tp,...); - itemarr *ThAttrs() { return attrhead; } - static itemarr *ClAttrs(t_classid c) { return GetClassArr(c,1); } + ItemCont *ThAttrs() { return attrhead; } + static ItemCont *ClAttrs(t_classid c) { return GetClassArr(c,1); } - static void AddAttrib(itemarr *aa,itemarr *ma,const char *attr,metharg tp,methfun gfun,methfun sfun); + static void AddAttrib(ItemCont *aa,ItemCont *ma,const char *attr,metharg tp,methfun gfun,methfun sfun); void AddAttrib(const char *attr,metharg tp,methfun gfun,methfun sfun); static void AddAttrib(t_classid c,const char *attr,metharg tp,methfun gfun,methfun sfun); @@ -732,33 +757,32 @@ private: typedef bool (*methfun_4)(flext_base *c,t_any &,t_any &,t_any &,t_any &); typedef bool (*methfun_5)(flext_base *c,t_any &,t_any &,t_any &,t_any &,t_any &); - static itemarr *GetClassArr(t_classid,int ix); + static ItemCont *GetClassArr(t_classid,int ix); - itemarr *methhead,*clmethhead; - itemarr *bindhead; + ItemCont *methhead,*clmethhead; + ItemCont *bindhead; - bool CallMeth(const methitem &m,int argc,const t_atom *argv); + bool CallMeth(const MethItem &m,int argc,const t_atom *argv); bool FindMeth(int inlet,const t_symbol *s,int argc,const t_atom *argv); - bool TryMethTag(const methitem *m,int inlet,const t_symbol *t,int argc,const t_atom *argv); - bool TryMethSym(const methitem *m,int inlet,const t_symbol *t,const t_symbol *s); - bool TryMethAny(const methitem *m,int inlet,const t_symbol *t,const t_symbol *s,int argc,const t_atom *argv); + bool TryMethTag(const MethItem *m,int inlet,const t_symbol *t,int argc,const t_atom *argv); + bool TryMethSym(const MethItem *m,int inlet,const t_symbol *t,const t_symbol *s); + bool TryMethAny(const MethItem *m,int inlet,const t_symbol *t,const t_symbol *s,int argc,const t_atom *argv); - itemarr *attrhead,*clattrhead; + ItemCont *attrhead,*clattrhead; + AttrDataCont *attrdata; - attritem *FindAttrib(const t_symbol *tag,bool get,bool msg = false) const; + AttrItem *FindAttrib(const t_symbol *tag,bool get,bool msg = false) const; static int CheckAttrib(int argc,const t_atom *argv); bool InitAttrib(int argc,const t_atom *argv); bool ListMethods(int inlet = 0) const; bool ListAttrib() const; - bool GetAttrib(attritem *a); - bool GetAttrib(attritem *a,AtomList &l) const; + bool GetAttrib(AttrItem *a); + bool GetAttrib(AttrItem *a,AtomList &l) const; bool SetAttrib(const t_symbol *s,int argc,const t_atom *argv); - bool SetAttrib(attritem *a,int argc,const t_atom *argv); - - void SetAttribSave(attritem *a,bool save); - bool GetAttribSave(attritem *a) const { return a->IsSaved(); } + bool SetAttrib(AttrItem *a,int argc,const t_atom *argv); + bool SetAttrib(AttrItem *a,const AtomList &l) { return SetAttrib(a,l.Count(),l.Atoms()); } static bool cb_ListMethods(flext_base *c,int argc,const t_atom *argv); static bool cb_ListAttrib(flext_base *c) { return c->ListAttrib(); } @@ -839,10 +863,10 @@ private: public: t_object obj; // MUST reside at memory offset 0 flext_base *base; - binditem *item; + BindItem *item; void *data; - void init(flext_base *b,binditem *it,void *d) { base = b; item = it; data = d; } + void init(flext_base *b,BindItem *it,void *d) { base = b; item = it; data = d; } static void px_method(pxbnd_object *c,const t_symbol *s,int argc,t_atom *argv); }; diff --git a/externals/grill/flext/source/flext.cpp b/externals/grill/flext/source/flext.cpp index b75e5472..a6b651aa 100644 --- a/externals/grill/flext/source/flext.cpp +++ b/externals/grill/flext/source/flext.cpp @@ -37,16 +37,19 @@ flext_base::FLEXT_CLASSDEF(flext_base)(): t_classid clid = thisClassId(); clmethhead = ClMeths(clid); - methhead = new itemarr; + methhead = new ItemCont; bindhead = NULL; if(procattr) { // initialize when attribute processing is enabled - attrhead = new itemarr; + attrhead = new ItemCont; clattrhead = ClAttrs(clid); + attrdata = new AttrDataCont; } - else + else { attrhead = clattrhead = NULL; + attrdata = NULL; + } } flext_base::~FLEXT_CLASSDEF(flext_base)() @@ -68,6 +71,7 @@ flext_base::~FLEXT_CLASSDEF(flext_base)() if(methhead) delete methhead; if(bindhead) delete bindhead; // ATTENTION: the object must free all memory associated to bindings itself if(attrhead) delete attrhead; + if(attrdata) delete attrdata; // destroy inlets and outlets and their proxy objects if(inlist) delete inlist; diff --git a/externals/grill/flext/source/flitem.cpp b/externals/grill/flext/source/flitem.cpp index 1980f26c..c2b36057 100755 --- a/externals/grill/flext/source/flitem.cpp +++ b/externals/grill/flext/source/flitem.cpp @@ -16,23 +16,23 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include -flext_base::item::item(const t_symbol *t,int inl,attritem *a): +flext_base::Item::Item(const t_symbol *t,int inl,AttrItem *a): tag(t),inlet(inl),attr(a),nxt(NULL) {} -flext_base::item::~item() +flext_base::Item::~Item() { if(nxt) delete nxt; } -flext_base::itemarr::itemarr(): - arr(new item *[2]),cnt(0),bits(-1) +flext_base::ItemCont::ItemCont(): + arr(new Item *[2]),cnt(0),bits(-1) { arr[0] = arr[1] = NULL; } -flext_base::itemarr::~itemarr() +flext_base::ItemCont::~ItemCont() { if(Ready()) { // if finalized, the array has several slots @@ -47,7 +47,7 @@ flext_base::itemarr::~itemarr() delete[] arr; } -void flext_base::itemarr::Add(item *it) +void flext_base::ItemCont::Add(Item *it) { if(Ready()) { // retrieve array index @@ -55,7 +55,7 @@ void flext_base::itemarr::Add(item *it) // add to array slot if(arr[ix]) { - item *a = arr[ix]; + Item *a = arr[ix]; while(a->nxt) a = a->nxt; a->nxt = it; } @@ -72,7 +72,7 @@ void flext_base::itemarr::Add(item *it) } } -bool flext_base::itemarr::Remove(item *it) +bool flext_base::ItemCont::Remove(Item *it) { if(Ready()) { // retrieve array index @@ -80,7 +80,7 @@ bool flext_base::itemarr::Remove(item *it) // remove from array slot if(arr[ix]) { - item *a1 = NULL,*a = arr[ix]; + Item *a1 = NULL,*a = arr[ix]; while(a && a != it) a1 = a,a = a->nxt; if(a) { // found (a == it) if(a1) a1->nxt = it->nxt; @@ -99,7 +99,7 @@ bool flext_base::itemarr::Remove(item *it) if(!arr[0]) return false; else { - item *a1 = NULL,*a = arr[0]; + Item *a1 = NULL,*a = arr[0]; while(a && a != it) a1 = a,a = a->nxt; if(a) { // found (a == it) if(a1) a1->nxt = it->nxt; @@ -115,7 +115,7 @@ bool flext_base::itemarr::Remove(item *it) } } -void flext_base::itemarr::Finalize() +void flext_base::ItemCont::Finalize() { if(!Ready()) { @@ -126,14 +126,14 @@ void flext_base::itemarr::Finalize() int sz = Size(); // save stored item list - item *lst = arr[0]; + Item *lst = arr[0]; delete[] arr; - arr = new item *[sz]; + arr = new Item *[sz]; memset(arr,0,sz*sizeof(*arr)); while(lst) { - item *l = lst; + Item *l = lst; lst = lst->nxt; l->nxt = NULL; @@ -157,9 +157,9 @@ void flext_base::itemarr::Finalize() } } -flext_base::item *flext_base::itemarr::Find(const t_symbol *tag,int inlet) const +flext_base::Item *flext_base::ItemCont::Find(const t_symbol *tag,int inlet) const { - item *a; + Item *a; if(!Ready()) a = arr[0]; else if(Count()) { @@ -176,7 +176,7 @@ flext_base::item *flext_base::itemarr::Find(const t_symbol *tag,int inlet) const return a; } -int flext_base::itemarr::Hash(const t_symbol *tag,int inlet,int bits) +int flext_base::ItemCont::Hash(const t_symbol *tag,int inlet,int bits) { unsigned long h = ((reinterpret_cast(tag)&~7L)<<1)+inlet; return FoldBits(h,bits); @@ -199,14 +199,14 @@ public: flext_obj::t_classid clid; int ix; - flext_base::itemarr *arr; + flext_base::ItemCont *arr; _itemarr *nxt; }; _itemarr::_itemarr(flext_obj::t_classid c,int i): clid(c),ix(i), - arr(new flext_base::itemarr), + arr(new flext_base::ItemCont), nxt(NULL) {} @@ -230,7 +230,7 @@ int _itemarr::Hash(flext_obj::t_classid c,int ix) static _itemarr **_arrs = NULL; -flext_base::itemarr *flext_base::GetClassArr(t_classid c,int ix) +flext_base::ItemCont *flext_base::GetClassArr(t_classid c,int ix) { if(!_arrs) { _arrs = new _itemarr *[_itemarr::HASHSIZE]; diff --git a/externals/grill/flext/source/flmeth.cpp b/externals/grill/flext/source/flmeth.cpp index 5e6a86b4..3637529e 100755 --- a/externals/grill/flext/source/flmeth.cpp +++ b/externals/grill/flext/source/flmeth.cpp @@ -17,18 +17,18 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include #include "flinternal.h" -flext_base::methitem::methitem(int in,const t_symbol *tg,attritem *conn): - item(tg,in,conn), +flext_base::MethItem::MethItem(int in,const t_symbol *tg,AttrItem *conn): + Item(tg,in,conn), argc(0),args(NULL) ,fun(NULL) {} -flext_base::methitem::~methitem() +flext_base::MethItem::~MethItem() { if(args) delete[] args; } -void flext_base::methitem::SetArgs(methfun _fun,int _argc,metharg *_args) +void flext_base::MethItem::SetArgs(methfun _fun,int _argc,metharg *_args) { fun = _fun; if(args) delete[] args; @@ -38,12 +38,12 @@ void flext_base::methitem::SetArgs(methfun _fun,int _argc,metharg *_args) void flext_base::AddMethodDef(int inlet,const char *tag) { - methhead->Add(new methitem(inlet,tag?MakeSymbol(tag):NULL)); + methhead->Add(new MethItem(inlet,tag?MakeSymbol(tag):NULL)); } /*! \brief Add a method to the queue */ -void flext_base::AddMethod(itemarr *ma,int inlet,const char *tag,methfun fun,metharg tp,...) +void flext_base::AddMethod(ItemCont *ma,int inlet,const char *tag,methfun fun,metharg tp,...) { va_list marker; @@ -81,7 +81,7 @@ void flext_base::AddMethod(itemarr *ma,int inlet,const char *tag,methfun fun,met va_end(marker); } - methitem *mi = new methitem(inlet,MakeSymbol(tag)); + MethItem *mi = new MethItem(inlet,MakeSymbol(tag)); mi->SetArgs(fun,argc,args); diff --git a/externals/grill/flext/source/flmsg.cpp b/externals/grill/flext/source/flmsg.cpp index c558a270..9b1eba40 100755 --- a/externals/grill/flext/source/flmsg.cpp +++ b/externals/grill/flext/source/flmsg.cpp @@ -14,7 +14,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include "flext.h" -bool flext_base::CallMeth(const methitem &m,int argc,const t_atom *argv) +bool flext_base::CallMeth(const MethItem &m,int argc,const t_atom *argv) { bool ret = false; int ix; @@ -72,7 +72,7 @@ bool flext_base::CallMeth(const methitem &m,int argc,const t_atom *argv) return ret; } -bool flext_base::TryMethTag(const methitem *m,int inlet,const t_symbol *t,int argc,const t_atom *argv) +bool flext_base::TryMethTag(const MethItem *m,int inlet,const t_symbol *t,int argc,const t_atom *argv) { do { if(m->inlet == inlet && m->tag == t) { @@ -99,11 +99,11 @@ bool flext_base::TryMethTag(const methitem *m,int inlet,const t_symbol *t,int ar if(argc == m->argc && CallMeth(*m,argc,argv)) return true; } } - } while((m = (const methitem *)m->nxt) != NULL); + } while((m = (const MethItem *)m->nxt) != NULL); return false; } -bool flext_base::TryMethSym(const methitem *m,int inlet,const t_symbol *t,const t_symbol *s) +bool flext_base::TryMethSym(const MethItem *m,int inlet,const t_symbol *t,const t_symbol *s) { do { if(!m->IsAttr() && m->inlet == inlet && m->tag == t) { @@ -112,11 +112,11 @@ bool flext_base::TryMethSym(const methitem *m,int inlet,const t_symbol *t,const t_any sym; sym.st = const_cast(s); if(((methfun_1)m->fun)(this,sym)) return true; } - } while((m = (const methitem *)m->nxt) != NULL); + } while((m = (const MethItem *)m->nxt) != NULL); return false; } -bool flext_base::TryMethAny(const methitem *m,int inlet,const t_symbol *t,const t_symbol *s,int argc,const t_atom *argv) +bool flext_base::TryMethAny(const MethItem *m,int inlet,const t_symbol *t,const t_symbol *s,int argc,const t_atom *argv) { do { if(!m->IsAttr() && m->inlet == inlet && m->tag == t) { @@ -124,7 +124,7 @@ bool flext_base::TryMethAny(const methitem *m,int inlet,const t_symbol *t,const if(((methfun_A)m->fun)(this,s,argc,const_cast(argv))) return true; } - } while((m = (const methitem *)m->nxt) != NULL); + } while((m = (const MethItem *)m->nxt) != NULL); return false; } @@ -133,21 +133,21 @@ bool flext_base::TryMethAny(const methitem *m,int inlet,const t_symbol *t,const */ bool flext_base::FindMeth(int inlet,const t_symbol *s,int argc,const t_atom *argv) { - methitem *m; + MethItem *m; // search for exactly matching tag - if((m = (methitem *)methhead->Find(s,inlet)) != NULL && TryMethTag(m,inlet,s,argc,argv)) return true; - if((m = (methitem *)clmethhead->Find(s,inlet)) != NULL && TryMethTag(m,inlet,s,argc,argv)) return true; + if((m = (MethItem *)methhead->Find(s,inlet)) != NULL && TryMethTag(m,inlet,s,argc,argv)) return true; + if((m = (MethItem *)clmethhead->Find(s,inlet)) != NULL && TryMethTag(m,inlet,s,argc,argv)) return true; // if no list args, then search for pure symbol if(!argc) { - if((m = (methitem *)methhead->Find(sym_symbol,inlet)) != NULL && TryMethSym(m,inlet,sym_symbol,s)) return true; - if((m = (methitem *)clmethhead->Find(sym_symbol,inlet)) != NULL && TryMethSym(m,inlet,sym_symbol,s)) return true; + if((m = (MethItem *)methhead->Find(sym_symbol,inlet)) != NULL && TryMethSym(m,inlet,sym_symbol,s)) return true; + if((m = (MethItem *)clmethhead->Find(sym_symbol,inlet)) != NULL && TryMethSym(m,inlet,sym_symbol,s)) return true; } // otherwise search for anything - if((m = (methitem *)methhead->Find(sym_anything,inlet)) != NULL && m->argc == 1 && m->args[0] == a_any && TryMethAny(m,inlet,sym_anything,s,argc,argv)) return true; - if((m = (methitem *)clmethhead->Find(sym_anything,inlet)) != NULL && m->argc == 1 && m->args[0] == a_any && TryMethAny(m,inlet,sym_anything,s,argc,argv)) return true; + if((m = (MethItem *)methhead->Find(sym_anything,inlet)) != NULL && m->argc == 1 && m->args[0] == a_any && TryMethAny(m,inlet,sym_anything,s,argc,argv)) return true; + if((m = (MethItem *)clmethhead->Find(sym_anything,inlet)) != NULL && m->argc == 1 && m->args[0] == a_any && TryMethAny(m,inlet,sym_anything,s,argc,argv)) return true; // if nothing found try any inlet return inlet >= 0 && FindMeth(-1,s,argc,argv); -- cgit v1.2.1