diff options
author | Thomas Grill <xovo@users.sourceforge.net> | 2009-04-01 21:13:09 +0000 |
---|---|---|
committer | Thomas Grill <xovo@users.sourceforge.net> | 2009-04-01 21:13:09 +0000 |
commit | 0ed7a8b68dd73e2b0473b8127aeca99f3bac9061 (patch) | |
tree | 5c67818b38a5cc2f9caa5ca7f8640ca356adf02b /externals/grill/flext/source/flmsg.cpp | |
parent | bb4c7f6a245394d09dac9adfb2efb093d3d98452 (diff) |
cleaned up grill externals - replaced with svn:externals to svn.grrrr.org/ext/trunk/
svn path=/trunk/; revision=10951
Diffstat (limited to 'externals/grill/flext/source/flmsg.cpp')
-rw-r--r-- | externals/grill/flext/source/flmsg.cpp | 295 |
1 files changed, 0 insertions, 295 deletions
diff --git a/externals/grill/flext/source/flmsg.cpp b/externals/grill/flext/source/flmsg.cpp deleted file mode 100644 index 1d42b5fb..00000000 --- a/externals/grill/flext/source/flmsg.cpp +++ /dev/null @@ -1,295 +0,0 @@ -/* - -flext - C++ layer for Max/MSP and pd (pure data) externals - -Copyright (c) 2001-2006 Thomas Grill (gr@grrrr.org) -For information on usage and redistribution, and for a DISCLAIMER OF ALL -WARRANTIES, see the file, "license.txt," in this distribution. - -*/ - -/*! \file flmsg.cpp - \brief Message processing of flext base class. -*/ - -#include "flext.h" - - -bool flext_base::TryMethTag(Item *lst,const t_symbol *tag,int argc,const t_atom *argv) -{ - for(; lst; lst = lst->nxt) { - MethItem *m = (MethItem *)lst; - -// FLEXT_LOG3("found method tag %s: inlet=%i, argc=%i",GetString(tag),m->inlet,argc); - - if(m->attr) { - // attributes are treated differently - - if(m->attr->IsGet()) - return DumpAttrib(tag,m->attr); - else - return SetAttrib(tag,m->attr,argc,argv); - } - else { - if(m->argc == 1) { - if(m->args[0] == a_list) { - // try list - if(((methfun_V)m->fun)(this,argc,const_cast<t_atom *>(argv))) return true; - } - else if(m->args[0] == a_any) { - // try anything - if(((methfun_A)m->fun)(this,tag,argc,const_cast<t_atom *>(argv))) return true; - } - } - - // try matching number of args - if(m->argc == argc) { - int ix; - t_any aargs[FLEXT_MAXMETHARGS]; - bool ok = true; - for(ix = 0; ix < argc && ok; ++ix) { - switch(m->args[ix]) { - case a_float: { - if(IsFloat(argv[ix])) aargs[ix].ft = GetFloat(argv[ix]); - else if(IsInt(argv[ix])) aargs[ix].ft = (float)GetInt(argv[ix]); - else ok = false; - - if(ok) FLEXT_LOG2("int arg %i = %f",ix,aargs[ix].ft); - break; - } - case a_int: { - if(IsFloat(argv[ix])) aargs[ix].it = (int)GetFloat(argv[ix]); - else if(IsInt(argv[ix])) aargs[ix].it = GetInt(argv[ix]); - else ok = false; - - if(ok) FLEXT_LOG2("float arg %i = %i",ix,aargs[ix].it); - break; - } - case a_symbol: { - if(IsSymbol(argv[ix])) aargs[ix].st = GetSymbol(argv[ix]); - else ok = false; - - if(ok) FLEXT_LOG2("symbol arg %i = %s",ix,GetString(aargs[ix].st)); - break; - } -#if FLEXT_SYS == FLEXT_SYS_PD - case a_pointer: { - if(IsPointer(argv[ix])) aargs[ix].pt = (t_gpointer *)GetPointer(argv[ix]); - else ok = false; - break; - } -#endif - default: - error("Argument type illegal"); - ok = false; - } - } - - if(ok && ix == argc) { - switch(argc) { - case 0: return ((methfun_0)m->fun)(this); - case 1: return ((methfun_1)m->fun)(this,aargs[0]); - case 2: return ((methfun_2)m->fun)(this,aargs[0],aargs[1]); - case 3: return ((methfun_3)m->fun)(this,aargs[0],aargs[1],aargs[2]); - case 4: return ((methfun_4)m->fun)(this,aargs[0],aargs[1],aargs[2],aargs[3]); - case 5: return ((methfun_5)m->fun)(this,aargs[0],aargs[1],aargs[2],aargs[3],aargs[4]); - default: - FLEXT_ASSERT(false); - } - } - } - } - } - return false; -} - - -bool flext_base::TryMethAny(Item *lst,const t_symbol *s,int argc,const t_atom *argv) -{ - for(; lst; lst = lst->nxt) { - MethItem *m = (MethItem *)lst; - - if(!m->IsAttr() && m->argc == 1 && m->args[0] == a_any) { -// FLEXT_LOG4("found any method for %s: inlet=%i, symbol=%s, argc=%i",GetString(m->tag),m->inlet,GetString(s),argc); - - if(((methfun_A)m->fun)(this,s,argc,const_cast<t_atom *>(argv))) return true; - } - } - return false; -} - -/*! \brief Find a method item for a specific tag and arguments - \remark All attributes are also stored in the method list and retrieved by a member of the method item -*/ -bool flext_base::FindMeth(int inlet,const t_symbol *s,int argc,const t_atom *argv) -{ - Item *lst; - ItemCont *clmethhead = ClMeths(thisClassId()); - - // search for exactly matching tag - if(UNLIKELY(methhead) && (lst = methhead->FindList(s,inlet)) != NULL && TryMethTag(lst,s,argc,argv)) return true; - if((lst = clmethhead->FindList(s,inlet)) != NULL && TryMethTag(lst,s,argc,argv)) return true; - - // if nothing found try any inlet - if(UNLIKELY(methhead) && (lst = methhead->FindList(s,-1)) != NULL && TryMethTag(lst,s,argc,argv)) return true; - if((lst = clmethhead->FindList(s,-1)) != NULL && TryMethTag(lst,s,argc,argv)) return true; - - return false; -} - -bool flext_base::FindMethAny(int inlet,const t_symbol *s,int argc,const t_atom *argv) -{ - Item *lst; - ItemCont *clmethhead = ClMeths(thisClassId()); - - if(UNLIKELY(methhead) && (lst = methhead->FindList(sym_anything,inlet)) != NULL && TryMethAny(lst,s,argc,argv)) return true; - if((lst = clmethhead->FindList(sym_anything,inlet)) != NULL && TryMethAny(lst,s,argc,argv)) return true; - - // if nothing found try any inlet - if(UNLIKELY(methhead) && (lst = methhead->FindList(sym_anything,-1)) != NULL && TryMethAny(lst,s,argc,argv)) return true; - if((lst = clmethhead->FindList(sym_anything,-1)) != NULL && TryMethAny(lst,s,argc,argv)) return true; - - return false; -} - -/*! \brief All the message processing - The messages of all the inlets go here and are promoted to the registered callback functions -*/ -bool flext_base::CbMethodHandler(int inlet,const t_symbol *s,int argc,const t_atom *argv) -{ - static bool trap = false; - bool ret; - - curtag = s; - -#ifdef FLEXT_LOG_MSGS - post("methodmain inlet:%i args:%i symbol:%s",inlet,argc,s?GetString(s):""); -#endif - - try { - ret = FindMeth(inlet,s,argc,argv); -#ifdef FLEXT_LOG_MSGS - if(ret) post("found %s message in %s,%i",GetString(s),__FILE__,__LINE__); -#endif - if(ret) goto end; - - if(argc == 1) { - if(s == sym_list) { - // for 1-element lists try the single atom (this is the format output by [route]) - if(IsFloat(argv[0])) - ret = FindMeth(inlet,sym_float,1,argv); - else if(IsInt(argv[0])) - ret = FindMeth(inlet,sym_int,1,argv); - else if(IsSymbol(argv[0])) - ret = FindMeth(inlet,sym_symbol,1,argv); - #if FLEXT_SYS == FLEXT_SYS_PD && !defined(FLEXT_COMPATIBLE) - else if(IsPointer(argv[0])) - ret = FindMeth(inlet,sym_pointer,1,argv); - #endif - if(ret) goto end; - } - else { - if(s == sym_float) { - #if FLEXT_SYS == FLEXT_SYS_MAX - t_atom at; - // If float message is not explicitly handled: try int handler instead - SetInt(at,(int)GetFloat(argv[0])); - ret = FindMeth(inlet,sym_int,1,&at); - if(ret) goto end; - #endif - // If not explicitly handled: try list handler instead - ret = FindMeth(inlet,sym_list,1,argv); - if(ret) goto end; - } - #if FLEXT_SYS == FLEXT_SYS_MAX - else if(s == sym_int) { - t_atom at; - // If int message is not explicitly handled: try float handler instead - SetFloat(at,(float)GetInt(argv[0])); - ret = FindMeth(inlet,sym_float,1,&at); - if(ret) goto end; - // If not explicitly handled: try list handler instead - ret = FindMeth(inlet,sym_list,1,argv); - if(ret) goto end; - } - #endif - else if(s == sym_symbol) { - ret = FindMeth(inlet,sym_list,1,argv); - if(ret) goto end; - } - #if FLEXT_SYS == FLEXT_SYS_PD && !defined(FLEXT_COMPATIBLE) - else if(s == sym_pointer) { - ret = FindMeth(inlet,sym_list,1,argv); - if(ret) goto end; - } - #endif - } - } - else if(argc == 0) { - // If symbol message (pure anything without args) is not explicitly handled: try list handler instead - t_atom at; - SetSymbol(at,s); - ret = FindMeth(inlet,sym_list,1,&at); -#ifdef FLEXT_LOG_MSGS - if(ret) post("found %s message in %s,%i",GetString(sym_list),__FILE__,__LINE__); -#endif - if(ret) goto end; - } - - // if distmsgs is switched on then distribute list elements over inlets (Max/MSP behavior) - if(DoDist() && inlet == 0 && s == sym_list && insigs <= 1 && !trap) { - int i = incnt; - if(i > argc) i = argc; - for(--i; i >= 0; --i) { // right to left distribution - const t_symbol *sym = NULL; - if(IsFloat(argv[i])) sym = sym_float; - else if(IsInt(argv[i])) sym = sym_int; - else if(IsSymbol(argv[i])) sym = sym_symbol; - #if FLEXT_SYS == FLEXT_SYS_PD && !defined(FLEXT_COMPATIBLE) - else if(IsPointer(argv[i])) sym = sym_pointer; // can pointer atoms occur here? - #endif - - if(sym) { - trap = true; - CbMethodHandler(i,sym,1,argv+i); - trap = false; - } - } - - goto end; - } - - ret = FindMethAny(inlet,s,argc,argv); - - if(!ret) ret = CbMethodResort(inlet,s,argc,argv); - } - catch(std::exception &x) { - error("%s - %s: %s",thisName(),GetString(s),x.what()); - ret = false; - } - catch(const char *txt) { - error("%s - %s: %s",thisName(),GetString(s),txt); - ret = false; - } - catch(...) { - error("%s - %s : Unknown exception while processing method",thisName(),GetString(s)); - ret = false; - } - -end: - curtag = NULL; - - return ret; // true if appropriate handler was found and called -} - -bool flext_base::m_method_(int inlet,const t_symbol *s,int argc,const t_atom *argv) -{ - post("%s: message unhandled - inlet:%i args:%i symbol:%s",thisName(),inlet,argc,s?GetString(s):""); - return false; -} - -bool flext_base::CbMethodResort(int inlet,const t_symbol *s,int argc,const t_atom *argv) -{ - // call deprecated version - return m_method_(inlet,s,argc,argv); -} |