diff options
Diffstat (limited to 'externals/grill/prepend/main.cpp')
-rw-r--r-- | externals/grill/prepend/main.cpp | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/externals/grill/prepend/main.cpp b/externals/grill/prepend/main.cpp new file mode 100644 index 00000000..466ae70f --- /dev/null +++ b/externals/grill/prepend/main.cpp @@ -0,0 +1,131 @@ +/* + +prepend - just like in MaxMSP + +Copyright (c) 2002 Thomas Grill (xovo@gmx.net) +For information on usage and redistribution, and for a DISCLAIMER OF ALL +WARRANTIES, see the file, "license.txt," in this distribution. + +*/ + +#include <flext.h> + +#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 202) +#error You need at least flext version 0.2.2 +#endif + +#define PREPEND_VERSION "0.0.2" + +class prepend: + public flext_base +{ + FLEXT_HEADER(prepend, flext_base) + +public: + prepend(int argc,t_atom *argv); + +protected: + void m_bang(); + void m_set(int argc,t_atom *argv) { reg[0].Store(NULL,argc,argv); } + void m_any0(const t_symbol *s,int argc,t_atom *argv) { reg[1].Store(s,argc,argv); m_bang(); } + void m_any1(const t_symbol *s,int argc,t_atom *argv) { reg[0].Store(s,argc,argv); } + + virtual void m_help(); + +private: + + class reg_t + { + public: + reg_t(): cnt(0),lst(NULL) {} + ~reg_t() { if(lst) delete[] lst; } + + bool Is() const { return cnt && lst; } + bool IsSimple() const { return !IsSymbol(lst[0]); } + bool IsList() const { return IsSymbol(lst[0]) && GetSymbol(lst[0]) == &s_list; } + + void Store(const t_symbol *s,int argc,t_atom *argv); + int cnt; t_atom *lst; + } reg[2]; + + FLEXT_CALLBACK(m_bang) + FLEXT_CALLBACK_G(m_set) + FLEXT_CALLBACK_A(m_any0) + FLEXT_CALLBACK_A(m_any1) +}; + +FLEXT_NEW_G("prepend",prepend) + + + +prepend::prepend(int argc,t_atom *argv) +{ + AddInAnything(2); + AddOutAnything(); + SetupInOut(); // set up inlets and outlets + + FLEXT_ADDMETHOD_(0,"bang",m_bang); +// FLEXT_ADDMETHOD_(0,"set",m_set); + FLEXT_ADDMETHOD(0,m_any0); + FLEXT_ADDMETHOD(1,m_any1); + + m_set(argc,argv); +} + + +void prepend::reg_t::Store(const t_symbol *s,int argc,t_atom *argv) +{ + if(lst) delete[] lst; cnt = 0; + lst = new t_atom[argc+1]; + + if(s && s != &s_float) SetSymbol(lst[cnt++],s); + else if(argc > 0 && !IsSymbol(argv[0])) SetSymbol(lst[cnt++],&s_list); + + for(int i = 0; i < argc; ++i,++cnt) lst[cnt] = argv[i]; +} + +void prepend::m_bang() +{ + t_atom *ret = new t_atom[reg[0].cnt+reg[1].cnt+1]; + int i,rcnt = 0; + + if(reg[0].Is()) { + if(reg[0].IsSimple()) SetSymbol(ret[rcnt++],&s_list); + for(i = reg[0].IsList()?1:0; i < reg[0].cnt; ++i) ret[rcnt++] = reg[0].lst[i]; + } + else + SetSymbol(ret[rcnt++],&s_list); + + if(reg[1].Is()) { + for(i = reg[1].IsList()?1:0; i < reg[1].cnt; ++i) ret[rcnt++] = reg[1].lst[i]; + } + + if(IsSymbol(ret[0])) + ToOutAnything(0,GetSymbol(ret[0]),rcnt-1,ret+1); + else + ToOutList(0,rcnt,ret); + delete[] ret; +} + +void prepend::m_help() +{ + post("%s - just like in Max/MSP, version " PREPEND_VERSION,thisName()); +#ifdef _DEBUG + post("compiled on " __DATE__ " " __TIME__); +#endif + post("(C) Thomas Grill, 2002"); + post(""); + post("Arguments: %s [atoms to prepend]",thisName()); + post("Inlets: 1:triggering atoms"); + post("Inlets: 2:atoms to prepend"); + post("Outlets: 1:sum of prepend"); + post("Methods:"); + post("\thelp: shows this help"); +// post("\tset [atoms]: set atoms to prepend"); + post(""); +} + + + + + |