[PD-cvs] externals/grill/flext/source flatom_app.cpp,1.2,1.3 flatom_part.cpp,1.2,1.3 flatom_pr.cpp,1.17,1.18 flattr_ed.cpp,1.20,1.21 flbase.cpp,1.16,1.17 flbase.h,1.25,1.26 flbind.cpp,1.13,1.14 flbuf.cpp,1.17,1.18 flcwmax-thr.h,1.5,1.6 flcwmax-x-thr.h,1.5,1.6 flcwmax.h,1.7,1.8 flcwpd-x-thr.h,1.3,1.4 flcwpd-x.h,1.4,1.5 fldefs.h,1.17,1.18 fldefs_attradd.h,1.2,1.3 fldefs_attrcb.h,1.3,1.4 fldefs_attrvar.h,1.4,1.5 fldefs_methadd.h,1.2,1.3 fldefs_methcall.h,1.2,1.3 fldefs_methcb.h,1.2,1.3 fldefs_setup.h,1.3,1.4 fldoxygen.h,1.8,1.9 fldsp.cpp,1.20,1.21 flext.cpp,1.27,1.28 flext.h,1.20,1.21 flinternal.h,1.8,1.9 flitem.cpp,1.11,1.12 fllib.cpp,1.24,1.25 flmeth.cpp,1.9,1.10 flmsg.cpp,1.11,1.12 flmspbuffer.h,1.3,1.4 flout.cpp,1.15,1.16 flprefix.h,1.27,1.28 flproxy.cpp,1.6,1.7 flqueue.cpp,1.15,1.16 flsimd.cpp,1.12,1.13 flsndobj.cpp,1.6,1.7 flsndobj.h,1.6,1.7 flstdc.h,1.22,1.23 flstk.cpp,1.4,1.5 flstk.h,1.5,1.6 flsupport.h,1.68,1.69 fltimer.cpp,1.4,1.5 flutil.cpp,1.14,1.15 flxlet.cpp,1.5,1.6

Thomas Grill xovo at users.sourceforge.net
Mon Jun 21 15:58:22 CEST 2004


Update of /cvsroot/pure-data/externals/grill/flext/source
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22846/source

Modified Files:
	flatom_app.cpp flatom_part.cpp flatom_pr.cpp flattr_ed.cpp 
	flbase.cpp flbase.h flbind.cpp flbuf.cpp flcwmax-thr.h 
	flcwmax-x-thr.h flcwmax.h flcwpd-x-thr.h flcwpd-x.h fldefs.h 
	fldefs_attradd.h fldefs_attrcb.h fldefs_attrvar.h 
	fldefs_methadd.h fldefs_methcall.h fldefs_methcb.h 
	fldefs_setup.h fldoxygen.h fldsp.cpp flext.cpp flext.h 
	flinternal.h flitem.cpp fllib.cpp flmeth.cpp flmsg.cpp 
	flmspbuffer.h flout.cpp flprefix.h flproxy.cpp flqueue.cpp 
	flsimd.cpp flsndobj.cpp flsndobj.h flstdc.h flstk.cpp flstk.h 
	flsupport.h fltimer.cpp flutil.cpp flxlet.cpp 
Log Message:
 ""

Index: flqueue.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flqueue.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -C2 -d -r1.15 -r1.16
*** flqueue.cpp	20 Mar 2004 03:23:11 -0000	1.15
--- flqueue.cpp	21 Jun 2004 13:58:19 -0000	1.16
***************
*** 28,68 ****
  {
  public:
! 	qmsg(flext_base *b): nxt(NULL),th(b),tp(tp_none) {}
! 	~qmsg();
  
! 	qmsg *nxt;
  
! 	void Clear();
  
! 	void SetBang(int o) { Clear(); out = o; tp = tp_bang; }
! 	void SetFloat(int o,float f) { Clear(); out = o; tp = tp_float; _float = f; }
! 	void SetInt(int o,int i) { Clear(); out = o; tp = tp_int; _int = i; }
! 	void SetSymbol(int o,const t_symbol *s) { Clear(); out = o; tp = tp_sym; _sym = s; }
! 	void SetList(int o,int argc,const t_atom *argv) { Clear(); out = o; tp = tp_list; _list.argc = argc,_list.argv = flext::CopyList(argc,argv); }
! 	void SetAny(int o,const t_symbol *s,int argc,const t_atom *argv) { Clear(); out = o; tp = tp_any; _any.s = s,_any.argc = argc,_any.argv = flext::CopyList(argc,argv); }
  
! 	flext_base *th;
! 	int out;
! 	enum { tp_none,tp_bang,tp_float,tp_int,tp_sym,tp_list,tp_any } tp;
! 	union {
! 		float _float;
! 		int _int;
! 		const t_symbol *_sym;
! 		struct { int argc; t_atom *argv; } _list;
! 		struct { const t_symbol *s; int argc; t_atom *argv; } _any;
! 	};
  };
  
  qmsg::~qmsg() 
  { 
! 	Clear();
! 	if(nxt) delete nxt; 
  }
  
  void qmsg::Clear() 
  { 
! 	if(tp == tp_list) { if(_list.argv) delete[] _list.argv; }
! 	else if(tp == tp_any) { if(_any.argv) delete[] _any.argv; }
! 	tp = tp_none;
  }
  
--- 28,68 ----
  {
  public:
!     qmsg(flext_base *b): nxt(NULL),th(b),tp(tp_none) {}
!     ~qmsg();
  
!     qmsg *nxt;
  
!     void Clear();
  
!     void SetBang(int o) { Clear(); out = o; tp = tp_bang; }
!     void SetFloat(int o,float f) { Clear(); out = o; tp = tp_float; _float = f; }
!     void SetInt(int o,int i) { Clear(); out = o; tp = tp_int; _int = i; }
!     void SetSymbol(int o,const t_symbol *s) { Clear(); out = o; tp = tp_sym; _sym = s; }
!     void SetList(int o,int argc,const t_atom *argv) { Clear(); out = o; tp = tp_list; _list.argc = argc,_list.argv = flext::CopyList(argc,argv); }
!     void SetAny(int o,const t_symbol *s,int argc,const t_atom *argv) { Clear(); out = o; tp = tp_any; _any.s = s,_any.argc = argc,_any.argv = flext::CopyList(argc,argv); }
  
!     flext_base *th;
!     int out;
!     enum { tp_none,tp_bang,tp_float,tp_int,tp_sym,tp_list,tp_any } tp;
!     union {
!         float _float;
!         int _int;
!         const t_symbol *_sym;
!         struct { int argc; t_atom *argv; } _list;
!         struct { const t_symbol *s; int argc; t_atom *argv; } _any;
!     };
  };
  
  qmsg::~qmsg() 
  { 
!     Clear();
!     if(nxt) delete nxt; 
  }
  
  void qmsg::Clear() 
  { 
!     if(tp == tp_list) { if(_list.argv) delete[] _list.argv; }
!     else if(tp == tp_any) { if(_any.argv) delete[] _any.argv; }
!     tp = tp_none;
  }
  
***************
*** 84,175 ****
  static void QWork(bool qlock,bool syslock)
  {
! 	for(;;) {
! 		// Since qcnt can only be increased from any other function than QWork
! 		// qc will be a minimum guaranteed number of present queue elements.
! 		// On the other hand, if new queue elements are added by the methods called
! 		// in the loop, these will be sent in the next tick to avoid recursion overflow.
! 		int qc = qcnt;
! 		if(!qc) break;
  
! 	#ifdef FLEXT_QTHR
! 		if(syslock) sys_lock();
! 	#endif
  
! 		for(int i = 0; i < qc && qhead; ++i) {
! 	#ifdef FLEXT_THREADS
! 			if(qlock) qmutex.Lock();
! 	#endif
! 			qmsg *m = qhead;
! 			qcnt--;
! 			qhead = m->nxt;
! 			if(!qhead) qtail = NULL;
! 			m->nxt = NULL;
! 	#ifdef FLEXT_THREADS
! 			if(qlock) qmutex.Unlock();
! 	#endif
  
! 			if(m->out < 0) {
! 				// message to self
  
! 				const int n = -1-m->out;
! 				t_atom tmp;
  
! 				switch(m->tp) {
! 				case qmsg::tp_bang: 
! 					m->th->m_methodmain(n,flext::sym_bang,0,&tmp); 
! 					break;
! 				case qmsg::tp_float: 
! 					flext::SetFloat(tmp,m->_float);
! 					m->th->m_methodmain(n,flext::sym_float,1,&tmp); 
! 					break;
! 				case qmsg::tp_int: 
! 					flext::SetInt(tmp,m->_int);
! 	#if FLEXT_SYS == FLEXT_SYS_PD
! 					m->th->m_methodmain(n,flext::sym_float,1,&tmp); 
! 	#elif FLEXT_SYS == FLEXT_SYS_MAX
! 					m->th->m_methodmain(n,flext::sym_int,1,&tmp); 
! 	#else
! 	#error Not implemented!
! 	#endif
! 				case qmsg::tp_sym: 
! 					flext::SetSymbol(tmp,m->_sym);
! 					m->th->m_methodmain(n,flext::sym_symbol,1,&tmp); 
! 					break;
! 				case qmsg::tp_list: 
! 					m->th->m_methodmain(n,flext::sym_list,m->_list.argc,m->_list.argv); 
! 					break;
! 				case qmsg::tp_any: 
! 					m->th->m_methodmain(n,m->_any.s,m->_any.argc,m->_any.argv); 
! 					break;
! 		#ifdef FLEXT_DEBUG
! 				default: ERRINTERNAL();
! 		#endif
! 				}
! 			}
! 			else {
! 				// message to outlet
  
! 				switch(m->tp) {
! 				case qmsg::tp_bang: m->th->ToSysBang(m->out); break;
! 				case qmsg::tp_float: m->th->ToSysFloat(m->out,m->_float); break;
! 				case qmsg::tp_int: m->th->ToSysInt(m->out,m->_int); break;
! 				case qmsg::tp_sym: m->th->ToSysSymbol(m->out,m->_sym); break;
! 				case qmsg::tp_list: m->th->ToSysList(m->out,m->_list.argc,m->_list.argv); break;
! 				case qmsg::tp_any: m->th->ToSysAnything(m->out,m->_any.s,m->_any.argc,m->_any.argv); break;
! 		#ifdef FLEXT_DEBUG
! 				default: ERRINTERNAL();
! 		#endif
! 				}
! 			}
  
! 			// delete processed queue element
! 			delete m;
! 		} // inner loop
  
! 	#ifdef FLEXT_QTHR
! 		if(syslock) sys_unlock();
! 	#endif
  
! 	} // for(;;)
  }
  
--- 84,175 ----
  static void QWork(bool qlock,bool syslock)
  {
!     for(;;) {
!         // Since qcnt can only be increased from any other function than QWork
!         // qc will be a minimum guaranteed number of present queue elements.
!         // On the other hand, if new queue elements are added by the methods called
!         // in the loop, these will be sent in the next tick to avoid recursion overflow.
!         int qc = qcnt;
!         if(!qc) break;
  
!     #ifdef FLEXT_QTHR
!         if(syslock) sys_lock();
!     #endif
  
!         for(int i = 0; i < qc && qhead; ++i) {
!     #ifdef FLEXT_THREADS
!             if(qlock) qmutex.Lock();
!     #endif
!             qmsg *m = qhead;
!             qcnt--;
!             qhead = m->nxt;
!             if(!qhead) qtail = NULL;
!             m->nxt = NULL;
!     #ifdef FLEXT_THREADS
!             if(qlock) qmutex.Unlock();
!     #endif
  
!             if(m->out < 0) {
!                 // message to self
  
!                 const int n = -1-m->out;
!                 t_atom tmp;
  
!                 switch(m->tp) {
!                 case qmsg::tp_bang: 
!                     m->th->m_methodmain(n,flext::sym_bang,0,&tmp); 
!                     break;
!                 case qmsg::tp_float: 
!                     flext::SetFloat(tmp,m->_float);
!                     m->th->m_methodmain(n,flext::sym_float,1,&tmp); 
!                     break;
!                 case qmsg::tp_int: 
!                     flext::SetInt(tmp,m->_int);
!     #if FLEXT_SYS == FLEXT_SYS_PD
!                     m->th->m_methodmain(n,flext::sym_float,1,&tmp); 
!     #elif FLEXT_SYS == FLEXT_SYS_MAX
!                     m->th->m_methodmain(n,flext::sym_int,1,&tmp); 
!     #else
!     #error Not implemented!
!     #endif
!                 case qmsg::tp_sym: 
!                     flext::SetSymbol(tmp,m->_sym);
!                     m->th->m_methodmain(n,flext::sym_symbol,1,&tmp); 
!                     break;
!                 case qmsg::tp_list: 
!                     m->th->m_methodmain(n,flext::sym_list,m->_list.argc,m->_list.argv); 
!                     break;
!                 case qmsg::tp_any: 
!                     m->th->m_methodmain(n,m->_any.s,m->_any.argc,m->_any.argv); 
!                     break;
!         #ifdef FLEXT_DEBUG
!                 default: ERRINTERNAL();
!         #endif
!                 }
!             }
!             else {
!                 // message to outlet
  
!                 switch(m->tp) {
!                 case qmsg::tp_bang: m->th->ToSysBang(m->out); break;
!                 case qmsg::tp_float: m->th->ToSysFloat(m->out,m->_float); break;
!                 case qmsg::tp_int: m->th->ToSysInt(m->out,m->_int); break;
!                 case qmsg::tp_sym: m->th->ToSysSymbol(m->out,m->_sym); break;
!                 case qmsg::tp_list: m->th->ToSysList(m->out,m->_list.argc,m->_list.argv); break;
!                 case qmsg::tp_any: m->th->ToSysAnything(m->out,m->_any.s,m->_any.argc,m->_any.argv); break;
!         #ifdef FLEXT_DEBUG
!                 default: ERRINTERNAL();
!         #endif
!                 }
!             }
  
!             // delete processed queue element
!             delete m;
!         } // inner loop
  
!     #ifdef FLEXT_QTHR
!         if(syslock) sys_unlock();
!     #endif
  
!     } // for(;;)
  }
  
***************
*** 182,190 ****
  {
  #endif
! //	post("qtick");
  #ifdef FLEXT_THREADS
! 	FLEXT_ASSERT(flext::IsSystemThread());
  #endif
! 	QWork(true,false);
  }
  #endif
--- 182,190 ----
  {
  #endif
! //  post("qtick");
  #ifdef FLEXT_THREADS
!     FLEXT_ASSERT(flext::IsSystemThread());
  #endif
!     QWork(true,false);
  }
  #endif
***************
*** 197,211 ****
  {
  #ifdef FLEXT_THREADS
! 	if(!IsSystemThread()) {
! 		error("flext - Queue flush called by wrong thread!");
! 		return;
! 	}
  #endif
  #ifdef FLEXT_THREADS
! 	qmutex.Lock();
  #endif
! 	while(qcnt) QWork(false,false);
  #ifdef FLEXT_THREADS
! 	qmutex.Unlock();
  #endif
  }
--- 197,211 ----
  {
  #ifdef FLEXT_THREADS
!     if(!IsSystemThread()) {
!         error("flext - Queue flush called by wrong thread!");
!         return;
!     }
  #endif
  #ifdef FLEXT_THREADS
!     qmutex.Lock();
  #endif
!     while(qcnt) QWork(false,false);
  #ifdef FLEXT_THREADS
!     qmutex.Unlock();
  #endif
  }
***************
*** 213,227 ****
  static void Queue(qmsg *m)
  {
! //	post("Queue");
  
  #ifdef FLEXT_THREADS
! 	qmutex.Lock();
  #endif
! 	if(qtail) qtail->nxt = m;
! 	else qhead = m;
! 	qtail = m;
! 	qcnt++;
  #ifdef FLEXT_THREADS
! 	qmutex.Unlock();
  #endif
  
--- 213,227 ----
  static void Queue(qmsg *m)
  {
! //  post("Queue");
  
  #ifdef FLEXT_THREADS
!     qmutex.Lock();
  #endif
!     if(qtail) qtail->nxt = m;
!     else qhead = m;
!     qtail = m;
!     qcnt++;
  #ifdef FLEXT_THREADS
!     qmutex.Unlock();
  #endif
  
***************
*** 230,242 ****
          // wake up a worker thread 
          // (instead of triggering the clock)
! 		qthrcond.Signal();
! 	#else
! 	    clock_delay(qclk,0);
      #endif
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	qelem_set(qclk); 
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
! 	// this is dangerous because there may be other timers on this object!
! 	fts_timebase_add_call(fts_get_timebase(), (fts_object_t *)thisHdr(), QTick, NULL, 0);
  #else
  #error Not implemented
--- 230,242 ----
          // wake up a worker thread 
          // (instead of triggering the clock)
!         qthrcond.Signal();
!     #else
!         clock_delay(qclk,0);
      #endif
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     qelem_set(qclk); 
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
!     // this is dangerous because there may be other timers on this object!
!     fts_timebase_add_call(fts_get_timebase(), (fts_object_t *)thisHdr(), QTick, NULL, 0);
  #else
  #error Not implemented
***************
*** 248,255 ****
  {
      thrmsgid = GetThreadId();
! 	for(;;) {
! 		qthrcond.Wait();
! 		QWork(true,true);
! 	}
  }
  #endif
--- 248,255 ----
  {
      thrmsgid = GetThreadId();
!     for(;;) {
!         qthrcond.Wait();
!         QWork(true,true);
!     }
  }
  #endif
***************
*** 257,273 ****
  void flext_base::StartQueue()
  {
! 	static bool started = false;
! 	if(started) return;
! 	else started = true;
  
! 	// message queue ticker
! 	qhead = qtail = NULL;
! 	qcnt = 0;
  
  #ifdef FLEXT_QTHR
! 	LaunchThread(QWorker,NULL);
  #else
  #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX
! 	qclk = (t_qelem *)(qelem_new(NULL,(t_method)QTick));
  #else
  #error Not implemented!
--- 257,273 ----
  void flext_base::StartQueue()
  {
!     static bool started = false;
!     if(started) return;
!     else started = true;
  
!     // message queue ticker
!     qhead = qtail = NULL;
!     qcnt = 0;
  
  #ifdef FLEXT_QTHR
!     LaunchThread(QWorker,NULL);
  #else
  #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX
!     qclk = (t_qelem *)(qelem_new(NULL,(t_method)QTick));
  #else
  #error Not implemented!
***************
*** 278,325 ****
  void flext_base::ToQueueBang(int o) const 
  {
! 	FLEXT_ASSERT(o >= 0);
!     	qmsg *m = new qmsg(const_cast<flext_base *>(this)); 
! 	m->SetBang(o);
! 	Queue(m);
  }
  
  void flext_base::ToQueueFloat(int o,float f) const
  {
! 	FLEXT_ASSERT(o >= 0);
! 	qmsg *m = new qmsg(const_cast<flext_base *>(this)); 
! 	m->SetFloat(o,f);
! 	Queue(m);
  }
  
  void flext_base::ToQueueInt(int o,int f) const
  {
! 	FLEXT_ASSERT(o >= 0);
! 	qmsg *m = new qmsg(const_cast<flext_base *>(this)); 
! 	m->SetInt(o,f);
! 	Queue(m);
  }
  
  void flext_base::ToQueueSymbol(int o,const t_symbol *s) const
  {
! 	FLEXT_ASSERT(o >= 0);
! 	qmsg *m = new qmsg(const_cast<flext_base *>(this)); 
! 	m->SetSymbol(o,s);
! 	Queue(m);
  }
  
  void flext_base::ToQueueList(int o,int argc,const t_atom *argv) const
  {
! 	FLEXT_ASSERT(o >= 0);
! 	qmsg *m = new qmsg(const_cast<flext_base *>(this)); 
! 	m->SetList(o,argc,argv);
! 	Queue(m);
  }
  
  void flext_base::ToQueueAnything(int o,const t_symbol *s,int argc,const t_atom *argv) const
  {
! 	FLEXT_ASSERT(o >= 0);
! 	qmsg *m = new qmsg(const_cast<flext_base *>(this)); 
! 	m->SetAny(o,s,argc,argv);
! 	Queue(m);
  }
  
--- 278,325 ----
  void flext_base::ToQueueBang(int o) const 
  {
!     FLEXT_ASSERT(o >= 0);
!         qmsg *m = new qmsg(const_cast<flext_base *>(this)); 
!     m->SetBang(o);
!     Queue(m);
  }
  
  void flext_base::ToQueueFloat(int o,float f) const
  {
!     FLEXT_ASSERT(o >= 0);
!     qmsg *m = new qmsg(const_cast<flext_base *>(this)); 
!     m->SetFloat(o,f);
!     Queue(m);
  }
  
  void flext_base::ToQueueInt(int o,int f) const
  {
!     FLEXT_ASSERT(o >= 0);
!     qmsg *m = new qmsg(const_cast<flext_base *>(this)); 
!     m->SetInt(o,f);
!     Queue(m);
  }
  
  void flext_base::ToQueueSymbol(int o,const t_symbol *s) const
  {
!     FLEXT_ASSERT(o >= 0);
!     qmsg *m = new qmsg(const_cast<flext_base *>(this)); 
!     m->SetSymbol(o,s);
!     Queue(m);
  }
  
  void flext_base::ToQueueList(int o,int argc,const t_atom *argv) const
  {
!     FLEXT_ASSERT(o >= 0);
!     qmsg *m = new qmsg(const_cast<flext_base *>(this)); 
!     m->SetList(o,argc,argv);
!     Queue(m);
  }
  
  void flext_base::ToQueueAnything(int o,const t_symbol *s,int argc,const t_atom *argv) const
  {
!     FLEXT_ASSERT(o >= 0);
!     qmsg *m = new qmsg(const_cast<flext_base *>(this)); 
!     m->SetAny(o,s,argc,argv);
!     Queue(m);
  }
  

Index: fldefs_attrcb.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/fldefs_attrcb.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** fldefs_attrcb.h	12 Dec 2003 03:32:56 -0000	1.3
--- fldefs_attrcb.h	21 Jun 2004 13:58:19 -0000	1.4
***************
*** 20,24 ****
  
  /*! \brief Declare a attribute set function
! 	\internal
  */
  #define FLEXT_CALLSET_(FUN,TP) \
--- 20,24 ----
  
  /*! \brief Declare a attribute set function
!     \internal
  */
  #define FLEXT_CALLSET_(FUN,TP) \
***************
*** 27,31 ****
  
  /*! \brief Declare a attribute get function
! 	\internal
  */
  #define FLEXT_CALLGET_(FUN,TP) \
--- 27,31 ----
  
  /*! \brief Declare a attribute get function
!     \internal
  */
  #define FLEXT_CALLGET_(FUN,TP) \
***************
*** 35,41 ****
  
  
! /*!	\defgroup FLEXT_DA_CALLSET Definition of attribute set handlers
      \ingroup FLEXT_D_ATTRIB
! 	@{ 
  */
  
--- 35,41 ----
  
  
! /*! \defgroup FLEXT_DA_CALLSET Definition of attribute set handlers
      \ingroup FLEXT_D_ATTRIB
!     @{ 
  */
  
***************
*** 76,82 ****
  //! @} FLEXT_DA_CALLSET
  
! /*!	\defgroup FLEXT_DA_CALLGET Definition of attribute get handlers
      \ingroup FLEXT_D_ATTRIB
! 	@{ 
  */
  
--- 76,82 ----
  //! @} FLEXT_DA_CALLSET
  
! /*! \defgroup FLEXT_DA_CALLGET Definition of attribute get handlers
      \ingroup FLEXT_D_ATTRIB
!     @{ 
  */
  
***************
*** 118,124 ****
  
  
! /*!	\defgroup FLEXT_DA_CALLVAR Definition of attribute transfer handlers (both get and set)
      \ingroup FLEXT_D_ATTRIB
! 	@{ 
  */
  
--- 118,124 ----
  
  
! /*! \defgroup FLEXT_DA_CALLVAR Definition of attribute transfer handlers (both get and set)
      \ingroup FLEXT_D_ATTRIB
!     @{ 
  */
  

Index: flproxy.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flproxy.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** flproxy.cpp	10 Dec 2003 03:32:53 -0000	1.6
--- flproxy.cpp	21 Jun 2004 13:58:19 -0000	1.7
***************
*** 25,40 ****
  void flext_base::px_object::px_method(px_object *obj,const t_symbol *s,int argc,t_atom *argv)
  {
! 	obj->base->m_methodmain(obj->index,s,argc,argv);
  }
  
  void flext_base::cb_px_anything(t_class *c,const t_symbol *s,int argc,t_atom *argv)
  {
! 	thisObject(c)->m_methodmain(0,s,argc,argv);
  }
  
  #define DEF_IN_FT(IX) \
  void flext_base::cb_px_ft ## IX(t_class *c,float v) { \
! 	t_atom atom; SETFLOAT(&atom,v);  \
! 	thisObject(c)->m_methodmain(IX,sym_float,1,&atom); \
  }
  
--- 25,40 ----
  void flext_base::px_object::px_method(px_object *obj,const t_symbol *s,int argc,t_atom *argv)
  {
!     obj->base->m_methodmain(obj->index,s,argc,argv);
  }
  
  void flext_base::cb_px_anything(t_class *c,const t_symbol *s,int argc,t_atom *argv)
  {
!     thisObject(c)->m_methodmain(0,s,argc,argv);
  }
  
  #define DEF_IN_FT(IX) \
  void flext_base::cb_px_ft ## IX(t_class *c,float v) { \
!     t_atom atom; SETFLOAT(&atom,v);  \
!     thisObject(c)->m_methodmain(IX,sym_float,1,&atom); \
  }
  
***************
*** 46,54 ****
  void flext_base::cb_px_anything(t_class *c,const t_symbol *s,short argc,t_atom *argv)
  {
! 	// check if inlet allows anything (or list)
! 	
! 	flext_base *o = thisObject(c);
! 	int ci = ((flext_hdr *)o->x_obj)->curinlet;
! 	o->m_methodmain(ci,s,argc,argv);
  }
  
--- 46,54 ----
  void flext_base::cb_px_anything(t_class *c,const t_symbol *s,short argc,t_atom *argv)
  {
!     // check if inlet allows anything (or list)
!     
!     flext_base *o = thisObject(c);
!     int ci = ((flext_hdr *)o->x_obj)->curinlet;
!     o->m_methodmain(ci,s,argc,argv);
  }
  
***************
*** 58,93 ****
  void flext_base::cb_px_int(t_class *c,long v)
  {
! 	flext_base *o = thisObject(c);
! 	int ci = proxy_getinlet((t_object *)o->x_obj);
! 	// check if inlet allows int type
! 	t_atom atom;
! 	SetInt(atom,v);  
! 	o->m_methodmain(ci,sym_int,1,&atom);
  }
  
  void flext_base::cb_px_float(t_class *c,double v)
  {
! 	flext_base *o = thisObject(c);
! 	int ci = proxy_getinlet((t_object *)o->x_obj);
! 	// check if inlet allows float type
! 	t_atom atom;
! 	SetFloat(atom,v);  
! 	o->m_methodmain(ci,sym_float,1,&atom);
  }
  #else
  void flext_base::cb_px_int(t_class *c,long v)
  {
! 	// check if inlet allows int type
! 	t_atom atom;
! 	SetInt(atom,v);  
! 	cb_px_anything(c,sym_int,1,&atom);
  }
  
  void flext_base::cb_px_float(t_class *c,double v)
  {
! 	// check if inlet allows float type
! 	t_atom atom;
! 	SetFloat(atom,v);  
! 	cb_px_anything(c,sym_float,1,&atom);
  }
  #endif
--- 58,93 ----
  void flext_base::cb_px_int(t_class *c,long v)
  {
!     flext_base *o = thisObject(c);
!     int ci = proxy_getinlet((t_object *)o->x_obj);
!     // check if inlet allows int type
!     t_atom atom;
!     SetInt(atom,v);  
!     o->m_methodmain(ci,sym_int,1,&atom);
  }
  
  void flext_base::cb_px_float(t_class *c,double v)
  {
!     flext_base *o = thisObject(c);
!     int ci = proxy_getinlet((t_object *)o->x_obj);
!     // check if inlet allows float type
!     t_atom atom;
!     SetFloat(atom,v);  
!     o->m_methodmain(ci,sym_float,1,&atom);
  }
  #else
  void flext_base::cb_px_int(t_class *c,long v)
  {
!     // check if inlet allows int type
!     t_atom atom;
!     SetInt(atom,v);  
!     cb_px_anything(c,sym_int,1,&atom);
  }
  
  void flext_base::cb_px_float(t_class *c,double v)
  {
!     // check if inlet allows float type
!     t_atom atom;
!     SetFloat(atom,v);  
!     cb_px_anything(c,sym_float,1,&atom);
  }
  #endif
***************
*** 95,100 ****
  void flext_base::cb_px_bang(t_class *c)
  {
! 	// check if inlet allows bang
! 	cb_px_anything(c,sym_bang,0,NULL);
  }
  
--- 95,100 ----
  void flext_base::cb_px_bang(t_class *c)
  {
!     // check if inlet allows bang
!     cb_px_anything(c,sym_bang,0,NULL);
  }
  
***************
*** 124,158 ****
  void flext_base::SetProxies(t_class *c)
  {
! 	// proxy for extra inlets
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	add_anything(c,cb_px_anything); // for leftmost inlet
      px_class = class_new(gensym("flext_base proxy"),NULL,NULL,sizeof(px_object),CLASS_PD|CLASS_NOINLET, A_NULL);
! 	add_anything(px_class,px_object::px_method); // for other inlets
  
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	add_bang(c,cb_px_bang);
! 	add_method1(c,cb_px_int,"int",A_INT);  
! 	add_method1(c,cb_px_float,"float",A_FLOAT);  
! 	add_methodG(c,cb_px_anything,"list");  
! 	add_anything(c,cb_px_anything);
  #else
  #error Not implemented!
! #endif	
  
  #if 0 //FLEXT_SYS == FLEXT_SYS_MAX && FLEXT_OS == FLEXT_OS_WIN
! 	// could also work for OSX!
! 	addint((method)cb_px_int);
! 	addfloat((method)cb_px_float);
  #else
! 	// setup non-leftmost ints and floats
! 	ADD_IN_FT(1);
! 	ADD_IN_FT(2);
! 	ADD_IN_FT(3);
! 	ADD_IN_FT(4);
! 	ADD_IN_FT(5);
! 	ADD_IN_FT(6);
! 	ADD_IN_FT(7);
! 	ADD_IN_FT(8);
! 	ADD_IN_FT(9);
  #endif
  }
--- 124,158 ----
  void flext_base::SetProxies(t_class *c)
  {
!     // proxy for extra inlets
  #if FLEXT_SYS == FLEXT_SYS_PD
!     add_anything(c,cb_px_anything); // for leftmost inlet
      px_class = class_new(gensym("flext_base proxy"),NULL,NULL,sizeof(px_object),CLASS_PD|CLASS_NOINLET, A_NULL);
!     add_anything(px_class,px_object::px_method); // for other inlets
  
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     add_bang(c,cb_px_bang);
!     add_method1(c,cb_px_int,"int",A_INT);  
!     add_method1(c,cb_px_float,"float",A_FLOAT);  
!     add_methodG(c,cb_px_anything,"list");  
!     add_anything(c,cb_px_anything);
  #else
  #error Not implemented!
! #endif  
  
  #if 0 //FLEXT_SYS == FLEXT_SYS_MAX && FLEXT_OS == FLEXT_OS_WIN
!     // could also work for OSX!
!     addint((method)cb_px_int);
!     addfloat((method)cb_px_float);
  #else
!     // setup non-leftmost ints and floats
!     ADD_IN_FT(1);
!     ADD_IN_FT(2);
!     ADD_IN_FT(3);
!     ADD_IN_FT(4);
!     ADD_IN_FT(5);
!     ADD_IN_FT(6);
!     ADD_IN_FT(7);
!     ADD_IN_FT(8);
!     ADD_IN_FT(9);
  #endif
  }
***************
*** 161,171 ****
  void flext_base::jmax_proxy(fts_object_t *c, int winlet, fts_symbol_t s, int argc, const fts_atom_t *argv)
  {
! 	flext_base *o = thisObject(c);
! 	o->m_methodmain(winlet,s,argc,argv);
  }
  
  void flext_base::SetProxies(t_class *c) 
  {
! 	fts_class_set_default_handler(c, jmax_proxy);
  }
  
--- 161,171 ----
  void flext_base::jmax_proxy(fts_object_t *c, int winlet, fts_symbol_t s, int argc, const fts_atom_t *argv)
  {
!     flext_base *o = thisObject(c);
!     o->m_methodmain(winlet,s,argc,argv);
  }
  
  void flext_base::SetProxies(t_class *c) 
  {
!     fts_class_set_default_handler(c, jmax_proxy);
  }
  

Index: flmsg.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flmsg.cpp,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** flmsg.cpp	6 Mar 2004 03:25:48 -0000	1.11
--- flmsg.cpp	21 Jun 2004 13:58:19 -0000	1.12
***************
*** 17,74 ****
  bool flext_base::CallMeth(const MethItem &m,int argc,const t_atom *argv)
  {
! 	bool ret = false;
! 	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:	ret = ((methfun_0)m.fun)(this); break;
! 		case 1:	ret = ((methfun_1)m.fun)(this,aargs[0]); break;
! 		case 2:	ret = ((methfun_2)m.fun)(this,aargs[0],aargs[1]); break;
! 		case 3:	ret = ((methfun_3)m.fun)(this,aargs[0],aargs[1],aargs[2]); break;
! 		case 4:	ret = ((methfun_4)m.fun)(this,aargs[0],aargs[1],aargs[2],aargs[3]); break;
! 		case 5:	ret = ((methfun_5)m.fun)(this,aargs[0],aargs[1],aargs[2],aargs[3],aargs[4]); break;
! 		}
! 	}
! 	
! 	return ret;
  }
  
--- 17,74 ----
  bool flext_base::CallMeth(const MethItem &m,int argc,const t_atom *argv)
  {
!     bool ret = false;
!     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: ret = ((methfun_0)m.fun)(this); break;
!         case 1: ret = ((methfun_1)m.fun)(this,aargs[0]); break;
!         case 2: ret = ((methfun_2)m.fun)(this,aargs[0],aargs[1]); break;
!         case 3: ret = ((methfun_3)m.fun)(this,aargs[0],aargs[1],aargs[2]); break;
!         case 4: ret = ((methfun_4)m.fun)(this,aargs[0],aargs[1],aargs[2],aargs[3]); break;
!         case 5: ret = ((methfun_5)m.fun)(this,aargs[0],aargs[1],aargs[2],aargs[3],aargs[4]); break;
!         }
!     }
!     
!     return ret;
  }
  
***************
*** 79,105 ****
  
  //        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) {
! 				// try list
! 				if(m->args[0] == a_list && ((methfun_V)m->fun)(this,argc,const_cast<t_atom *>(argv))) return true;
  
! 				// try anything
! 				if(m->args[0] == a_any && ((methfun_A)m->fun)(this,tag,argc,const_cast<t_atom *>(argv))) return true;
! 			}
  
! 			// try matching number of args
! 			if(argc == m->argc && CallMeth(*m,argc,argv)) return true;
! 		}
! 	}
! 	return false;
  }
  
--- 79,105 ----
  
  //        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) {
!                 // try list
!                 if(m->args[0] == a_list && ((methfun_V)m->fun)(this,argc,const_cast<t_atom *>(argv))) return true;
  
!                 // try anything
!                 if(m->args[0] == a_any && ((methfun_A)m->fun)(this,tag,argc,const_cast<t_atom *>(argv))) return true;
!             }
  
!             // try matching number of args
!             if(argc == m->argc && CallMeth(*m,argc,argv)) return true;
!         }
!     }
!     return false;
  }
  
***************
*** 109,120 ****
          MethItem *m = (MethItem *)lst;
  
! 		if(!m->IsAttr()) {
! //			FLEXT_LOG3("found symbol method for %s: inlet=%i, symbol=%s",GetString(m->tag),m->inlet,GetString(s));
  
! 			t_any sym; sym.st = const_cast<t_symbol *>(s);
! 			if(((methfun_1)m->fun)(this,sym)) return true;
! 		}
! 	}
! 	return false;
  }
  
--- 109,120 ----
          MethItem *m = (MethItem *)lst;
  
!         if(!m->IsAttr()) {
! //          FLEXT_LOG3("found symbol method for %s: inlet=%i, symbol=%s",GetString(m->tag),m->inlet,GetString(s));
  
!             t_any sym; sym.st = const_cast<t_symbol *>(s);
!             if(((methfun_1)m->fun)(this,sym)) return true;
!         }
!     }
!     return false;
  }
  
***************
*** 124,132 ****
          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;
--- 124,132 ----
          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;
***************
*** 134,138 ****
  
  /*! \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)
--- 134,138 ----
  
  /*! \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)
***************
*** 140,255 ****
      Item *lst;
  
! 	// search for exactly matching tag
! 	if((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 no list args, then search for pure symbol 
! 	if(!argc) {
! 		if((lst = methhead->FindList(sym_symbol,inlet)) != NULL && TryMethSym(lst,s)) return true;
! 		if((lst = clmethhead->FindList(sym_symbol,inlet)) != NULL && TryMethSym(lst,s)) return true;
! 	}
! 	
! 	// otherwise search for anything
! 	if((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
! 	return inlet >= 0 && FindMeth(-1,s,argc,argv);
  }
  
  /*! \brief All the message processing
! 	The messages of all the inlets go here and are promoted to the registered callback functions
  */
  bool flext_base::m_methodmain(int inlet,const t_symbol *s,int argc,const t_atom *argv)
  {
! 	static bool trap = false;
  
! 	curtag = s;
  
! //	post("methodmain inlet:%i args:%i symbol:%s",inlet,argc,s?GetString(s):"");
! 	
! 	bool ret = FindMeth(inlet,s,argc,argv);
! 	if(ret) goto end;
  
  #if FLEXT_SYS == FLEXT_SYS_MAX
! 	// If float message is not explicitly handled: try int handler instead
! 	if(argc == 1 && s == sym_float && !trap) {
! 		t_atom fl;
! 		SetInt(fl,GetAInt(argv[0]));
! 		trap = true;
! 		ret = m_methodmain(inlet,sym_int,1,&fl);
! 		trap = false;
! 	}
! 	if(ret) goto end;
! 	
! 	// If int message is not explicitly handled: try float handler instead
! 	if(argc == 1 && s == sym_int && !trap) {
! 		t_atom fl;
! 		SetFloat(fl,GetAFloat(argv[0]));
! 		trap = true;
! 		ret = m_methodmain(inlet,sym_float,1,&fl);
! 		trap = false;
! 	}
! 	if(ret) goto end;
  #endif
! 	
! 	// If float or int message is not explicitly handled: try list handler instead
! 	if(!trap && argc == 1 && (s == sym_float
  #if FLEXT_SYS == FLEXT_SYS_MAX
! 		|| s == sym_int
  #endif
! 	)) {
! 		t_atom list;
! 		if(s == sym_float) 
! 			SetFloat(list,GetFloat(argv[0]));
  #if FLEXT_SYS == FLEXT_SYS_MAX
! 		else if(s == sym_int)
! 			SetInt(list,GetInt(argv[0]));
  #endif
  
! 		trap = true;
! 		ret = m_methodmain(inlet,sym_list,1,&list);
! 		trap = false;
! 	}
! 	if(ret) goto end;
  
! 	// If symbol message (pure anything without args) is not explicitly handled: try list handler instead
! 	if(!trap && argc == 0) {
! 		t_atom list;
! 		SetSymbol(list,s);
! 		trap = true;
! 		ret = m_methodmain(inlet,sym_list,1,&list);
! 		trap = false;
! 	}
! 	if(ret) goto end;
  
! 	// if distmsgs is switched on then distribute list elements over inlets (Max/MSP behavior)
! 	if(distmsgs && !trap && inlet == 0 && s == sym_list && insigs <= 1) {
! 		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
! 			else if(IsPointer(argv[i])) sym = sym_pointer;  // can pointer atoms occur here?
  #endif
! 			if(sym) {
! 				trap = true;
! 				m_methodmain(i,sym,1,argv+i);			
! 				trap = false;
! 			}
! 		}
! 		
! 		ret = true;
! 	}
! 	
! 	if(!ret && !trap) ret = m_method_(inlet,s,argc,argv);
! 	
  end:
! 	curtag = NULL;
  
! 	return ret; // true if appropriate handler was found and called
  }
  
--- 140,267 ----
      Item *lst;
  
!     // search for exactly matching tag
!     if((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 no list args, then search for pure symbol 
!     if(!argc) {
!         if((lst = methhead->FindList(sym_symbol,inlet)) != NULL && TryMethSym(lst,s)) return true;
!         if((lst = clmethhead->FindList(sym_symbol,inlet)) != NULL && TryMethSym(lst,s)) return true;
!     }
!     
!     // otherwise search for anything
!     if((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
!     return inlet >= 0 && FindMeth(-1,s,argc,argv);
  }
  
  /*! \brief All the message processing
!     The messages of all the inlets go here and are promoted to the registered callback functions
  */
  bool flext_base::m_methodmain(int inlet,const t_symbol *s,int argc,const t_atom *argv)
  {
!     static bool trap = false;
  
!     curtag = s;
  
! //  post("methodmain inlet:%i args:%i symbol:%s",inlet,argc,s?GetString(s):"");
! 
!     bool ret = FindMeth(inlet,s,argc,argv);
!     if(ret) goto end;
! 
!     try {
  
  #if FLEXT_SYS == FLEXT_SYS_MAX
!         // If float message is not explicitly handled: try int handler instead
!         if(argc == 1 && s == sym_float && !trap) {
!             t_atom fl;
!             SetInt(fl,GetAInt(argv[0]));
!             trap = true;
!             ret = m_methodmain(inlet,sym_int,1,&fl);
!             trap = false;
!         }
!         if(ret) goto end;
!         
!         // If int message is not explicitly handled: try float handler instead
!         if(argc == 1 && s == sym_int && !trap) {
!             t_atom fl;
!             SetFloat(fl,GetAFloat(argv[0]));
!             trap = true;
!             ret = m_methodmain(inlet,sym_float,1,&fl);
!             trap = false;
!         }
!         if(ret) goto end;
  #endif
!         
!         // If float or int message is not explicitly handled: try list handler instead
!         if(!trap && argc == 1 && (s == sym_float
  #if FLEXT_SYS == FLEXT_SYS_MAX
!             || s == sym_int
  #endif
!         )) {
!             t_atom list;
!             if(s == sym_float) 
!                 SetFloat(list,GetFloat(argv[0]));
  #if FLEXT_SYS == FLEXT_SYS_MAX
!             else if(s == sym_int)
!                 SetInt(list,GetInt(argv[0]));
  #endif
  
!             trap = true;
!             ret = m_methodmain(inlet,sym_list,1,&list);
!             trap = false;
!         }
!         if(ret) goto end;
  
!         // If symbol message (pure anything without args) is not explicitly handled: try list handler instead
!         if(!trap && argc == 0) {
!             t_atom list;
!             SetSymbol(list,s);
!             trap = true;
!             ret = m_methodmain(inlet,sym_list,1,&list);
!             trap = false;
!         }
!         if(ret) goto end;
  
!         // if distmsgs is switched on then distribute list elements over inlets (Max/MSP behavior)
!         if(distmsgs && !trap && inlet == 0 && s == sym_list && insigs <= 1) {
!             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
!                 else if(IsPointer(argv[i])) sym = sym_pointer;  // can pointer atoms occur here?
  #endif
!                 if(sym) {
!                     trap = true;
!                     m_methodmain(i,sym,1,argv+i);           
!                     trap = false;
!                 }
!             }
!             
!             ret = true;
!         }
!         
!         if(!ret && !trap) ret = m_method_(inlet,s,argc,argv);
!     }
!     catch(std::exception &x) {
!         error("%s - Exception while processing method: %s",thisName(),x.what());
!     }
!     catch(const char *txt) {
!     	error("%s - Exception while processing method: %s",thisName(),txt);
!     }
!     catch(...) {
!     	error("%s - Unknown exception while processing method",thisName());
!     }
! 
  end:
!     curtag = NULL;
  
!     return ret; // true if appropriate handler was found and called
  }
  
***************
*** 257,263 ****
  {
  //#ifdef FLEXT_DEBUG
! 	post("%s: message unhandled - inlet:%i args:%i symbol:%s",thisName(),inlet,argc,s?GetString(s):"");
  //#endif
! 	return false;
  }
  
--- 269,275 ----
  {
  //#ifdef FLEXT_DEBUG
!     post("%s: message unhandled - inlet:%i args:%i symbol:%s",thisName(),inlet,argc,s?GetString(s):"");
  //#endif
!     return false;
  }
  

Index: fldsp.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/fldsp.cpp,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -d -r1.20 -r1.21
*** fldsp.cpp	29 Nov 2003 03:32:48 -0000	1.20
--- fldsp.cpp	21 Jun 2004 13:58:19 -0000	1.21
***************
*** 25,42 ****
  void flext_dsp::Setup(t_classid id)
  {
! 	t_class *c = getClass(id);
  
  #if FLEXT_SYS == FLEXT_SYS_MAX
! //	dsp_initclass();
! 	dsp_initboxclass();
! 	add_dsp(c,cb_dsp);
  #elif FLEXT_SYS == FLEXT_SYS_PD
! 	CLASS_MAINSIGNALIN(c,flext_hdr,defsig); // float messages going into the left inlet are converted to signal
! 	add_dsp(c,cb_dsp);
! 	add_method1(c,cb_enable,"enable",A_FLOAT);
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
! 	fts_dsp_declare_function(dspsym,dspmeth);	
! 	fts_class_message_varargs(c, fts_s_put, cb_dsp);
! 	fts_class_message_varargs(c, MakeSymbol("enable"), cb_enable);
  #endif
  }
--- 25,42 ----
  void flext_dsp::Setup(t_classid id)
  {
!     t_class *c = getClass(id);
  
  #if FLEXT_SYS == FLEXT_SYS_MAX
! //  dsp_initclass();
!     dsp_initboxclass();
!     add_dsp(c,cb_dsp);
  #elif FLEXT_SYS == FLEXT_SYS_PD
!     CLASS_MAINSIGNALIN(c,flext_hdr,defsig); // float messages going into the left inlet are converted to signal
!     add_dsp(c,cb_dsp);
!     add_method1(c,cb_enable,"enable",A_FLOAT);
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
!     fts_dsp_declare_function(dspsym,dspmeth);   
!     fts_class_message_varargs(c, fts_s_put, cb_dsp);
!     fts_class_message_varargs(c, MakeSymbol("enable"), cb_enable);
  #endif
  }
***************
*** 44,72 ****
  flext_dsp::FLEXT_CLASSDEF(flext_dsp)(): 
  #if FLEXT_SYS == FLEXT_SYS_JMAX
! 	srate(fts_dsp_get_sample_rate()),  // should we set it?
! 	blksz(fts_dsp_get_tick_size()),
  #else
! 	srate(sys_getsr()),  // should we set it?
! 	blksz(sys_getblksize()),
  #endif
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	chnsin(sys_get_inchannels()),
! 	chnsout(sys_get_outchannels()),
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	chnsin(sys_getch()),
! 	chnsout(sys_getch()),
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
! 	#pragma message("not implemented")
! 	chnsin(0),chnsout(0),
  #else
  #error
  #endif
  #if FLEXT_SYS != FLEXT_SYS_MAX
! 	dspon(true),
  #endif
! 	invecs(NULL),outvecs(NULL)
  {
  #if FLEXT_SYS == FLEXT_SYS_JMAX
! 	fts_dsp_object_init(thisHdr());
  #endif
  }
--- 44,72 ----
  flext_dsp::FLEXT_CLASSDEF(flext_dsp)(): 
  #if FLEXT_SYS == FLEXT_SYS_JMAX
!     srate(fts_dsp_get_sample_rate()),  // should we set it?
!     blksz(fts_dsp_get_tick_size()),
  #else
!     srate(sys_getsr()),  // should we set it?
!     blksz(sys_getblksize()),
  #endif
  #if FLEXT_SYS == FLEXT_SYS_PD
!     chnsin(sys_get_inchannels()),
!     chnsout(sys_get_outchannels()),
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     chnsin(sys_getch()),
!     chnsout(sys_getch()),
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
!     #pragma message("not implemented")
!     chnsin(0),chnsout(0),
  #else
  #error
  #endif
  #if FLEXT_SYS != FLEXT_SYS_MAX
!     dspon(true),
  #endif
!     invecs(NULL),outvecs(NULL)
  {
  #if FLEXT_SYS == FLEXT_SYS_JMAX
!     fts_dsp_object_init(thisHdr());
  #endif
  }
***************
*** 76,91 ****
  {
  #if FLEXT_SYS == FLEXT_SYS_JMAX
! 	fts_dsp_object_delete(thisHdr());
  #endif
  
  /*
  #if FLEXT_SYS == FLEXT_SYS_MAX
! 	// switch off dsp as the dsp function might get called afterwards (?!)
! 	thisHdr()->z_disabled = true;
! 	
! 	if(invecs) delete[] invecs;
! 	if(outvecs) delete[] outvecs;
  #elif FLEXT_SYS == FLEXT_SYS_PD
! 	dspon = false;
  #endif
  */
--- 76,91 ----
  {
  #if FLEXT_SYS == FLEXT_SYS_JMAX
!     fts_dsp_object_delete(thisHdr());
  #endif
  
  /*
  #if FLEXT_SYS == FLEXT_SYS_MAX
!     // switch off dsp as the dsp function might get called afterwards (?!)
!     thisHdr()->z_disabled = true;
!     
!     if(invecs) delete[] invecs;
!     if(outvecs) delete[] outvecs;
  #elif FLEXT_SYS == FLEXT_SYS_PD
!     dspon = false;
  #endif
  */
***************
*** 99,119 ****
  t_int *flext_dsp::dspmeth(t_int *w) 
  { 
! 	flext_dsp *obj = (flext_dsp *)w[1];
  /*
  #ifdef FLEXT_DEBUG
! 	if(!obj->thisHdr()) {
! 		// object is already deleted!
! 		ERRINTERNAL();
! 		return w+3;
! 	}
  #endif
  */
  #if FLEXT_SYS == FLEXT_SYS_MAX
! 	if(!obj->thisHdr()->z_disabled) 
  #else
! 	if(obj->dspon) 
  #endif
! 		obj->m_signal(obj->blksz,obj->invecs,obj->outvecs); 
! 	return w+2;
  }
  #endif
--- 99,119 ----
  t_int *flext_dsp::dspmeth(t_int *w) 
  { 
!     flext_dsp *obj = (flext_dsp *)w[1];
  /*
  #ifdef FLEXT_DEBUG
!     if(!obj->thisHdr()) {
!         // object is already deleted!
!         ERRINTERNAL();
!         return w+3;
!     }
  #endif
  */
  #if FLEXT_SYS == FLEXT_SYS_MAX
!     if(!obj->thisHdr()->z_disabled) 
  #else
!     if(obj->dspon) 
  #endif
!         obj->m_signal(obj->blksz,obj->invecs,obj->outvecs); 
!     return w+2;
  }
  #endif
***************
*** 127,196 ****
  #endif
  { 
! 	flext_dsp *obj = thisObject(c); 
  
! 	if(obj->CntInSig()+obj->CntOutSig() == 0) return;
  
! 	// store current dsp parameters
  #if FLEXT_SYS == FLEXT_SYS_JMAX
! 	fts_dsp_descr_t *dsp = (fts_dsp_descr_t *)fts_get_pointer(at+0);
! 	obj->srate = fts_dsp_get_input_srate(dsp,0);
! 	obj->blksz = fts_dsp_get_input_size(dsp,0);  // is this guaranteed to be the same as sys_getblksize() ?
  #else
! 	obj->srate = sp[0]->s_sr;
! 	obj->blksz = sp[0]->s_n;  // is this guaranteed to be the same as sys_getblksize() ?
  #endif
  
  /*
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	obj->chnsin = sys_get_inchannels();
! 	obj->chnsout = sys_get_outchannels();
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	obj->chnsin = obj->chnsout = sys_getch();
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
! 	#pragma message ("How to query the channels?")
  #else
  #error
  #endif
  */
! 	// store in and out signal vectors
! 	int i;
! 	int in = obj->chnsin = obj->CntInSig();
! 	int out = obj->chnsout = obj->CntOutSig();
  
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	// min. 1 input channel! (CLASS_MAININLET in pd...)
! 	if(!in) { obj->chnsin = in = 1; }
  #endif
  
! 	if(obj->invecs) delete[] obj->invecs;
! 	obj->invecs = new t_signalvec[in];
! 	for(i = 0; i < in; ++i) 
! 		obj->invecs[i] = 
  #if FLEXT_SYS == FLEXT_SYS_JMAX
! 		fts_dsp_get_input_name(dsp,i);
  #else
! 		sp[i]->s_vec;
  #endif
  
! 	if(obj->outvecs) delete[] obj->outvecs;
! 	obj->outvecs = new t_signalvec[out];
! 	for(i = 0; i < out; ++i) 
! 		obj->outvecs[i] = 
  #if FLEXT_SYS == FLEXT_SYS_JMAX
! 		fts_dsp_get_output_name(dsp,i);
  #else
! 		sp[in+i]->s_vec;
  #endif
  
! 	// with the following call derived classes can do their eventual DSP setup
! 	obj->m_dsp(obj->blksz,obj->invecs,obj->outvecs);
  
! 	// set the DSP function
  #if FLEXT_SYS == FLEXT_SYS_JMAX
! 	fts_atom_t args;
! 	fts_set_pointer(args,obj);
! 	fts_dsp_add_function(dspsym,1,args);
  #else
! 	dsp_add((t_dspmethod)dspmeth,1,obj);  
  #endif
  }
--- 127,196 ----
  #endif
  { 
!     flext_dsp *obj = thisObject(c); 
  
!     if(obj->CntInSig()+obj->CntOutSig() == 0) return;
  
!     // store current dsp parameters
  #if FLEXT_SYS == FLEXT_SYS_JMAX
!     fts_dsp_descr_t *dsp = (fts_dsp_descr_t *)fts_get_pointer(at+0);
!     obj->srate = fts_dsp_get_input_srate(dsp,0);
!     obj->blksz = fts_dsp_get_input_size(dsp,0);  // is this guaranteed to be the same as sys_getblksize() ?
  #else
!     obj->srate = sp[0]->s_sr;
!     obj->blksz = sp[0]->s_n;  // is this guaranteed to be the same as sys_getblksize() ?
  #endif
  
  /*
  #if FLEXT_SYS == FLEXT_SYS_PD
!     obj->chnsin = sys_get_inchannels();
!     obj->chnsout = sys_get_outchannels();
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     obj->chnsin = obj->chnsout = sys_getch();
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
!     #pragma message ("How to query the channels?")
  #else
  #error
  #endif
  */
!     // store in and out signal vectors
!     int i;
!     int in = obj->chnsin = obj->CntInSig();
!     int out = obj->chnsout = obj->CntOutSig();
  
  #if FLEXT_SYS == FLEXT_SYS_PD
!     // min. 1 input channel! (CLASS_MAININLET in pd...)
!     if(!in) { obj->chnsin = in = 1; }
  #endif
  
!     if(obj->invecs) delete[] obj->invecs;
!     obj->invecs = new t_signalvec[in];
!     for(i = 0; i < in; ++i) 
!         obj->invecs[i] = 
  #if FLEXT_SYS == FLEXT_SYS_JMAX
!         fts_dsp_get_input_name(dsp,i);
  #else
!         sp[i]->s_vec;
  #endif
  
!     if(obj->outvecs) delete[] obj->outvecs;
!     obj->outvecs = new t_signalvec[out];
!     for(i = 0; i < out; ++i) 
!         obj->outvecs[i] = 
  #if FLEXT_SYS == FLEXT_SYS_JMAX
!         fts_dsp_get_output_name(dsp,i);
  #else
!         sp[in+i]->s_vec;
  #endif
  
!     // with the following call derived classes can do their eventual DSP setup
!     obj->m_dsp(obj->blksz,obj->invecs,obj->outvecs);
  
!     // set the DSP function
  #if FLEXT_SYS == FLEXT_SYS_JMAX
!     fts_atom_t args;
!     fts_set_pointer(args,obj);
!     fts_dsp_add_function(dspsym,1,args);
  #else
!     dsp_add((t_dspmethod)dspmeth,1,obj);  
  #endif
  }
***************
*** 200,209 ****
  void flext_dsp::cb_dsp_init(fts_object_t *c, int winlet, fts_symbol_t *s, int ac, const fts_atom_t *at)
  {
! 	fts_dsp_add_object(c);
  }
  
  void flext_dsp::cb_dsp_delete(fts_object_t *c, int winlet, fts_symbol_t *s, int ac, const fts_atom_t *at)
  {
! 	fts_dsp_remove_object(c);
  }
  #endif
--- 200,209 ----
  void flext_dsp::cb_dsp_init(fts_object_t *c, int winlet, fts_symbol_t *s, int ac, const fts_atom_t *at)
  {
!     fts_dsp_add_object(c);
  }
  
  void flext_dsp::cb_dsp_delete(fts_object_t *c, int winlet, fts_symbol_t *s, int ac, const fts_atom_t *at)
  {
!     fts_dsp_remove_object(c);
  }
  #endif
***************
*** 214,218 ****
  void flext_dsp::m_signal(int n,t_sample *const * /*insigs*/,t_sample *const *outs) 
  {
! 	for(int i = 0; i < CntOutSig(); ++i) ZeroSamples(outs[i],n);
  }
  
--- 214,218 ----
  void flext_dsp::m_signal(int n,t_sample *const * /*insigs*/,t_sample *const *outs) 
  {
!     for(int i = 0; i < CntOutSig(); ++i) ZeroSamples(outs[i],n);
  }
  

Index: flbind.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flbind.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -C2 -d -r1.13 -r1.14
*** flbind.cpp	6 Mar 2004 03:25:48 -0000	1.13
--- flbind.cpp	21 Jun 2004 13:58:19 -0000	1.14
***************
*** 28,62 ****
  void flext_base::SetupBindProxy()
  {
! 	// already initialized?
! 	if(!pxbnd_class) {
  #if FLEXT_SYS == FLEXT_SYS_PD
!     	pxbnd_class = class_new(gensym("flext_base bind proxy"),NULL,NULL,sizeof(pxbnd_object),CLASS_PD|CLASS_NOINLET, A_NULL);
! 		add_anything(pxbnd_class,pxbnd_object::px_method); // for symbol-bound methods
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 		pxbnd_class = new t_class;
  
! 		pxbnd_class->c_sym = gensym("");
! 		pxbnd_class->c_freelist = &px_freelist;
! 		pxbnd_class->c_freefun = NULL;
! 		pxbnd_class->c_size = sizeof(pxbnd_object);
! 		pxbnd_class->c_tiny = 0;
! 		pxbnd_class->c_noinlet = 1;
! 		px_messlist[0].m_sym = (t_symbol *)pxbnd_class;
  
! 		px_messlist[1].m_sym = gensym("anything");
! 		px_messlist[1].m_fun = (method)pxbnd_object::px_method;
! 		px_messlist[1].m_type[0] = A_GIMME;
! 		px_messlist[1].m_type[1] = 0;
  
! 		px_messlist[2].m_sym = 0;
  #else
  #pragma warning("Not implemented!")
  #endif
! 	}
  }
  
  
  flext_base::BindItem::BindItem(bool (*f)(flext_base *,t_symbol *s,int,t_atom *,void *data),pxbnd_object *p):
! 	Item(NULL),fun(f),px(p)
  {}
  
--- 28,62 ----
  void flext_base::SetupBindProxy()
  {
!     // already initialized?
!     if(!pxbnd_class) {
  #if FLEXT_SYS == FLEXT_SYS_PD
!         pxbnd_class = class_new(gensym("flext_base bind proxy"),NULL,NULL,sizeof(pxbnd_object),CLASS_PD|CLASS_NOINLET, A_NULL);
!         add_anything(pxbnd_class,pxbnd_object::px_method); // for symbol-bound methods
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!         pxbnd_class = new t_class;
  
!         pxbnd_class->c_sym = gensym("");
!         pxbnd_class->c_freelist = &px_freelist;
!         pxbnd_class->c_freefun = NULL;
!         pxbnd_class->c_size = sizeof(pxbnd_object);
!         pxbnd_class->c_tiny = 0;
!         pxbnd_class->c_noinlet = 1;
!         px_messlist[0].m_sym = (t_symbol *)pxbnd_class;
  
!         px_messlist[1].m_sym = gensym("anything");
!         px_messlist[1].m_fun = (method)pxbnd_object::px_method;
!         px_messlist[1].m_type[0] = A_GIMME;
!         px_messlist[1].m_type[1] = 0;
  
!         px_messlist[2].m_sym = 0;
  #else
  #pragma warning("Not implemented!")
  #endif
!     }
  }
  
  
  flext_base::BindItem::BindItem(bool (*f)(flext_base *,t_symbol *s,int,t_atom *,void *data),pxbnd_object *p):
!     Item(NULL),fun(f),px(p)
  {}
  
***************
*** 123,133 ****
  
      if(px) {
! 	    BindItem *mi = new BindItem(fun,px);
! 	    bindhead->Add(mi,sym);
  
          px->init(this,mi,data);
  
  #if FLEXT_SYS == FLEXT_SYS_PD
!     	pd_bind(&px->obj.ob_pd,const_cast<t_symbol *>(sym)); 
  #elif FLEXT_SYS == FLEXT_SYS_MAX
          if(!sym->s_thing) 
--- 123,133 ----
  
      if(px) {
!         BindItem *mi = new BindItem(fun,px);
!         bindhead->Add(mi,sym);
  
          px->init(this,mi,data);
  
  #if FLEXT_SYS == FLEXT_SYS_PD
!         pd_bind(&px->obj.ob_pd,const_cast<t_symbol *>(sym)); 
  #elif FLEXT_SYS == FLEXT_SYS_MAX
          if(!sym->s_thing) 
***************
*** 206,219 ****
              Item *lst = si.data();
              while(lst) {
! 				Item *nxt = lst->nxt;
                  BindItem *it = (BindItem *)lst;
                  it->Unbind(si.key());
                  delete it;
! 				lst = nxt;
              }
          }
          set.clear();
      }
! 	return true;
  }
  
--- 206,219 ----
              Item *lst = si.data();
              while(lst) {
!                 Item *nxt = lst->nxt;
                  BindItem *it = (BindItem *)lst;
                  it->Unbind(si.key());
                  delete it;
!                 lst = nxt;
              }
          }
          set.clear();
      }
!     return true;
  }
  

Index: flbase.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flbase.cpp,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -d -r1.16 -r1.17
*** flbase.cpp	3 Apr 2004 02:21:04 -0000	1.16
--- flbase.cpp	21 Jun 2004 13:58:19 -0000	1.17
***************
*** 12,16 ****
      \brief Implementation of the internal flext base classes.
  
! 	\remark This is all derived from GEM by Mark Danks
  */
   
--- 12,16 ----
      \brief Implementation of the internal flext base classes.
  
!     \remark This is all derived from GEM by Mark Danks
  */
   
***************
*** 22,31 ****
  #if FLEXT_SYS == FLEXT_SYS_PD
  #ifdef _MSC_VER
! 	#pragma warning (push)
! 	#pragma warning (disable:4091)
  #endif
  #include <g_canvas.h>
  #ifdef _MSC_VER
! 	#pragma warning (pop)
  #endif
  #endif
--- 22,31 ----
  #if FLEXT_SYS == FLEXT_SYS_PD
  #ifdef _MSC_VER
!     #pragma warning (push)
!     #pragma warning (disable:4091)
  #endif
  #include <g_canvas.h>
  #ifdef _MSC_VER
!     #pragma warning (pop)
  #endif
  #endif
***************
*** 53,59 ****
  flext_obj :: FLEXT_CLASSDEF(flext_obj)()
             : x_obj(m_holder)
! 		   , procattr(m_holdattr)
! 		   , init_ok(true)
! 		   , m_name(m_holdname)
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
--- 53,59 ----
  flext_obj :: FLEXT_CLASSDEF(flext_obj)()
             : x_obj(m_holder)
!            , procattr(m_holdattr)
!            , init_ok(true)
!            , m_name(m_holdname)
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
***************
*** 70,74 ****
  /////////////////////////////////////////////////////////
  flext_obj :: ~FLEXT_CLASSDEF(flext_obj)() {
! 	x_obj = NULL;
  }
  
--- 70,74 ----
  /////////////////////////////////////////////////////////
  flext_obj :: ~FLEXT_CLASSDEF(flext_obj)() {
!     x_obj = NULL;
  }
  
***************
*** 81,97 ****
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	char tmp[256];
! 	if(dir) { 
! 		strcpy(tmp,dir); 
! 		strcat(tmp,"/"); 
! 		strcat(tmp,ref); 
! 	}
! 	else 
! 		strcpy(tmp,ref);
! 	if(addtilde) strcat(tmp,"~"); 
  
      ::class_sethelpsymbol(getClass(c),gensym(const_cast<char *>(tmp)));
  #else
! 	// no solution for Max/MSP yet
  #endif
  }
--- 81,97 ----
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
!     char tmp[256];
!     if(dir) { 
!         strcpy(tmp,dir); 
!         strcat(tmp,"/"); 
!         strcat(tmp,ref); 
!     }
!     else 
!         strcpy(tmp,ref);
!     if(addtilde) strcat(tmp,"~"); 
  
      ::class_sethelpsymbol(getClass(c),gensym(const_cast<char *>(tmp)));
  #else
!     // no solution for Max/MSP yet
  #endif
  }
***************
*** 100,134 ****
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	if(!c) c = canvas_getcurrent();
  
! 	const char *s = GetString(sym);
! 	if((s[0] == '$' || s[0] == '#') && isdigit(s[1])) {
! 		const t_symbol *res;
! 		// patcher parameter detected... get value!
! 		if(s[0] != '$') {
! 			char tmp[MAXPDSTRING];
! 			strcpy(tmp,s);
! 			tmp[0] = '$';
! 			res = canvas_realizedollar(c,const_cast<t_symbol *>(MakeSymbol(tmp)));
! 		}
! 		else
! 			res = canvas_realizedollar(c,const_cast<t_symbol *>(sym));
  
! 		// check for number
! 		const char *c = GetString(res);
! 		while(*c && (isdigit(*c) || *c == '.')) ++c;
  
! 		if(!*c) 
! 			SetFloat(dst,(float)atof(GetString(res)));
! 		else
! 			SetSymbol(dst,res);
! 		return true;
! 	}
! 	else
  #else
! 	#pragma message("Not implemented")
  #endif
! 	SetSymbol(dst,sym);
! 	return true;
  }
  
--- 100,134 ----
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
!     if(!c) c = canvas_getcurrent();
  
!     const char *s = GetString(sym);
!     if((s[0] == '$' || s[0] == '#') && isdigit(s[1])) {
!         const t_symbol *res;
!         // patcher parameter detected... get value!
!         if(s[0] != '$') {
!             char tmp[MAXPDSTRING];
!             strcpy(tmp,s);
!             tmp[0] = '$';
!             res = canvas_realizedollar(c,const_cast<t_symbol *>(MakeSymbol(tmp)));
!         }
!         else
!             res = canvas_realizedollar(c,const_cast<t_symbol *>(sym));
  
!         // check for number
!         const char *c = GetString(res);
!         while(*c && (isdigit(*c) || *c == '.')) ++c;
  
!         if(!*c) 
!             SetFloat(dst,(float)atof(GetString(res)));
!         else
!             SetSymbol(dst,res);
!         return true;
!     }
!     else
  #else
!     #pragma message("Not implemented")
  #endif
!     SetSymbol(dst,sym);
!     return true;
  }
  
***************
*** 143,154 ****
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	int argc;
! 	t_atom *argv;
! 	canvas_getargs(&argc,&argv);
! 	args(argc);
! 	for(int i = 0; i < argc; ++i) args[i] = argv[i];
  #else
! 	#pragma message("Not implemented")
! 	args(0);
  #endif
  }
--- 143,154 ----
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
!     int argc;
!     t_atom *argv;
!     canvas_getargs(&argc,&argv);
!     args(argc);
!     for(int i = 0; i < argc; ++i) args[i] = argv[i];
  #else
!     #pragma message("Not implemented")
!     args(0);
  #endif
  }

Index: fldoxygen.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/fldoxygen.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** fldoxygen.h	12 Dec 2003 03:32:56 -0000	1.8
--- fldoxygen.h	21 Jun 2004 13:58:19 -0000	1.9
***************
*** 3,8 ****
  
  /*! \file fldoxygen.h
! 	\brief Doxygen definitions
! 	\remark There is no code in here, just documentation stuff.
  */
  
--- 3,8 ----
  
  /*! \file fldoxygen.h
!     \brief Doxygen definitions
!     \remark There is no code in here, just documentation stuff.
  */
  
***************
*** 111,117 ****
  \verbatim
  class attr1:
! 	public flext_base
  {
! 	FLEXT_HEADER(attr1,flext_base)
  \endverbatim
  
--- 111,117 ----
  \verbatim
  class attr1:
!     public flext_base
  {
!     FLEXT_HEADER(attr1,flext_base)
  \endverbatim
  
***************
*** 122,127 ****
  \verbatim
  public:
! 	// constructor 
! 	attr1();
  \endverbatim
  
--- 122,127 ----
  \verbatim
  public:
!     // constructor 
!     attr1();
  \endverbatim
  
***************
*** 130,137 ****
  \verbatim
  protected:
! 	void m_trigger(float f);   
! 	
! 	// stored argument
! 	float arg; 
  \endverbatim
  
--- 130,137 ----
  \verbatim
  protected:
!     void m_trigger(float f);   
!     
!     // stored argument
!     float arg; 
  \endverbatim
  
***************
*** 141,149 ****
  \verbatim
  private:
! 	// callback for method "m_trigger" (with one float argument)
! 	FLEXT_CALLBACK_F(m_trigger);  
  
! 	// define attribute callbacks for variable "arg" (with GET and SET properties)
! 	FLEXT_ATTRVAR_F(arg);  
  };
  \endverbatim
--- 141,149 ----
  \verbatim
  private:
!     // callback for method "m_trigger" (with one float argument)
!     FLEXT_CALLBACK_F(m_trigger);  
  
!     // define attribute callbacks for variable "arg" (with GET and SET properties)
!     FLEXT_ATTRVAR_F(arg);  
  };
  \endverbatim
***************
*** 167,187 ****
  \verbatim
  attr1::attr1():
! 	arg(0)  // initialize argument 
  { 
! 	// define inlets
! 	AddInAnything();  // first inlet of type anything (index 0)
! 	
! 	// define outlets
! 	AddOutFloat();  // one float outlet (has index 0)
  \endverbatim
! 	
  Every inlet and outlet that the object shall have has to be registered.
  This is done with the functions in \ref FLEXT_C_IO_ADD.
  
  \verbatim
! 	// register methods
! 	FLEXT_ADDMETHOD(0,m_trigger);  // register method (for floats) "m_trigger" for inlet 0
  
! 	FLEXT_ADDATTR_VAR1("arg",arg);  // register attribute "arg" with variable arg
  } 
  \endverbatim
--- 167,187 ----
  \verbatim
  attr1::attr1():
!     arg(0)  // initialize argument 
  { 
!     // define inlets
!     AddInAnything();  // first inlet of type anything (index 0)
!     
!     // define outlets
!     AddOutFloat();  // one float outlet (has index 0)
  \endverbatim
!     
  Every inlet and outlet that the object shall have has to be registered.
  This is done with the functions in \ref FLEXT_C_IO_ADD.
  
  \verbatim
!     // register methods
!     FLEXT_ADDMETHOD(0,m_trigger);  // register method (for floats) "m_trigger" for inlet 0
  
!     FLEXT_ADDATTR_VAR1("arg",arg);  // register attribute "arg" with variable arg
  } 
  \endverbatim
***************
*** 196,203 ****
  void attr1::m_trigger(float f)
  {
! 	float res = arg+f;
! 	
! 	// output value to outlet
! 	ToOutFloat(0,res); // (0 stands for the outlet index 0)
  }
  \endverbatim
--- 196,203 ----
  void attr1::m_trigger(float f)
  {
!     float res = arg+f;
!     
!     // output value to outlet
!     ToOutFloat(0,res); // (0 stands for the outlet index 0)
  }
  \endverbatim

Index: fldefs_setup.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/fldefs_setup.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** fldefs_setup.h	12 Dec 2003 03:32:56 -0000	1.3
--- fldefs_setup.h	21 Jun 2004 13:58:19 -0000	1.4
***************
*** 19,23 ****
  // ====================================================================================
  
! /*!	\defgroup FLEXT_D_INSTANCE Class instantiation
      \note For stand-alone externals (not part of a library) the name of your class 
      \note is of importance! It must be the same as the external (excluded an eventual ~ (tilde))
--- 19,23 ----
  // ====================================================================================
  
! /*! \defgroup FLEXT_D_INSTANCE Class instantiation
      \note For stand-alone externals (not part of a library) the name of your class 
      \note is of importance! It must be the same as the external (excluded an eventual ~ (tilde))
***************
*** 33,51 ****
  
  
! /*!	\defgroup FLEXT_D_NEW Stand-alone class instantiation
! 	Makes an actual instance of a stand-alone class.
  */
  
! /*!	\defgroup FLEXT_D_NEW_DSP Dsp class instantiation
! 	Makes an actual instance of a dsp (aka "tilde") class (with signal processing).
  */
  
! /*!	\defgroup FLEXT_D_LIB Library class instantiation
! 	Makes an actual instance of a class	which is part of an object library (and not stand-alone).
  */
  
! /*!	\defgroup FLEXT_D_LIB_DSP Dsp library class instantiation
! 	Makes an actual instance of a dsp (aka "tilde") class with signal processing
! 	which is part of an object library (and not stand-alone).
  */
  
--- 33,51 ----
  
  
! /*! \defgroup FLEXT_D_NEW Stand-alone class instantiation
!     Makes an actual instance of a stand-alone class.
  */
  
! /*! \defgroup FLEXT_D_NEW_DSP Dsp class instantiation
!     Makes an actual instance of a dsp (aka "tilde") class (with signal processing).
  */
  
! /*! \defgroup FLEXT_D_LIB Library class instantiation
!     Makes an actual instance of a class which is part of an object library (and not stand-alone).
  */
  
! /*! \defgroup FLEXT_D_LIB_DSP Dsp library class instantiation
!     Makes an actual instance of a dsp (aka "tilde") class with signal processing
!     which is part of an object library (and not stand-alone).
  */
  
***************
*** 54,74 ****
  
  /*! \brief Implementation of a flext class with no arguments
! 	\ingroup FLEXT_D_NEW
! 	\param NAME the object's actual name(s) as a string (like "*", "trigger", "noise~", etc.)
! 	\param NEW_CLASS the object's C++ class name 
  */
! #define FLEXT_NEW(NAME,NEW_CLASS)		\
  \
  REAL_NEW(NAME,NEW_CLASS,0,0)
  
  /*! \brief Implementation of a flext dsp class with no arguments
! 	\ingroup FLEXT_D_NEW_DSP
  */
! #define FLEXT_NEW_DSP(NAME,NEW_CLASS)	\
  \
  REAL_NEW(NAME,NEW_CLASS,1,0)
  
  /*! \brief Implementation of a flext class (part of a library) with no arguments
! 	\ingroup FLEXT_D_LIB
  */
  #define FLEXT_LIB(NAME,NEW_CLASS) \
--- 54,74 ----
  
  /*! \brief Implementation of a flext class with no arguments
!     \ingroup FLEXT_D_NEW
!     \param NAME the object's actual name(s) as a string (like "*", "trigger", "noise~", etc.)
!     \param NEW_CLASS the object's C++ class name 
  */
! #define FLEXT_NEW(NAME,NEW_CLASS)       \
  \
  REAL_NEW(NAME,NEW_CLASS,0,0)
  
  /*! \brief Implementation of a flext dsp class with no arguments
!     \ingroup FLEXT_D_NEW_DSP
  */
! #define FLEXT_NEW_DSP(NAME,NEW_CLASS)   \
  \
  REAL_NEW(NAME,NEW_CLASS,1,0)
  
  /*! \brief Implementation of a flext class (part of a library) with no arguments
!     \ingroup FLEXT_D_LIB
  */
  #define FLEXT_LIB(NAME,NEW_CLASS) \
***************
*** 77,83 ****
  
  /*! \brief Implementation of a flext dsp class (part of a library) with no arguments
! 	\ingroup FLEXT_D_LIB_DSP
  */
! #define FLEXT_LIB_DSP(NAME,NEW_CLASS)	\
  \
  REAL_NEW(NAME,NEW_CLASS,1,1) 
--- 77,83 ----
  
  /*! \brief Implementation of a flext dsp class (part of a library) with no arguments
!     \ingroup FLEXT_D_LIB_DSP
  */
! #define FLEXT_LIB_DSP(NAME,NEW_CLASS)   \
  \
  REAL_NEW(NAME,NEW_CLASS,1,1) 
***************
*** 88,115 ****
  
  /*! \brief Implementation of a flext class with a variable argument list
! 	\ingroup FLEXT_D_NEW
  */
! #define FLEXT_NEW_V(NAME,NEW_CLASS)			\
  \
  REAL_NEW_V(NAME,NEW_CLASS,0,0) \
  
  /*! \brief Implementation of a flext dsp class with a variable argument list
! 	\ingroup FLEXT_D_NEW_DSP
  */
! #define FLEXT_NEW_DSP_V(NAME,NEW_CLASS)	\
  \
  REAL_NEW_V(NAME,NEW_CLASS,1,0) \
  
  /*! \brief Implementation of a flext class (part of a library) with a variable argument list
! 	\ingroup FLEXT_D_LIB
  */
! #define FLEXT_LIB_V(NAME,NEW_CLASS)			\
  \
  REAL_NEW_V(NAME,NEW_CLASS, 0,1) 
  
  /*! \brief Implementation of a flext dsp class (part of a library) with a variable argument list
! 	\ingroup FLEXT_D_LIB_DSP
  */
! #define FLEXT_LIB_DSP_V(NAME,NEW_CLASS)	\
  \
  REAL_NEW_V(NAME,NEW_CLASS, 1,1) 
--- 88,115 ----
  
  /*! \brief Implementation of a flext class with a variable argument list
!     \ingroup FLEXT_D_NEW
  */
! #define FLEXT_NEW_V(NAME,NEW_CLASS)         \
  \
  REAL_NEW_V(NAME,NEW_CLASS,0,0) \
  
  /*! \brief Implementation of a flext dsp class with a variable argument list
!     \ingroup FLEXT_D_NEW_DSP
  */
! #define FLEXT_NEW_DSP_V(NAME,NEW_CLASS) \
  \
  REAL_NEW_V(NAME,NEW_CLASS,1,0) \
  
  /*! \brief Implementation of a flext class (part of a library) with a variable argument list
!     \ingroup FLEXT_D_LIB
  */
! #define FLEXT_LIB_V(NAME,NEW_CLASS)         \
  \
  REAL_NEW_V(NAME,NEW_CLASS, 0,1) 
  
  /*! \brief Implementation of a flext dsp class (part of a library) with a variable argument list
!     \ingroup FLEXT_D_LIB_DSP
  */
! #define FLEXT_LIB_DSP_V(NAME,NEW_CLASS) \
  \
  REAL_NEW_V(NAME,NEW_CLASS, 1,1) 
***************
*** 120,138 ****
  
  /*! \brief Implementation of a flext class with one argument
! 	\ingroup FLEXT_D_NEW
  */
! #define FLEXT_NEW_1(NAME,NEW_CLASS, TYPE)		\
  \
  REAL_NEW_1(NAME,NEW_CLASS, 0, 0,TYPE) \
  
  /*! \brief Implementation of a flext dsp class with one argument
! 	\ingroup FLEXT_D_NEW_DSP
  */
! #define FLEXT_NEW_DSP_1(NAME,NEW_CLASS, TYPE)	\
  \
  REAL_NEW_1(NAME,NEW_CLASS, 1, 0,TYPE) \
  
  /*! \brief Implementation of a flext class (part of a library) with one argument
! 	\ingroup FLEXT_D_LIB
  */
  #define FLEXT_LIB_1(NAME,NEW_CLASS, TYPE) \
--- 120,138 ----
  
  /*! \brief Implementation of a flext class with one argument
!     \ingroup FLEXT_D_NEW
  */
! #define FLEXT_NEW_1(NAME,NEW_CLASS, TYPE)       \
  \
  REAL_NEW_1(NAME,NEW_CLASS, 0, 0,TYPE) \
  
  /*! \brief Implementation of a flext dsp class with one argument
!     \ingroup FLEXT_D_NEW_DSP
  */
! #define FLEXT_NEW_DSP_1(NAME,NEW_CLASS, TYPE)   \
  \
  REAL_NEW_1(NAME,NEW_CLASS, 1, 0,TYPE) \
  
  /*! \brief Implementation of a flext class (part of a library) with one argument
!     \ingroup FLEXT_D_LIB
  */
  #define FLEXT_LIB_1(NAME,NEW_CLASS, TYPE) \
***************
*** 141,147 ****
  
  /*! \brief Implementation of a flext dsp class (part of a library) with one argument
! 	\ingroup FLEXT_D_LIB_DSP
  */
! #define FLEXT_LIB_DSP_1(NAME,NEW_CLASS, TYPE)	\
  \
  REAL_NEW_1(NAME,NEW_CLASS, 1,1, TYPE)
--- 141,147 ----
  
  /*! \brief Implementation of a flext dsp class (part of a library) with one argument
!     \ingroup FLEXT_D_LIB_DSP
  */
! #define FLEXT_LIB_DSP_1(NAME,NEW_CLASS, TYPE)   \
  \
  REAL_NEW_1(NAME,NEW_CLASS, 1,1, TYPE)
***************
*** 152,179 ****
  
  /*! \brief Implementation of a flext class with 2 arguments
! 	\ingroup FLEXT_D_NEW
  */
! #define FLEXT_NEW_2(NAME,NEW_CLASS, TYPE1, TYPE2)			\
  \
  REAL_NEW_2(NAME,NEW_CLASS, 0,0, TYPE1, TYPE2) \
  
  /*! \brief Implementation of a flext dsp class with 2 arguments
! 	\ingroup FLEXT_D_NEW_DSP
  */
! #define FLEXT_NEW_DSP_2(NAME,NEW_CLASS, TYPE1, TYPE2)	\
  \
  REAL_NEW_2(NAME,NEW_CLASS, 1,0, TYPE1, TYPE2) \
  
  /*! \brief Implementation of a flext class (part of a library) with 2 arguments
! 	\ingroup FLEXT_D_LIB
  */
! #define FLEXT_LIB_2(NAME,NEW_CLASS, TYPE1, TYPE2)		\
  \
  REAL_NEW_2(NAME,NEW_CLASS, 0,1, TYPE1, TYPE2)
  
  /*! \brief Implementation of a flext dsp class (part of a library) with 2 arguments
! 	\ingroup FLEXT_D_LIB_DSP
  */
! #define FLEXT_LIB_DSP_2(NAME,NEW_CLASS, TYPE1, TYPE2)	\
  \
  REAL_NEW_2(NAME,NEW_CLASS, 1,1, TYPE1, TYPE2)
--- 152,179 ----
  
  /*! \brief Implementation of a flext class with 2 arguments
!     \ingroup FLEXT_D_NEW
  */
! #define FLEXT_NEW_2(NAME,NEW_CLASS, TYPE1, TYPE2)           \
  \
  REAL_NEW_2(NAME,NEW_CLASS, 0,0, TYPE1, TYPE2) \
  
  /*! \brief Implementation of a flext dsp class with 2 arguments
!     \ingroup FLEXT_D_NEW_DSP
  */
! #define FLEXT_NEW_DSP_2(NAME,NEW_CLASS, TYPE1, TYPE2)   \
  \
  REAL_NEW_2(NAME,NEW_CLASS, 1,0, TYPE1, TYPE2) \
  
  /*! \brief Implementation of a flext class (part of a library) with 2 arguments
!     \ingroup FLEXT_D_LIB
  */
! #define FLEXT_LIB_2(NAME,NEW_CLASS, TYPE1, TYPE2)       \
  \
  REAL_NEW_2(NAME,NEW_CLASS, 0,1, TYPE1, TYPE2)
  
  /*! \brief Implementation of a flext dsp class (part of a library) with 2 arguments
!     \ingroup FLEXT_D_LIB_DSP
  */
! #define FLEXT_LIB_DSP_2(NAME,NEW_CLASS, TYPE1, TYPE2)   \
  \
  REAL_NEW_2(NAME,NEW_CLASS, 1,1, TYPE1, TYPE2)
***************
*** 184,188 ****
  
  /*! \brief Implementation of a flext class with 3 arguments
! 	\ingroup FLEXT_D_NEW
  */
  #define FLEXT_NEW_3(NAME,NEW_CLASS, TYPE1, TYPE2, TYPE3) \
--- 184,188 ----
  
  /*! \brief Implementation of a flext class with 3 arguments
!     \ingroup FLEXT_D_NEW
  */
  #define FLEXT_NEW_3(NAME,NEW_CLASS, TYPE1, TYPE2, TYPE3) \
***************
*** 191,211 ****
  
  /*! \brief Implementation of a flext dsp class with 3 arguments
! 	\ingroup FLEXT_D_NEW_DSP
  */
! #define FLEXT_NEW_DSP_3(NAME,NEW_CLASS, TYPE1, TYPE2, TYPE3)	\
  \
  REAL_NEW_3(NAME,NEW_CLASS, 1,0, TYPE1, TYPE2, TYPE3) \
  
  /*! \brief Implementation of a flext class (part of a library) with 3 arguments
! 	\ingroup FLEXT_D_LIB
  */
! #define FLEXT_LIB_3(NAME,NEW_CLASS, TYPE1, TYPE2, TYPE3)		\
  \
  REAL_NEW_3(NAME,NEW_CLASS, 0,1,TYPE1, TYPE2, TYPE3)
  
  /*! \brief Implementation of a flext dsp class (part of a library) with 3 arguments
! 	\ingroup FLEXT_D_LIB_DSP
  */
! #define FLEXT_LIB_DSP_3(NAME,NEW_CLASS, TYPE1, TYPE2, TYPE3)	\
  \
  REAL_NEW_3(NAME,NEW_CLASS, 1,1, TYPE1, TYPE2, TYPE3)
--- 191,211 ----
  
  /*! \brief Implementation of a flext dsp class with 3 arguments
!     \ingroup FLEXT_D_NEW_DSP
  */
! #define FLEXT_NEW_DSP_3(NAME,NEW_CLASS, TYPE1, TYPE2, TYPE3)    \
  \
  REAL_NEW_3(NAME,NEW_CLASS, 1,0, TYPE1, TYPE2, TYPE3) \
  
  /*! \brief Implementation of a flext class (part of a library) with 3 arguments
!     \ingroup FLEXT_D_LIB
  */
! #define FLEXT_LIB_3(NAME,NEW_CLASS, TYPE1, TYPE2, TYPE3)        \
  \
  REAL_NEW_3(NAME,NEW_CLASS, 0,1,TYPE1, TYPE2, TYPE3)
  
  /*! \brief Implementation of a flext dsp class (part of a library) with 3 arguments
!     \ingroup FLEXT_D_LIB_DSP
  */
! #define FLEXT_LIB_DSP_3(NAME,NEW_CLASS, TYPE1, TYPE2, TYPE3)    \
  \
  REAL_NEW_3(NAME,NEW_CLASS, 1,1, TYPE1, TYPE2, TYPE3)
***************
*** 214,220 ****
  // deprecated stuff
  
! /*!	\defgroup FLEXT_D_DEPRECATED Deprecated definitions 
! 	\deprecated
! 	@{ 
  */
  
--- 214,220 ----
  // deprecated stuff
  
! /*! \defgroup FLEXT_D_DEPRECATED Deprecated definitions 
!     \deprecated
!     @{ 
  */
  
***************
*** 240,259 ****
  
  
! /*!	\defgroup FLEXT_D_LIBRARY Definitions for library objects
! 	@{ 
  */
  
  /*! \brief Specify that to declare the library itself.
! 	\note If you have a library this is compulsory (to register all the objects of the library)
  */
  #define FLEXT_LIB_SETUP(NAME,SETUPFUN) REAL_LIB_SETUP(NAME,SETUPFUN)
  
  /*! \brief Register an object in the library.
! 	\note This is used in the library setup function
  */
  #define FLEXT_SETUP(cl) REAL_SETUP(cl,0)
  
  /*! \brief Register a DSP object in the library.
! 	\note This is used in the library setup function
  */
  #define FLEXT_DSP_SETUP(cl) REAL_SETUP(cl,1)
--- 240,259 ----
  
  
! /*! \defgroup FLEXT_D_LIBRARY Definitions for library objects
!     @{ 
  */
  
  /*! \brief Specify that to declare the library itself.
!     \note If you have a library this is compulsory (to register all the objects of the library)
  */
  #define FLEXT_LIB_SETUP(NAME,SETUPFUN) REAL_LIB_SETUP(NAME,SETUPFUN)
  
  /*! \brief Register an object in the library.
!     \note This is used in the library setup function
  */
  #define FLEXT_SETUP(cl) REAL_SETUP(cl,0)
  
  /*! \brief Register a DSP object in the library.
!     \note This is used in the library setup function
  */
  #define FLEXT_DSP_SETUP(cl) REAL_SETUP(cl,1)

Index: fldefs_methcb.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/fldefs_methcb.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** fldefs_methcb.h	12 Dec 2003 03:32:56 -0000	1.2
--- fldefs_methcb.h	21 Jun 2004 13:58:19 -0000	1.3
***************
*** 18,24 ****
  
  
! /*!	\defgroup FLEXT_D_CALLBACK Declare callbacks for class methods
      \ingroup FLEXT_D_METHOD
! 	@{ 
  */
  
--- 18,24 ----
  
  
! /*! \defgroup FLEXT_D_CALLBACK Declare callbacks for class methods
      \ingroup FLEXT_D_METHOD
!     @{ 
  */
  
***************
*** 84,88 ****
  
  
! //	Shortcuts
  
  //! Set up a method callback for 1 float argument
--- 84,88 ----
  
  
! //  Shortcuts
  
  //! Set up a method callback for 1 float argument

Index: flprefix.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flprefix.h,v
retrieving revision 1.27
retrieving revision 1.28
diff -C2 -d -r1.27 -r1.28
*** flprefix.h	27 Mar 2004 03:22:14 -0000	1.27
--- flprefix.h	21 Jun 2004 13:58:19 -0000	1.28
***************
*** 17,58 ****
  
  // --- definitions for FLEXT_SYS ---------------------
! #define FLEXT_SYS_UNKNOWN	0
  
  #ifndef FLEXT_SYS_MAX
! 	#define FLEXT_SYS_MAX	1
  #else
! 	// already defined
! 	#undef FLEXT_SYS_MAX
! 	#define FLEXT_SYS_MAX	1
! 	#define FLEXT_SYS FLEXT_SYS_MAX
  #endif
  
  #ifndef FLEXT_SYS_PD
! 	#define FLEXT_SYS_PD	2
  #else
! 	// already defined
! 	#undef FLEXT_SYS_PD
! 	#define FLEXT_SYS_PD	2
! 	#define FLEXT_SYS FLEXT_SYS_PD
  #endif
  
  #ifndef FLEXT_SYS_JMAX
! 	#define FLEXT_SYS_JMAX	3
  #else
! 	// already defined
! 	#undef FLEXT_SYS_JMAX
! 	#define FLEXT_SYS_JMAX	3
! 	#define FLEXT_SYS FLEXT_SYS_JMAX
  #endif
  
  // --- definitions for FLEXT_OS ----------------------
! #define FLEXT_OS_UNKNOWN	0
! #define FLEXT_OS_WIN	1
! #define FLEXT_OS_MAC	2  
! #define FLEXT_OS_LINUX	3
! #define FLEXT_OS_IRIX	4
  
  // --- definitions for FLEXT_OS_API ---------------------
! #define FLEXT_OSAPI_UNKNOWN	0
  
  #define FLEXT_OSAPI_UNIX_POSIX 1
--- 17,58 ----
  
  // --- definitions for FLEXT_SYS ---------------------
! #define FLEXT_SYS_UNKNOWN   0
  
  #ifndef FLEXT_SYS_MAX
!     #define FLEXT_SYS_MAX   1
  #else
!     // already defined
!     #undef FLEXT_SYS_MAX
!     #define FLEXT_SYS_MAX   1
!     #define FLEXT_SYS FLEXT_SYS_MAX
  #endif
  
  #ifndef FLEXT_SYS_PD
!     #define FLEXT_SYS_PD    2
  #else
!     // already defined
!     #undef FLEXT_SYS_PD
!     #define FLEXT_SYS_PD    2
!     #define FLEXT_SYS FLEXT_SYS_PD
  #endif
  
  #ifndef FLEXT_SYS_JMAX
!     #define FLEXT_SYS_JMAX  3
  #else
!     // already defined
!     #undef FLEXT_SYS_JMAX
!     #define FLEXT_SYS_JMAX  3
!     #define FLEXT_SYS FLEXT_SYS_JMAX
  #endif
  
  // --- definitions for FLEXT_OS ----------------------
! #define FLEXT_OS_UNKNOWN    0
! #define FLEXT_OS_WIN    1
! #define FLEXT_OS_MAC    2  
! #define FLEXT_OS_LINUX  3
! #define FLEXT_OS_IRIX   4
  
  // --- definitions for FLEXT_OS_API ---------------------
! #define FLEXT_OSAPI_UNKNOWN 0
  
  #define FLEXT_OSAPI_UNIX_POSIX 1
***************
*** 63,79 ****
  
  #define FLEXT_OSAPI_WIN_NATIVE 5  // WIN32 Platform
! #define FLEXT_OSAPI_WIN_POSIX 6	   // POSIX API (e.g. cygwin)
  
  // --- definitions for FLEXT_CPU ---------------------
! #define FLEXT_CPU_UNKNOWN	0
  #define FLEXT_CPU_INTEL 1
! #define FLEXT_CPU_PPC 	2
! #define FLEXT_CPU_MIPS	3
! #define FLEXT_CPU_ALPHA	4
  
  // --- definitions for FLEXT_THREADS -----------------
  #define FLEXT_THR_POSIX 1 // pthreads
! #define FLEXT_THR_WIN32	2 // Win32 native
! #define FLEXT_THR_MP	3 // MacOS MPThreads
  
  // ---------------------------------------------------
--- 63,79 ----
  
  #define FLEXT_OSAPI_WIN_NATIVE 5  // WIN32 Platform
! #define FLEXT_OSAPI_WIN_POSIX 6    // POSIX API (e.g. cygwin)
  
  // --- definitions for FLEXT_CPU ---------------------
! #define FLEXT_CPU_UNKNOWN   0
  #define FLEXT_CPU_INTEL 1
! #define FLEXT_CPU_PPC   2
! #define FLEXT_CPU_MIPS  3
! #define FLEXT_CPU_ALPHA 4
  
  // --- definitions for FLEXT_THREADS -----------------
  #define FLEXT_THR_POSIX 1 // pthreads
! #define FLEXT_THR_WIN32 2 // Win32 native
! #define FLEXT_THR_MP    3 // MacOS MPThreads
  
  // ---------------------------------------------------
***************
*** 81,96 ****
  
  #ifndef FLEXT_SYS
! 	#if defined(MAXMSP)
! 		#define FLEXT_SYS FLEXT_SYS_MAX
! 	//	#undef MAXMSP
! 	#elif defined(PD)
! 		#define FLEXT_SYS FLEXT_SYS_PD
! 	//	#undef PD
! 	//	#undef NT
! 	#endif
  #endif
  
  #if defined(_DEBUG) && !defined(FLEXT_DEBUG)
! 	#define FLEXT_DEBUG
  #endif
  
--- 81,96 ----
  
  #ifndef FLEXT_SYS
!     #if defined(MAXMSP)
!         #define FLEXT_SYS FLEXT_SYS_MAX
!     //  #undef MAXMSP
!     #elif defined(PD)
!         #define FLEXT_SYS FLEXT_SYS_PD
!     //  #undef PD
!     //  #undef NT
!     #endif
  #endif
  
  #if defined(_DEBUG) && !defined(FLEXT_DEBUG)
!     #define FLEXT_DEBUG
  #endif
  
***************
*** 102,285 ****
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
  #else
! 	#error "System must be defined by either FLEXT_SYS_MAX, FLEXT_SYS_PD or FLEXT_SYS_JMAX"
  #endif
  
  // Definition of OS/CPU
  #if defined(_MSC_VER) || (defined(__ICC) && (FLEXT_OS == FLEXT_OS_WIN || defined(_WIN32)))
! 	// Microsoft C++
      // and Intel C++ (as guessed)
! 	
! 	#ifndef FLEXT_CPU
! 		#if defined(_M_IX86)
! 			#define FLEXT_CPU FLEXT_CPU_INTEL
! 		#elif defined(_M_PPC)
! 			#define FLEXT_CPU FLEXT_CPU_PPC
! 		#elif defined(_M_MRX000)
! 			#define FLEXT_CPU FLEXT_CPU_MIPS
! 		#elif defined(_M_ALPHA)
! 			#define FLEXT_CPU FLEXT_CPU_ALPHA
! 		#else
! 			#define FLEXT_CPU FLEXT_CPU_UNKNOWN
! 		#endif
! 	#endif
  
! 	#ifndef FLEXT_OS
! 		#if defined(_WIN32)
! 			#define FLEXT_OS FLEXT_OS_WIN
! 			#define FLEXT_OSAPI FLEXT_OSAPI_WIN_NATIVE
! 		#else
! 			#define FLEXT_OS FLEXT_OS_UNKNOWN
! 			#define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN
! 		#endif
! 	#endif
  
  
  #elif defined(__BORLANDC__) 
! 	// Borland C++
  
! 	#ifndef FLEXT_CPU
! 		#define FLEXT_CPU FLEXT_CPU_INTEL
! 	#endif
! 	#ifndef FLEXT_OS
! 		#define FLEXT_OS FLEXT_OS_WIN
! 		#define FLEXT_OSAPI FLEXT_OSAPI_WIN_NATIVE
! 	#else	
! 		#define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN
! 	#endif
  
  
  #elif defined(__MWERKS__)
! 	// Metrowerks CodeWarrior
  
! 	#ifdef __MACH__
! 		// quick fix for OSX Mach-O
! 		#define TARGET_CPU_PPC 1
! 		#define TARGET_OS_MAC 1
! 		#define TARGET_API_MAC_OSX 1
! 	#else
! 		#ifndef __CONDITIONALMACROS__
! 		#include <ConditionalMacros.h>
! 		#endif
! 	#endif
  
! 	#ifndef FLEXT_CPU
! 		#if TARGET_CPU_X86
! 			#define FLEXT_CPU FLEXT_CPU_INTEL
! 		#elif TARGET_CPU_PPC
! 			#define FLEXT_CPU FLEXT_CPU_PPC
! 		#elif TARGET_CPU_MIPS
! 			#define FLEXT_CPU FLEXT_CPU_MIPS
! 		#elif TARGET_CPU_ALPHA
! 			#define FLEXT_CPU FLEXT_CPU_ALPHA
! 		#else
! 			#define FLEXT_CPU FLEXT_CPU_UNKNOWN
! 		#endif
! 	#endif
  
! 	#ifndef FLEXT_OS
! 		#if TARGET_OS_MAC
! 			#define FLEXT_OS FLEXT_OS_MAC
! 		#elif TARGET_OS_WIN32
! 			// assume Windows
! 			#define FLEXT_OS FLEXT_OS_WIN
! 		#else
! 			#define FLEXT_OS FLEXT_OS_UNKNOWN
! 		#endif
! 	#endif
! 	
! 	#ifndef FLEXT_OSAPI
! 		#if TARGET_API_MAC_MACH
! 			// this is for Mach-O
! 			// this has the precedence (MACH also supports Carbon, of course)
! 			#define FLEXT_OSAPI FLEXT_OSAPI_MAC_MACH
! 		#elif TARGET_API_MAC_CARBON
! 			// this is for CFM
! 			#define FLEXT_OSAPI FLEXT_OSAPI_MAC_CARBON
! 		#else
! 			#define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN
! 		#endif
! 	#endif
! 	
! 	// This is important for method and attribute callbacks
! 	#pragma enumsalwaysint on
! 	// This is important for everything
! 	#pragma bool on
  
  #elif defined(__GNUG__) || (defined(__ICC) && (FLEXT_OS == FLEXT_OS_LINUX || defined(linux) || defined(__linux__)))
  
! 	// GNU C++
      // and Intel (as suggested by Tim Blechmann)
  
! 	#ifndef FLEXT_CPU
! 		#if defined(_X86_) || defined(__i386__) || defined(__i586__) || defined(__i686__)
! 			#define FLEXT_CPU FLEXT_CPU_INTEL
! 		#elif defined(__POWERPC__)
! 			#define FLEXT_CPU FLEXT_CPU_PPC
! 		#elif defined(__MIPS__)
! 			#define FLEXT_CPU FLEXT_CPU_MIPS
! 		#else
! 			#define FLEXT_CPU FLEXT_CPU_UNKNOWN
! 		#endif
! 	#endif
  
! 	#ifndef FLEXT_OS
! 		#if defined(linux) || defined(__linux__)
! 			#define FLEXT_OS FLEXT_OS_LINUX
! 		#elif defined(__CYGWIN__) || defined(__CYGWIN32__) || defined(__MINGW32__)
! 			#define FLEXT_OS FLEXT_OS_WIN
! 		#elif defined(__APPLE__) && defined(__MACH__)
! 			#define FLEXT_OS FLEXT_OS_MAC
! 		// how about IRIX??
! 		#else
! 			#define FLEXT_OS FLEXT_OS_UNKNOWN
! 		#endif
! 	#endif
  
! 	#ifndef FLEXT_OSAPI
! 		#if FLEXT_OS == FLEXT_OS_MAC
! 			#define FLEXT_OSAPI FLEXT_OSAPI_MAC_MACH
! 		#elif FLEXT_OS == FLEXT_OS_WIN
              #if defined(__MINGW32__)
! 			    #define FLEXT_OSAPI FLEXT_OSAPI_WIN_NATIVE
              #else
! 			    #define FLEXT_OSAPI FLEXT_OSAPI_WIN_POSIX
              #endif
! 		#elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX
! 			#define FLEXT_OSAPI FLEXT_OSAPI_UNIX_POSIX
! 		#else
! 			#define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN
! 		#endif
! 	#endif
  
  #elif defined(__MRC__) && defined(MPW_CPLUS)
! 	// Apple MPW MrCpp
  
! 	#if __MRC__ < 0x500
! 		#error Apple MPW MrCpp v.5.0.0 or later compiler required
! 	#endif
  
! 	#ifndef FLEXT_CPU
! 		#if defined(__POWERPC__)
! 			#define FLEXT_CPU FLEXT_CPU_PPC
! 		#else
! 			#define FLEXT_CPU FLEXT_CPU_UNKNOWN
! 		#endif
! 	#endif
  
! 	#ifndef FLEXT_OS
! 		#if defined(macintosh)
! 			#define FLEXT_OS FLEXT_OS_MAC
! 		#else
! 			#define FLEXT_OS FLEXT_OS_UNKNOWN
! 		#endif
! 	#endif
  
! 	#ifndef FLEXT_OSAPI
! 		#if FLEXT_OS == FLEXT_OS_MAC
! 			#define FLEXT_OSAPI FLEXT_OSAPI_MAC_CLASSIC
! 		#else
! 			#define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN
! 		#endif
! 	#endif
  #endif
  
--- 102,285 ----
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
  #else
!     #error "System must be defined by either FLEXT_SYS_MAX, FLEXT_SYS_PD or FLEXT_SYS_JMAX"
  #endif
  
  // Definition of OS/CPU
  #if defined(_MSC_VER) || (defined(__ICC) && (FLEXT_OS == FLEXT_OS_WIN || defined(_WIN32)))
!     // Microsoft C++
      // and Intel C++ (as guessed)
!     
!     #ifndef FLEXT_CPU
!         #if defined(_M_IX86)
!             #define FLEXT_CPU FLEXT_CPU_INTEL
!         #elif defined(_M_PPC)
!             #define FLEXT_CPU FLEXT_CPU_PPC
!         #elif defined(_M_MRX000)
!             #define FLEXT_CPU FLEXT_CPU_MIPS
!         #elif defined(_M_ALPHA)
!             #define FLEXT_CPU FLEXT_CPU_ALPHA
!         #else
!             #define FLEXT_CPU FLEXT_CPU_UNKNOWN
!         #endif
!     #endif
  
!     #ifndef FLEXT_OS
!         #if defined(_WIN32)
!             #define FLEXT_OS FLEXT_OS_WIN
!             #define FLEXT_OSAPI FLEXT_OSAPI_WIN_NATIVE
!         #else
!             #define FLEXT_OS FLEXT_OS_UNKNOWN
!             #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN
!         #endif
!     #endif
  
  
  #elif defined(__BORLANDC__) 
!     // Borland C++
  
!     #ifndef FLEXT_CPU
!         #define FLEXT_CPU FLEXT_CPU_INTEL
!     #endif
!     #ifndef FLEXT_OS
!         #define FLEXT_OS FLEXT_OS_WIN
!         #define FLEXT_OSAPI FLEXT_OSAPI_WIN_NATIVE
!     #else   
!         #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN
!     #endif
  
  
  #elif defined(__MWERKS__)
!     // Metrowerks CodeWarrior
  
!     #ifdef __MACH__
!         // quick fix for OSX Mach-O
!         #define TARGET_CPU_PPC 1
!         #define TARGET_OS_MAC 1
!         #define TARGET_API_MAC_OSX 1
!     #else
!         #ifndef __CONDITIONALMACROS__
!         #include <ConditionalMacros.h>
!         #endif
!     #endif
  
!     #ifndef FLEXT_CPU
!         #if TARGET_CPU_X86
!             #define FLEXT_CPU FLEXT_CPU_INTEL
!         #elif TARGET_CPU_PPC
!             #define FLEXT_CPU FLEXT_CPU_PPC
!         #elif TARGET_CPU_MIPS
!             #define FLEXT_CPU FLEXT_CPU_MIPS
!         #elif TARGET_CPU_ALPHA
!             #define FLEXT_CPU FLEXT_CPU_ALPHA
!         #else
!             #define FLEXT_CPU FLEXT_CPU_UNKNOWN
!         #endif
!     #endif
  
!     #ifndef FLEXT_OS
!         #if TARGET_OS_MAC
!             #define FLEXT_OS FLEXT_OS_MAC
!         #elif TARGET_OS_WIN32
!             // assume Windows
!             #define FLEXT_OS FLEXT_OS_WIN
!         #else
!             #define FLEXT_OS FLEXT_OS_UNKNOWN
!         #endif
!     #endif
!     
!     #ifndef FLEXT_OSAPI
!         #if TARGET_API_MAC_MACH
!             // this is for Mach-O
!             // this has the precedence (MACH also supports Carbon, of course)
!             #define FLEXT_OSAPI FLEXT_OSAPI_MAC_MACH
!         #elif TARGET_API_MAC_CARBON
!             // this is for CFM
!             #define FLEXT_OSAPI FLEXT_OSAPI_MAC_CARBON
!         #else
!             #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN
!         #endif
!     #endif
!     
!     // This is important for method and attribute callbacks
!     #pragma enumsalwaysint on
!     // This is important for everything
!     #pragma bool on
  
  #elif defined(__GNUG__) || (defined(__ICC) && (FLEXT_OS == FLEXT_OS_LINUX || defined(linux) || defined(__linux__)))
  
!     // GNU C++
      // and Intel (as suggested by Tim Blechmann)
  
!     #ifndef FLEXT_CPU
!         #if defined(_X86_) || defined(__i386__) || defined(__i586__) || defined(__i686__)
!             #define FLEXT_CPU FLEXT_CPU_INTEL
!         #elif defined(__POWERPC__)
!             #define FLEXT_CPU FLEXT_CPU_PPC
!         #elif defined(__MIPS__)
!             #define FLEXT_CPU FLEXT_CPU_MIPS
!         #else
!             #define FLEXT_CPU FLEXT_CPU_UNKNOWN
!         #endif
!     #endif
  
!     #ifndef FLEXT_OS
!         #if defined(linux) || defined(__linux__)
!             #define FLEXT_OS FLEXT_OS_LINUX
!         #elif defined(__CYGWIN__) || defined(__CYGWIN32__) || defined(__MINGW32__)
!             #define FLEXT_OS FLEXT_OS_WIN
!         #elif defined(__APPLE__) && defined(__MACH__)
!             #define FLEXT_OS FLEXT_OS_MAC
!         // how about IRIX??
!         #else
!             #define FLEXT_OS FLEXT_OS_UNKNOWN
!         #endif
!     #endif
  
!     #ifndef FLEXT_OSAPI
!         #if FLEXT_OS == FLEXT_OS_MAC
!             #define FLEXT_OSAPI FLEXT_OSAPI_MAC_MACH
!         #elif FLEXT_OS == FLEXT_OS_WIN
              #if defined(__MINGW32__)
!                 #define FLEXT_OSAPI FLEXT_OSAPI_WIN_NATIVE
              #else
!                 #define FLEXT_OSAPI FLEXT_OSAPI_WIN_POSIX
              #endif
!         #elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX
!             #define FLEXT_OSAPI FLEXT_OSAPI_UNIX_POSIX
!         #else
!             #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN
!         #endif
!     #endif
  
  #elif defined(__MRC__) && defined(MPW_CPLUS)
!     // Apple MPW MrCpp
  
!     #if __MRC__ < 0x500
!         #error Apple MPW MrCpp v.5.0.0 or later compiler required
!     #endif
  
!     #ifndef FLEXT_CPU
!         #if defined(__POWERPC__)
!             #define FLEXT_CPU FLEXT_CPU_PPC
!         #else
!             #define FLEXT_CPU FLEXT_CPU_UNKNOWN
!         #endif
!     #endif
  
!     #ifndef FLEXT_OS
!         #if defined(macintosh)
!             #define FLEXT_OS FLEXT_OS_MAC
!         #else
!             #define FLEXT_OS FLEXT_OS_UNKNOWN
!         #endif
!     #endif
  
!     #ifndef FLEXT_OSAPI
!         #if FLEXT_OS == FLEXT_OS_MAC
!             #define FLEXT_OSAPI FLEXT_OSAPI_MAC_CLASSIC
!         #else
!             #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN
!         #endif
!     #endif
  #endif
  
***************
*** 287,328 ****
  
  #if FLEXT_OS == FLEXT_OS_WIN
! //	#pragma message("Compiling for Windows")
  
! 	#if FLEXT_SYS == FLEXT_SYS_MAX
! //		#define WIN_VERSION 1
! 	#elif FLEXT_SYS == FLEXT_SYS_PD
! //		#define PD
! //		#define NT
! 	#endif
  #elif FLEXT_OS == FLEXT_OS_LINUX
! //	#pragma message("Compiling for Linux")
  
! 	#if FLEXT_SYS == FLEXT_SYS_PD
! //		#define PD
! 	#else
! 		#error "Flext SYS/OS combination unknown"
! 	#endif
  #elif FLEXT_OS == FLEXT_OS_IRIX
! //	#pragma message("Compiling for Irix")
  
! 	#if FLEXT_SYS == FLEXT_SYS_PD
! //		#define PD
! 	#else
! 		#error "Flext SYS/OS combination unknown"
! 	#endif
  #elif FLEXT_OS == FLEXT_OS_MAC
! //	#pragma message("Compiling for MacOS")
  
! 	#if FLEXT_SYS == FLEXT_SYS_PD
! //		#define PD
! 	#endif
  #else
! 	#error "Operating system could not be determined"
  #endif
  
  #if FLEXT_SYS == FLEXT_SYS_MAX
! //	#pragma message("Compiling for Max/MSP")
  #elif FLEXT_SYS == FLEXT_SYS_PD
! //	#pragma message("Compiling for PD")
  #endif
  
--- 287,328 ----
  
  #if FLEXT_OS == FLEXT_OS_WIN
! //  #pragma message("Compiling for Windows")
  
!     #if FLEXT_SYS == FLEXT_SYS_MAX
! //      #define WIN_VERSION 1
!     #elif FLEXT_SYS == FLEXT_SYS_PD
! //      #define PD
! //      #define NT
!     #endif
  #elif FLEXT_OS == FLEXT_OS_LINUX
! //  #pragma message("Compiling for Linux")
  
!     #if FLEXT_SYS == FLEXT_SYS_PD
! //      #define PD
!     #else
!         #error "Flext SYS/OS combination unknown"
!     #endif
  #elif FLEXT_OS == FLEXT_OS_IRIX
! //  #pragma message("Compiling for Irix")
  
!     #if FLEXT_SYS == FLEXT_SYS_PD
! //      #define PD
!     #else
!         #error "Flext SYS/OS combination unknown"
!     #endif
  #elif FLEXT_OS == FLEXT_OS_MAC
! //  #pragma message("Compiling for MacOS")
  
!     #if FLEXT_SYS == FLEXT_SYS_PD
! //      #define PD
!     #endif
  #else
!     #error "Operating system could not be determined"
  #endif
  
  #if FLEXT_SYS == FLEXT_SYS_MAX
! //  #pragma message("Compiling for Max/MSP")
  #elif FLEXT_SYS == FLEXT_SYS_PD
! //  #pragma message("Compiling for PD")
  #endif
  
***************
*** 330,353 ****
  // shared builds are always threaded (although this not be so....)
  #ifdef FLEXT_SHARED
! 	#undef FLEXT_THREADS
! 	#define	FLEXT_THREADS
  /*
! 	// and also enabled for virtual daughter-classes??
! 	#undef FLEXT_VIRT
! 	#define	FLEXT_VIRT
  */
  #endif
  
  #ifdef FLEXT_THREADS
! 	#undef FLEXT_THREADS
! 	#if FLEXT_OS == FLEXT_OS_MAC && FLEXT_SYS == FLEXT_SYS_MAX
! 		// Max crashes with posix threads (because it's in the CFM model)
! 		#define FLEXT_THREADS FLEXT_THR_MP		
! 	#elif FLEXT_SYS == FLEXT_SYS_MAX && FLEXT_OS == FLEXT_OS_WIN
! 		// for wmax use native Windows threads
! 		#define FLEXT_THREADS FLEXT_THR_WIN32
! 	#else
! 		#define FLEXT_THREADS FLEXT_THR_POSIX
! 	#endif
  #endif
  
--- 330,353 ----
  // shared builds are always threaded (although this not be so....)
  #ifdef FLEXT_SHARED
!     #undef FLEXT_THREADS
!     #define FLEXT_THREADS
  /*
!     // and also enabled for virtual daughter-classes??
!     #undef FLEXT_VIRT
!     #define FLEXT_VIRT
  */
  #endif
  
  #ifdef FLEXT_THREADS
!     #undef FLEXT_THREADS
!     #if FLEXT_OS == FLEXT_OS_MAC && FLEXT_SYS == FLEXT_SYS_MAX
!         // Max crashes with posix threads (because it's in the CFM model)
!         #define FLEXT_THREADS FLEXT_THR_MP      
!     #elif FLEXT_SYS == FLEXT_SYS_MAX && FLEXT_OS == FLEXT_OS_WIN
!         // for wmax use native Windows threads
!         #define FLEXT_THREADS FLEXT_THR_WIN32
!     #else
!         #define FLEXT_THREADS FLEXT_THR_POSIX
!     #endif
  #endif
  
***************
*** 356,367 ****
          With linux (flat linker namespace) and more than one flext-based external loaded all calls to static 
          exported functions refer to the first instance loaded!
! 		Therefore different class names are used so that the correct type of flext function is called.
  */
  #if defined(FLEXT_SHARED)
! 	#define FLEXT_CLASSDEF(CL) CL##_shared
  #elif defined(FLEXT_THREADS)
! 	#define FLEXT_CLASSDEF(CL) CL##_multi
  #else
! 	#define FLEXT_CLASSDEF(CL) CL##_single
  #endif
  
--- 356,367 ----
          With linux (flat linker namespace) and more than one flext-based external loaded all calls to static 
          exported functions refer to the first instance loaded!
!         Therefore different class names are used so that the correct type of flext function is called.
  */
  #if defined(FLEXT_SHARED)
!     #define FLEXT_CLASSDEF(CL) CL##_shared
  #elif defined(FLEXT_THREADS)
!     #define FLEXT_CLASSDEF(CL) CL##_multi
  #else
!     #define FLEXT_CLASSDEF(CL) CL##_single
  #endif
  

Index: flatom_part.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flatom_part.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** flatom_part.cpp	1 Jan 2003 04:32:04 -0000	1.2
--- flatom_part.cpp	21 Jun 2004 13:58:19 -0000	1.3
***************
*** 17,26 ****
  int flext::AtomList::Get(t_atom *argv,int mxsz) const
  {
! 	int argc = Count();
! 	if(mxsz >= 0 && argc > mxsz) argc = mxsz;
  
! 	for(int i = 0; i < argc; ++i) SetAtom(argv[i],lst[i]);
  
! 	return argc;
  }
  
--- 17,26 ----
  int flext::AtomList::Get(t_atom *argv,int mxsz) const
  {
!     int argc = Count();
!     if(mxsz >= 0 && argc > mxsz) argc = mxsz;
  
!     for(int i = 0; i < argc; ++i) SetAtom(argv[i],lst[i]);
  
!     return argc;
  }
  
***************
*** 28,37 ****
  flext::AtomList flext::AtomList::GetPart(int offs,int len) const
  {
! 	if(offs+len > Count()) {
! 		len = Count()-offs;
! 		if(len < 0) len = 0;
! 	}
  
! 	return AtomList(len,Atoms()+offs);
  }
  
--- 28,37 ----
  flext::AtomList flext::AtomList::GetPart(int offs,int len) const
  {
!     if(offs+len > Count()) {
!         len = Count()-offs;
!         if(len < 0) len = 0;
!     }
  
!     return AtomList(len,Atoms()+offs);
  }
  

Index: flmspbuffer.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flmspbuffer.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** flmspbuffer.h	1 Jan 2003 04:32:05 -0000	1.3
--- flmspbuffer.h	21 Jun 2004 13:58:19 -0000	1.4
***************
*** 11,18 ****
  /*! \file flmspbuffer.h
      \brief Definition of the Max/MSP buffer structure
! 	\internal
      
! 	This file comes from David Zicarellis inofficial package index.sit
! 	The latter is not easily found so i included the original file buffer.h with flext
  */
  
--- 11,18 ----
  /*! \file flmspbuffer.h
      \brief Definition of the Max/MSP buffer structure
!     \internal
      
!     This file comes from David Zicarellis inofficial package index.sit
!     The latter is not easily found so i included the original file buffer.h with flext
  */
  
***************
*** 21,79 ****
  
  enum {
! 	MAXCHAN = 4
  };
  
  enum {
! 	bi_basefreq = 0,
! 	bi_detune,
! 	bi_lowfreq,
! 	bi_hifreq,
! 	bi_lowvel,
! 	bi_hivel,
! 	bi_gain,
! 	bi_numparams
  };
  
  typedef struct _buffer
  {
! 	t_object b_obj;		// doesn't have any signals so it doesn't need to be pxobject
! 	long b_valid;		// flag is off during read replacement or editing operation
! 	float *b_samples;	// stored with interleaved channels if multi-channel
! 	long b_frames;		// number of sample frames (each one is sizeof(float) * b_nchans bytes)
! 	long b_nchans;		// number of channels
! 	long b_size;		// size of buffer in floats
! 	float b_sr;			// sampling rate of the buffer
! 	float b_1oversr;	// 1 / sr
! 	float b_msr;		// sr * .001
! 	// Mac-specific stuff
! 	float *b_memory;	// pointer to where memory starts (initial padding for interp)
! 	t_symbol *b_name;
! 	short b_vol;
! 	short b_space;
! 	// looping info (from AIFF file)
! 	long b_susloopstart;	// in samples
! 	long b_susloopend;		// in samples
! 	long b_relloopstart;	// in samples
! 	long b_relloopend;		// in samples
! 	// instrument info (from AIFF file)
! 	short b_inst[bi_numparams];
! 	// window stuff
! 	void *b_wind;
! 	double b_pixperfr;
! 	double b_frperpix;
! 	long b_imagesize;
! 	Point b_scroll;
! 	long b_scrollscale;
! 	long b_selbegin[MAXCHAN];
! 	long b_selend[MAXCHAN];
! 	long b_zoom;
! 	long b_zim[11];
! 	void *b_mouseout;
! 	long b_format;			// 'AIFF' or 'Sd2f'
! 	t_symbol *b_filename;	// last file read (not written) for readagain message
! 	long b_oldnchans;		// used for resizing window in case of # of channels change
! 	void *b_doneout;
! 	long b_outputbytes;		// number of bytes used for output sample (1-4)
! 	long b_modtime;			// last modified time ("dirty" method)
  } t_buffer;
  
--- 21,79 ----
  
  enum {
!     MAXCHAN = 4
  };
  
  enum {
!     bi_basefreq = 0,
!     bi_detune,
!     bi_lowfreq,
!     bi_hifreq,
!     bi_lowvel,
!     bi_hivel,
!     bi_gain,
!     bi_numparams
  };
  
  typedef struct _buffer
  {
!     t_object b_obj;     // doesn't have any signals so it doesn't need to be pxobject
!     long b_valid;       // flag is off during read replacement or editing operation
!     float *b_samples;   // stored with interleaved channels if multi-channel
!     long b_frames;      // number of sample frames (each one is sizeof(float) * b_nchans bytes)
!     long b_nchans;      // number of channels
!     long b_size;        // size of buffer in floats
!     float b_sr;         // sampling rate of the buffer
!     float b_1oversr;    // 1 / sr
!     float b_msr;        // sr * .001
!     // Mac-specific stuff
!     float *b_memory;    // pointer to where memory starts (initial padding for interp)
!     t_symbol *b_name;
!     short b_vol;
!     short b_space;
!     // looping info (from AIFF file)
!     long b_susloopstart;    // in samples
!     long b_susloopend;      // in samples
!     long b_relloopstart;    // in samples
!     long b_relloopend;      // in samples
!     // instrument info (from AIFF file)
!     short b_inst[bi_numparams];
!     // window stuff
!     void *b_wind;
!     double b_pixperfr;
!     double b_frperpix;
!     long b_imagesize;
!     Point b_scroll;
!     long b_scrollscale;
!     long b_selbegin[MAXCHAN];
!     long b_selend[MAXCHAN];
!     long b_zoom;
!     long b_zim[11];
!     void *b_mouseout;
!     long b_format;          // 'AIFF' or 'Sd2f'
!     t_symbol *b_filename;   // last file read (not written) for readagain message
!     long b_oldnchans;       // used for resizing window in case of # of channels change
!     void *b_doneout;
!     long b_outputbytes;     // number of bytes used for output sample (1-4)
!     long b_modtime;         // last modified time ("dirty" method)
  } t_buffer;
  

Index: flattr_ed.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flattr_ed.cpp,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -d -r1.20 -r1.21
*** flattr_ed.cpp	6 Mar 2004 03:25:48 -0000	1.20
--- flattr_ed.cpp	21 Jun 2004 13:58:19 -0000	1.21
***************
*** 46,54 ****
  void flext_base::SetAttrEditor(t_classid c)
  {
! 	// widgetbehavior struct MUST be resident... (static is just ok here)
  
  #ifndef FLEXT_CLONEWIDGET
! 	ori_vis = c->c_wb->w_visfn; 
! 	widgetbehavior.w_getrectfn =    c->c_wb->w_getrectfn; 
      widgetbehavior.w_displacefn =   c->c_wb->w_displacefn; 
      widgetbehavior.w_selectfn =     c->c_wb->w_selectfn; 
--- 46,54 ----
[...1206 lines suppressed...]
!                 a.SetInitValue(icnt,argv+ioffs);
!             }
!             else {
!                 if(it != th->attrdata->end()) {
!                     AttrData &a = *it.data();
!                     // 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));
!         }
!     }
!     return true;
  }
  

Index: fldefs_attrvar.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/fldefs_attrvar.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** fldefs_attrvar.h	12 Dec 2003 03:32:56 -0000	1.4
--- fldefs_attrvar.h	21 Jun 2004 13:58:19 -0000	1.5
***************
*** 19,23 ****
  
  /*! \brief Declare an implicit attribute set function
! 	\internal
  */
  #define FLEXT_ATTRSET_(VAR,TP) \
--- 19,23 ----
  
  /*! \brief Declare an implicit attribute set function
!     \internal
  */
  #define FLEXT_ATTRSET_(VAR,TP) \
***************
*** 26,30 ****
  
  /*! \brief Declare an implicit attribute get function
! 	\internal
  */
  #define FLEXT_ATTRGET_(VAR,TP) \
--- 26,30 ----
  
  /*! \brief Declare an implicit attribute get function
!     \internal
  */
  #define FLEXT_ATTRGET_(VAR,TP) \
***************
*** 34,40 ****
  
  
! /*!	\defgroup FLEXT_DA_ATTRSET Definition of implicit attribute set handlers
      \ingroup FLEXT_D_ATTRIB
! 	@{ 
  */
  
--- 34,40 ----
  
  
! /*! \defgroup FLEXT_DA_ATTRSET Definition of implicit attribute set handlers
      \ingroup FLEXT_D_ATTRIB
!     @{ 
  */
  
***************
*** 75,81 ****
  //! @} FLEXT_DA_ATTRSET
  
! /*!	\defgroup FLEXT_DA_ATTRGET Definition of implicit attribute get handlers
      \ingroup FLEXT_D_ATTRIB
! 	@{ 
  */
  
--- 75,81 ----
  //! @} FLEXT_DA_ATTRSET
  
! /*! \defgroup FLEXT_DA_ATTRGET Definition of implicit attribute get handlers
      \ingroup FLEXT_D_ATTRIB
!     @{ 
  */
  
***************
*** 117,123 ****
  
  
! /*!	\defgroup FLEXT_DA_ATTRVAR Definition of implicit attribute transfer handlers (both get and set)
      \ingroup FLEXT_D_ATTRIB
! 	@{ 
  */
  
--- 117,123 ----
  
  
! /*! \defgroup FLEXT_DA_ATTRVAR Definition of implicit attribute transfer handlers (both get and set)
      \ingroup FLEXT_D_ATTRIB
!     @{ 
  */
  

Index: flsimd.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flsimd.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** flsimd.cpp	2 Apr 2004 02:21:20 -0000	1.12
--- flsimd.cpp	21 Jun 2004 13:58:19 -0000	1.13
***************
*** 10,14 ****
  
  /*! \file flsimd.cpp
! 	\brief flext SIMD support functions
  
      If FLEXT_USE_SIMD is defined at compilation, SIMD instructions are used wherever feasible.
--- 10,14 ----
  
  /*! \file flsimd.cpp
!     \brief flext SIMD support functions
  
[...2427 lines suppressed...]
      else
  #elif FLEXT_CPU == FLEXT_CPU_PPC && defined(__ALTIVEC__)
      if(GetSIMDCapabilities()&simd_altivec && IsVectorAligned(src) && IsVectorAligned(dst)) 
!         ScaleAltivec(dst,src,opmul,opadd,cnt);
!     else
  #endif // _MSC_VER
  #endif // FLEXT_USE_SIMD
      {
!         int n = cnt>>3;
!         cnt -= n<<3;
!         while(n--) {
!             dst[0] = src[0]*opmul+opadd; dst[1] = src[1]*opmul+opadd; 
!             dst[2] = src[2]*opmul+opadd; dst[3] = src[3]*opmul+opadd; 
!             dst[4] = src[4]*opmul+opadd; dst[5] = src[5]*opmul+opadd; 
!             dst[6] = src[6]*opmul+opadd; dst[7] = src[7]*opmul+opadd; 
!             src += 8,dst += 8;
!         }
!         while(cnt--) *(dst++) = *(src++)*opmul+opadd; 
      }
  #endif

Index: flbuf.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flbuf.cpp,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -d -r1.17 -r1.18
*** flbuf.cpp	21 Mar 2004 03:28:52 -0000	1.17
--- flbuf.cpp	21 Jun 2004 13:58:19 -0000	1.18
***************
*** 28,50 ****
  #if defined(PD_DEVEL_VERSION) && defined(PD_MAJOR_VERSION) && defined(PD_MINOR_VERSION)
  #if PD_MINOR_VERSION >= 36
! 	#define FLEXT_PDBUFDIRTYTIME
  #endif
  #endif
  
  flext::buffer::buffer(const t_symbol *bn,bool delayed):
! 	sym(NULL),data(NULL),
! 	chns(0),frames(0)
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	arr = NULL;
! 	interval = DIRTY_INTERVAL;
! 	isdirty = false;
! 	ticking = false;
      tick = clock_new(this,(t_method)cb_tick);
  #endif
  
! 	if(bn) Set(bn,delayed);
  
! 	ClearDirty();
  }
  
--- 28,50 ----
  #if defined(PD_DEVEL_VERSION) && defined(PD_MAJOR_VERSION) && defined(PD_MINOR_VERSION)
  #if PD_MINOR_VERSION >= 36
!     #define FLEXT_PDBUFDIRTYTIME
  #endif
  #endif
  
  flext::buffer::buffer(const t_symbol *bn,bool delayed):
!     sym(NULL),data(NULL),
!     chns(0),frames(0)
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
!     arr = NULL;
!     interval = DIRTY_INTERVAL;
!     isdirty = false;
!     ticking = false;
      tick = clock_new(this,(t_method)cb_tick);
  #endif
  
!     if(bn) Set(bn,delayed);
  
!     ClearDirty();
  }
  
***************
*** 58,146 ****
  int flext::buffer::Set(const t_symbol *s,bool nameonly)
  {
! 	int ret = 0;
! 	bool valid = data != NULL; // valid now? (before change)
  
! 	if(s && sym != s) {
! 		ret = 1;
! 		data = NULL; 
! 		frames = 0;
! 		chns = 0; 
! 	}
  
! 	if(s && *GetString(s))	sym = s;
  
! 	if(!sym) {
! 		if(valid) ret = -1;
! 	}	
! 	else if(!nameonly) {
  #if FLEXT_SYS == FLEXT_SYS_PD
! 		int frames1;
! 		t_sample *data1;
      
! 		arr = (t_garray *)pd_findbyclass(const_cast<t_symbol *>(sym), garray_class);
! 		if(!arr)
! 		{
!     		if (*GetString(sym)) FLEXT_LOG1("buffer: no such array '%s'",GetString(sym));
!     		sym = NULL;
! 			if(valid) ret = -1;
! 		}
! 		else if(!garray_getfloatarray(arr, &frames1, &data1))
! 		{
!     		error("buffer: bad template '%s'",GetString(sym)); 
!     		data = NULL;
! 			frames = 0;
! 			if(valid) ret = -1;
! 		}
! 		else {
              ret = 0;
! 			garray_usedindsp(arr);
! 			if(frames != frames1) { frames = frames1; if(!ret) ret = 1; }
! 			if(data != data1) { data = data1; if(!ret) ret = 1; }
! 			chns = 1;
! 		}
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 		if(sym->s_thing) {
! 			const _buffer *p = (const _buffer *)sym->s_thing;
! 			
! 			if(NOGOOD(p) || !p->b_valid) {
! 				post("buffer: buffer object '%s' no good",GetString(sym)); 
! 				if(valid) ret = -2;
! 			}
! 			else {
  #ifdef FLEXT_DEBUG
! //				post("flext: buffer object '%s' - valid:%i samples:%i channels:%i frames:%i",GetString(sym),p->b_valid,p->b_frames,p->b_nchans,p->b_frames);
  #endif
! 				if(data != p->b_samples) { data = p->b_samples; if(!ret) ret = 1; }
! 				if(chns != p->b_nchans) { chns = p->b_nchans; if(!ret) ret = 1; }
! 				if(frames != p->b_frames) { frames = p->b_frames; if(!ret) ret = 1; }
! 			}
! 		}
! 		else {
!     		FLEXT_LOG1("buffer: symbol '%s' not defined", GetString(sym)); 
!     		/*if(valid)*/ ret = -1;
! 		}
  #else
  #error not implemented
  #endif
! 	}
  
! 	return ret;
  }
  
  bool flext::buffer::Valid() const
  {
! 	if(sym) {
  #if FLEXT_SYS == FLEXT_SYS_PD
! 		int frames1;
! 		t_sample *data1;
! 		return arr && garray_getfloatarray(arr, &frames1, &data1) != 0;
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 		const _buffer *p = (const _buffer *)sym->s_thing;
! 		return p && p->b_valid;
  #else
  #error
  #endif 
! 	}
! 	else return false;
  }
  
--- 58,146 ----
  int flext::buffer::Set(const t_symbol *s,bool nameonly)
  {
!     int ret = 0;
!     bool valid = data != NULL; // valid now? (before change)
  
!     if(s && sym != s) {
!         ret = 1;
!         data = NULL; 
!         frames = 0;
!         chns = 0; 
!     }
  
!     if(s && *GetString(s))  sym = s;
  
!     if(!sym) {
!         if(valid) ret = -1;
!     }   
!     else if(!nameonly) {
  #if FLEXT_SYS == FLEXT_SYS_PD
!         int frames1;
!         t_sample *data1;
      
!         arr = (t_garray *)pd_findbyclass(const_cast<t_symbol *>(sym), garray_class);
!         if(!arr)
!         {
!             if (*GetString(sym)) FLEXT_LOG1("buffer: no such array '%s'",GetString(sym));
!             sym = NULL;
!             if(valid) ret = -1;
!         }
!         else if(!garray_getfloatarray(arr, &frames1, &data1))
!         {
!             error("buffer: bad template '%s'",GetString(sym)); 
!             data = NULL;
!             frames = 0;
!             if(valid) ret = -1;
!         }
!         else {
              ret = 0;
!             garray_usedindsp(arr);
!             if(frames != frames1) { frames = frames1; if(!ret) ret = 1; }
!             if(data != data1) { data = data1; if(!ret) ret = 1; }
!             chns = 1;
!         }
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!         if(sym->s_thing) {
!             const _buffer *p = (const _buffer *)sym->s_thing;
!             
!             if(NOGOOD(p) || !p->b_valid) {
!                 post("buffer: buffer object '%s' no good",GetString(sym)); 
!                 if(valid) ret = -2;
!             }
!             else {
  #ifdef FLEXT_DEBUG
! //              post("flext: buffer object '%s' - valid:%i samples:%i channels:%i frames:%i",GetString(sym),p->b_valid,p->b_frames,p->b_nchans,p->b_frames);
  #endif
!                 if(data != p->b_samples) { data = p->b_samples; if(!ret) ret = 1; }
!                 if(chns != p->b_nchans) { chns = p->b_nchans; if(!ret) ret = 1; }
!                 if(frames != p->b_frames) { frames = p->b_frames; if(!ret) ret = 1; }
!             }
!         }
!         else {
!             FLEXT_LOG1("buffer: symbol '%s' not defined", GetString(sym)); 
!             /*if(valid)*/ ret = -1;
!         }
  #else
  #error not implemented
  #endif
!     }
  
!     return ret;
  }
  
  bool flext::buffer::Valid() const
  {
!     if(sym) {
  #if FLEXT_SYS == FLEXT_SYS_PD
!         int frames1;
!         t_sample *data1;
!         return arr && garray_getfloatarray(arr, &frames1, &data1) != 0;
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!         const _buffer *p = (const _buffer *)sym->s_thing;
!         return p && p->b_valid;
  #else
  #error
  #endif 
!     }
!     else return false;
  }
  
***************
*** 148,183 ****
  bool flext::buffer::Update()
  {
! 	if(!Ok()) return false;
  
! 	bool ok = false;
  
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	int frames1;
! 	t_sample *data1;
! 	if(!garray_getfloatarray(arr, &frames1, &data1)) {
! 		frames = 0;
! 		data = NULL;
! 		chns = 0;
! 		ok = true;
! 	}
! 	else if(data != data1 || frames != frames1) {
! 		frames = frames1;
! 		data = data1;
! 		ok = true;
! 	}
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	if(sym->s_thing) {
! 		const _buffer *p = (const _buffer *)sym->s_thing;
! 		if(data != p->b_samples || chns != p->b_nchans || frames != p->b_frames) {
! 			data = p->b_samples;
! 			chns = p->b_nchans;
! 			frames = p->b_frames;
! 			ok = true;
! 		}
! 	}
  #else
  #error not implemented
  #endif
! 	return ok;
  }
  
--- 148,183 ----
  bool flext::buffer::Update()
  {
!     if(!Ok()) return false;
  
!     bool ok = false;
  
  #if FLEXT_SYS == FLEXT_SYS_PD
!     int frames1;
!     t_sample *data1;
!     if(!garray_getfloatarray(arr, &frames1, &data1)) {
!         frames = 0;
!         data = NULL;
!         chns = 0;
!         ok = true;
!     }
!     else if(data != data1 || frames != frames1) {
!         frames = frames1;
!         data = data1;
!         ok = true;
!     }
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     if(sym->s_thing) {
!         const _buffer *p = (const _buffer *)sym->s_thing;
!         if(data != p->b_samples || chns != p->b_nchans || frames != p->b_frames) {
!             data = p->b_samples;
!             chns = p->b_nchans;
!             frames = p->b_frames;
!             ok = true;
!         }
!     }
  #else
  #error not implemented
  #endif
!     return ok;
  }
  
***************
*** 186,222 ****
  #if FLEXT_SYS == FLEXT_SYS_PD
      // is this function guaranteed to keep memory and set rest to zero?
! 	::garray_resize(arr,(float)fr);
! 	Update();
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	t_sample *tmp = NULL;
! 	int sz = frames;  
! 	if(fr < sz) sz = fr;
  
! 	if(keep) {
! 		// copy buffer data to tmp storage
          tmp = (t_sample *)NewAligned(sz*sizeof(t_sample));
          if(tmp)
! 			CopySamples(tmp,data,sz);
! 		else
! 			error("flext::buffer - not enough memory for keeping buffer~ contents");
! 	}
! 	
! 	t_atom msg;
! 	_buffer *buf = (_buffer *)sym->s_thing;
! 	// b_msr reflects buffer sample rate... is this what we want?
! 	// Max bug: adding half a sample to prevent roundoff errors....
! 	float ms = (fr+0.5)/buf->b_msr;
! 	
! 	SetFloat(msg,ms); 
! 	::typedmess((object *)buf,gensym("size"),1,&msg);
! 	
! 	Update();
  
! 	if(tmp) {
! 		// copy data back
! 		CopySamples(data,tmp,sz);
! 		FreeAligned(tmp);
          if(zero && sz < fr) ZeroSamples(data+sz,fr-sz);
! 	}
      else
          if(zero) ZeroSamples(data,fr);
--- 186,222 ----
  #if FLEXT_SYS == FLEXT_SYS_PD
      // is this function guaranteed to keep memory and set rest to zero?
!     ::garray_resize(arr,(float)fr);
!     Update();
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     t_sample *tmp = NULL;
!     int sz = frames;  
!     if(fr < sz) sz = fr;
  
!     if(keep) {
!         // copy buffer data to tmp storage
          tmp = (t_sample *)NewAligned(sz*sizeof(t_sample));
          if(tmp)
!             CopySamples(tmp,data,sz);
!         else
!             error("flext::buffer - not enough memory for keeping buffer~ contents");
!     }
!     
!     t_atom msg;
!     _buffer *buf = (_buffer *)sym->s_thing;
!     // b_msr reflects buffer sample rate... is this what we want?
!     // Max bug: adding half a sample to prevent roundoff errors....
!     float ms = (fr+0.5)/buf->b_msr;
!     
!     SetFloat(msg,ms); 
!     ::typedmess((object *)buf,gensym("size"),1,&msg);
!     
!     Update();
  
!     if(tmp) {
!         // copy data back
!         CopySamples(data,tmp,sz);
!         FreeAligned(tmp);
          if(zero && sz < fr) ZeroSamples(data+sz,fr-sz);
!     }
      else
          if(zero) ZeroSamples(data,fr);
***************
*** 230,238 ****
  void flext::buffer::SetRefrIntv(float intv) 
  { 
! 	interval = intv; 
! 	if(interval == 0 && ticking) {
! 		clock_unset(tick);
! 		ticking = false;
! 	}
  }
  #elif FLEXT_SYS == FLEXT_SYS_MAX
--- 230,238 ----
  void flext::buffer::SetRefrIntv(float intv) 
  { 
!     interval = intv; 
!     if(interval == 0 && ticking) {
!         clock_unset(tick);
!         ticking = false;
!     }
  }
  #elif FLEXT_SYS == FLEXT_SYS_MAX
***************
*** 245,276 ****
  void flext::buffer::Dirty(bool force)
  {
! 	if(sym) {
  #if FLEXT_SYS == FLEXT_SYS_PD
! 		if((!ticking) && (interval || force)) {
! 			ticking = true;
! 			cb_tick(this); // immediately redraw
! 		}
! 		else {
! 			if(force) clock_delay(tick,0);
! 			isdirty = true;
! 		}
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 		if(sym->s_thing) {
! 			_buffer *p = (_buffer *)sym->s_thing;
! 			
! 			if(NOGOOD(p)) {
! 				post("buffer: buffer object '%s' no good",sym->s_name);
! 			}
! 			else {
! 				p->b_modtime = gettime();
! 			}
! 		}
! 		else {
!     		FLEXT_LOG1("buffer: symbol '%s' not defined",sym->s_name);
! 		}
  #else
  #error Not implemented
  #endif 
! 	}
  }
  
--- 245,276 ----
  void flext::buffer::Dirty(bool force)
  {
!     if(sym) {
  #if FLEXT_SYS == FLEXT_SYS_PD
!         if((!ticking) && (interval || force)) {
!             ticking = true;
!             cb_tick(this); // immediately redraw
!         }
!         else {
!             if(force) clock_delay(tick,0);
!             isdirty = true;
!         }
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!         if(sym->s_thing) {
!             _buffer *p = (_buffer *)sym->s_thing;
!             
!             if(NOGOOD(p)) {
!                 post("buffer: buffer object '%s' no good",sym->s_name);
!             }
!             else {
!                 p->b_modtime = gettime();
!             }
!         }
!         else {
!             FLEXT_LOG1("buffer: symbol '%s' not defined",sym->s_name);
!         }
  #else
  #error Not implemented
  #endif 
!     }
  }
  
***************
*** 278,293 ****
  void flext::buffer::cb_tick(buffer *b)
  {
! 	if(b->arr) garray_redraw(b->arr);
  #ifdef FLEXT_DEBUG
! 	else error("buffer: array is NULL");
  #endif
  
! 	if(b->isdirty && b->interval) {
! 			b->isdirty = false;
! 			b->ticking = true;
! 			clock_delay(b->tick,b->interval);
! 	}
! 	else 
! 		b->ticking = false;
  }
  #endif
--- 278,293 ----
  void flext::buffer::cb_tick(buffer *b)
  {
!     if(b->arr) garray_redraw(b->arr);
  #ifdef FLEXT_DEBUG
!     else error("buffer: array is NULL");
  #endif
  
!     if(b->isdirty && b->interval) {
!             b->isdirty = false;
!             b->ticking = true;
!             clock_delay(b->tick,b->interval);
!     }
!     else 
!         b->ticking = false;
  }
  #endif
***************
*** 296,302 ****
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	cleantime = clock_getlogicaltime();
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	cleantime = gettime();
  #else
  #error Not implemented
--- 296,302 ----
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
!     cleantime = clock_getlogicaltime();
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     cleantime = gettime();
  #else
  #error Not implemented
***************
*** 307,328 ****
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	if(!arr) return false;
! 	#ifdef FLEXT_PDBUFDIRTYTIME
! 	return isdirty || garray_updatetime(arr) > cleantime;
! 	#else
! 	// Don't know.... (no method in PD judging whether buffer has been changed from outside flext...)
! 	return true; 
! 	#endif
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	if(!sym->s_thing) return false;
  
! 	_buffer *p = (_buffer *)sym->s_thing;
  #ifdef FLEXT_DEBUG
! 	if(NOGOOD(p)) {
! 		post("buffer: buffer object '%s' no good",sym->s_name);
! 		return false;
! 	}
  #endif
! 	return p->b_modtime > cleantime;
  #else
  #error Not implemented
--- 307,328 ----
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
!     if(!arr) return false;
!     #ifdef FLEXT_PDBUFDIRTYTIME
!     return isdirty || garray_updatetime(arr) > cleantime;
!     #else
!     // Don't know.... (no method in PD judging whether buffer has been changed from outside flext...)
!     return true; 
!     #endif
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     if(!sym->s_thing) return false;
  
!     _buffer *p = (_buffer *)sym->s_thing;
  #ifdef FLEXT_DEBUG
!     if(NOGOOD(p)) {
!         post("buffer: buffer object '%s' no good",sym->s_name);
!         return false;
!     }
  #endif
!     return p->b_modtime > cleantime;
  #else
  #error Not implemented

Index: flcwmax-x-thr.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flcwmax-x-thr.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** flcwmax-x-thr.h	27 Mar 2004 03:22:14 -0000	1.5
--- flcwmax-x-thr.h	21 Jun 2004 13:58:19 -0000	1.6
***************
*** 19,28 ****
  
  /*
! 	old CodeWarrior version (<= 6) don't have sigset_t defined which
! 	is needed for pthreads
  */
  #if defined(__MWERKS__) && (__MWERKS__ == 1)  // read __MWERKS__ numbering starts with CW7
! 	typedef unsigned int sigset_t;
! 	#define _CW_NOPRECOMP // no precompiled headers
  #endif
  
--- 19,28 ----
  
  /*
!     old CodeWarrior version (<= 6) don't have sigset_t defined which
!     is needed for pthreads
  */
  #if defined(__MWERKS__) && (__MWERKS__ == 1)  // read __MWERKS__ numbering starts with CW7
!     typedef unsigned int sigset_t;
!     #define _CW_NOPRECOMP // no precompiled headers
  #endif
  

Index: flstk.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flstk.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** flstk.cpp	13 Feb 2003 04:31:41 -0000	1.4
--- flstk.cpp	21 Jun 2004 13:58:19 -0000	1.5
***************
*** 13,89 ****
  
  flext_stk::flext_stk():
! 	inobjs(0),outobjs(0),
! 	inobj(NULL),outobj(NULL),
! 	smprt(0),blsz(0)
  {}
  
  bool flext_stk::Init()
  {
! 	bool ret = flext_dsp::Init();
! 	inobjs = CntInSig();
! 	outobjs = CntOutSig();
! 	return ret;
  }
  
  void flext_stk::Exit()
  {
! 	ClearObjs();
! 	flext_dsp::Exit();
  }
  
  void flext_stk::ClearObjs()
  {
! 	FreeObjs();
  
! 	if(inobj) {
! 		for(int i = 0; i < inobjs; ++i) delete inobj[i]; 
! 		delete[] inobj; inobj = NULL;
! 	}
! 	if(outobj) {
! 		for(int i = 0; i < outobjs; ++i) delete outobj[i];
! 		delete[] outobj; outobj = NULL;
! 	}
  }
  
  void flext_stk::m_dsp(int n,t_sample *const *in,t_sample *const *out)
  {
! 	// called on every rebuild of the dsp chain
  
! 	int i;
! 	
! 	if(Blocksize() != blsz || Samplerate() != smprt) {
! 		// block size or sample rate has changed... rebuild all objects
  
! 		ClearObjs();
  
! 		smprt = Samplerate();
! 		blsz = Blocksize();
! 		Stk::setSampleRate(smprt); 
  
! 		// set up sndobjs for inlets and outlets
! 		if(inobjs) {
! 			inobj = new Input *[inobjs];
! 			for(i = 0; i < inobjs; ++i)
! 				inobj[i] = new Input(in[i],blsz);
! 		}
! 		if(outobjs) {
! 			outobj = new Output *[outobjs];
! 			for(i = 0; i < outobjs; ++i) 
! 				outobj[i] = new Output(out[i],blsz);
! 		}
  
! 		if(!NewObjs()) ClearObjs();
! 	}
! 	else {
! 		// assign changed input/output vectors
  
! 		for(i = 0; i < inobjs; ++i) inobj[i]->SetBuf(in[i]);
! 		for(i = 0; i < outobjs; ++i) outobj[i]->SetBuf(out[i]);
! 	}
  }
  
  void flext_stk::m_signal(int n,t_sample *const *in,t_sample *const *out)
  {
! 	if(inobjs || outobjs) ProcessObjs(blsz);
  }
  
--- 13,89 ----
  
  flext_stk::flext_stk():
!     inobjs(0),outobjs(0),
!     inobj(NULL),outobj(NULL),
!     smprt(0),blsz(0)
  {}
  
  bool flext_stk::Init()
  {
!     bool ret = flext_dsp::Init();
!     inobjs = CntInSig();
!     outobjs = CntOutSig();
!     return ret;
  }
  
  void flext_stk::Exit()
  {
!     ClearObjs();
!     flext_dsp::Exit();
  }
  
  void flext_stk::ClearObjs()
  {
!     FreeObjs();
  
!     if(inobj) {
!         for(int i = 0; i < inobjs; ++i) delete inobj[i]; 
!         delete[] inobj; inobj = NULL;
!     }
!     if(outobj) {
!         for(int i = 0; i < outobjs; ++i) delete outobj[i];
!         delete[] outobj; outobj = NULL;
!     }
  }
  
  void flext_stk::m_dsp(int n,t_sample *const *in,t_sample *const *out)
  {
!     // called on every rebuild of the dsp chain
  
!     int i;
!     
!     if(Blocksize() != blsz || Samplerate() != smprt) {
!         // block size or sample rate has changed... rebuild all objects
  
!         ClearObjs();
  
!         smprt = Samplerate();
!         blsz = Blocksize();
!         Stk::setSampleRate(smprt); 
  
!         // set up sndobjs for inlets and outlets
!         if(inobjs) {
!             inobj = new Input *[inobjs];
!             for(i = 0; i < inobjs; ++i)
!                 inobj[i] = new Input(in[i],blsz);
!         }
!         if(outobjs) {
!             outobj = new Output *[outobjs];
!             for(i = 0; i < outobjs; ++i) 
!                 outobj[i] = new Output(out[i],blsz);
!         }
  
!         if(!NewObjs()) ClearObjs();
!     }
!     else {
!         // assign changed input/output vectors
  
!         for(i = 0; i < inobjs; ++i) inobj[i]->SetBuf(in[i]);
!         for(i = 0; i < outobjs; ++i) outobj[i]->SetBuf(out[i]);
!     }
  }
  
  void flext_stk::m_signal(int n,t_sample *const *in,t_sample *const *out)
  {
!     if(inobjs || outobjs) ProcessObjs(blsz);
  }
  
***************
*** 92,103 ****
  
  flext_stk::Input::Input(const t_sample *b,int v): 
! 	buf(b),vecsz(v),
! 	index(0)
  {}
  
  MY_FLOAT *flext_stk::Input::tick(MY_FLOAT *vector,unsigned int vectorSize)
  {
! 	for(unsigned int i = 0; i < vectorSize; i++) vector[i] = tick();
! 	return vector;
  }
  
--- 92,103 ----
  
  flext_stk::Input::Input(const t_sample *b,int v): 
!     buf(b),vecsz(v),
!     index(0)
  {}
  
  MY_FLOAT *flext_stk::Input::tick(MY_FLOAT *vector,unsigned int vectorSize)
  {
!     for(unsigned int i = 0; i < vectorSize; i++) vector[i] = tick();
!     return vector;
  }
  
***************
*** 106,116 ****
  
  flext_stk::Output::Output(t_sample *b,int v): 
! 	buf(b),vecsz(v),
! 	index(0)
  {}
  
  void flext_stk::Output::tick(const MY_FLOAT *vector,unsigned int vectorSize)
  {
! 	for(unsigned int i = 0; i < vectorSize; i++) tick(vector[i]);
  }
  
--- 106,116 ----
  
  flext_stk::Output::Output(t_sample *b,int v): 
!     buf(b),vecsz(v),
!     index(0)
  {}
  
  void flext_stk::Output::tick(const MY_FLOAT *vector,unsigned int vectorSize)
  {
!     for(unsigned int i = 0; i < vectorSize; i++) tick(vector[i]);
  }
  

Index: flxlet.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flxlet.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** flxlet.cpp	1 Jan 2003 04:32:05 -0000	1.5
--- flxlet.cpp	21 Jun 2004 13:58:20 -0000	1.6
***************
*** 20,96 ****
  
  flext_base::xlet::xlet(type t,const char *d): 
! 	tp(t),nxt(NULL)
  { 
! 	if(d) {
! 		int ln = strlen(d);
! 		desc = new char[ln+1];
! 		memcpy(desc,d,ln);
! 		desc[ln] = 0;
! 	}
! 	else desc = NULL;
  }
  
  flext_base::xlet::~xlet() 
  { 
! 	if(desc) delete[] desc;
! 	if(nxt) delete nxt; 
  }
  
  void flext_base::AddXlet(xlet::type tp,int mult,const char *desc,xlet *&root)
  {
! 	if(!root && mult) { root = new xlet(tp,desc); --mult; }
! 	if(mult) {
! 		xlet *xi = root; 
! 		while(xi->nxt) xi = xi->nxt;
! 		while(mult--) xi = xi->nxt = new xlet(tp,desc);
! 	}
  }
  
  void flext_base::DescXlet(int ix,const char *d,xlet *&root)
  {
! 	xlet *xi = root; 
! 	for(int i = 0; xi && i < ix; xi = xi->nxt,++i) {}
  
! 	if(xi) {
! 		if(xi->desc) delete[] xi->desc;
! 		int ln = strlen(d);
! 		xi->desc = new char[ln+1];
! 		memcpy(xi->desc,d,ln);
! 		xi->desc[ln] = 0;
! 	}
  }
  
  unsigned long flext_base::XletCode(xlet::type tp,...)
  {
! 	unsigned long code = 0;
  
! 	va_list marker;
! 	va_start(marker,tp);
! 	int cnt = 0;
! 	xlet::type arg = tp;
! 	for(; arg; ++cnt) {
  #ifdef FLEXT_DEBUG
! 		if(cnt > 9) {
! 			error("%s - Too many in/outlets defined - truncated to 9",thisName());
! 			break;			
! 		}
! #endif			
  
! 		code = code*10+(int)arg;
! 		arg = (xlet::type)va_arg(marker,int);
! 	}
! 	va_end(marker);
  
! 	return code;
  }
  
  void flext_base::AddInlets(unsigned long code) 
  { 
! 	for(; code; code /= 10) AddInlet((xlet::type)(code%10));
  }
  
  void flext_base::AddOutlets(unsigned long code) 
  { 
! 	for(; code; code /= 10) AddOutlet((xlet::type)(code%10));
  }
  
--- 20,96 ----
  
  flext_base::xlet::xlet(type t,const char *d): 
!     tp(t),nxt(NULL)
  { 
!     if(d) {
!         int ln = strlen(d);
!         desc = new char[ln+1];
!         memcpy(desc,d,ln);
!         desc[ln] = 0;
!     }
!     else desc = NULL;
  }
  
  flext_base::xlet::~xlet() 
  { 
!     if(desc) delete[] desc;
!     if(nxt) delete nxt; 
  }
  
  void flext_base::AddXlet(xlet::type tp,int mult,const char *desc,xlet *&root)
  {
!     if(!root && mult) { root = new xlet(tp,desc); --mult; }
!     if(mult) {
!         xlet *xi = root; 
!         while(xi->nxt) xi = xi->nxt;
!         while(mult--) xi = xi->nxt = new xlet(tp,desc);
!     }
  }
  
  void flext_base::DescXlet(int ix,const char *d,xlet *&root)
  {
!     xlet *xi = root; 
!     for(int i = 0; xi && i < ix; xi = xi->nxt,++i) {}
  
!     if(xi) {
!         if(xi->desc) delete[] xi->desc;
!         int ln = strlen(d);
!         xi->desc = new char[ln+1];
!         memcpy(xi->desc,d,ln);
!         xi->desc[ln] = 0;
!     }
  }
  
  unsigned long flext_base::XletCode(xlet::type tp,...)
  {
!     unsigned long code = 0;
  
!     va_list marker;
!     va_start(marker,tp);
!     int cnt = 0;
!     xlet::type arg = tp;
!     for(; arg; ++cnt) {
  #ifdef FLEXT_DEBUG
!         if(cnt > 9) {
!             error("%s - Too many in/outlets defined - truncated to 9",thisName());
!             break;          
!         }
! #endif          
  
!         code = code*10+(int)arg;
!         arg = (xlet::type)va_arg(marker,int);
!     }
!     va_end(marker);
  
!     return code;
  }
  
  void flext_base::AddInlets(unsigned long code) 
  { 
!     for(; code; code /= 10) AddInlet((xlet::type)(code%10));
  }
  
  void flext_base::AddOutlets(unsigned long code) 
  { 
!     for(; code; code /= 10) AddOutlet((xlet::type)(code%10));
  }
  

Index: flext.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flext.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -d -r1.20 -r1.21
*** flext.h	23 Apr 2004 22:14:14 -0000	1.20
--- flext.h	21 Jun 2004 13:58:19 -0000	1.21
***************
*** 24,31 ****
  
  //! \brief flext version number
! #define FLEXT_VERSION 406
  
  //! \brief flext version string
! #define FLEXT_VERSTR "0.4.6"
  
  //! @}
--- 24,31 ----
  
  //! \brief flext version number
! #define FLEXT_VERSION 407
  
  //! \brief flext version string
! #define FLEXT_VERSTR "0.4.7pre"
  
  //! @}

Index: flinternal.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flinternal.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** flinternal.h	10 Dec 2003 03:32:53 -0000	1.8
--- flinternal.h	21 Jun 2004 13:58:19 -0000	1.9
***************
*** 11,18 ****
  /*! \file flinternal.h
      \brief Definitions for internal flext usage
! 	\internal
      
      Here, a few shortcuts for common Max/MSP or PD library calls and type definitions 
! 	are declared
  */
  
--- 11,18 ----
  /*! \file flinternal.h
      \brief Definitions for internal flext usage
!     \internal
      
      Here, a few shortcuts for common Max/MSP or PD library calls and type definitions 
!     are declared
  */
  
***************
*** 27,31 ****
  #define object_new(clss) pd_new(clss)
  #define object_free(obj) pd_free(&(obj)->ob_pd)
! 				
  
  
--- 27,31 ----
  #define object_new(clss) pd_new(clss)
  #define object_free(obj) pd_free(&(obj)->ob_pd)
!                 
  
  

Index: flcwmax-thr.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flcwmax-thr.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** flcwmax-thr.h	27 Mar 2004 03:22:14 -0000	1.5
--- flcwmax-thr.h	21 Jun 2004 13:58:19 -0000	1.6
***************
*** 19,28 ****
  
  /*
! 	old CodeWarrior version (<= 6) don't have sigset_t defined which
! 	is needed for pthreads
  */
  #if defined(__MWERKS__) && (__MWERKS__ == 1)  // read __MWERKS__ numbering starts with CW7
! 	typedef unsigned int sigset_t;
! 	#define _CW_NOPRECOMP // no precompiled headers
  #endif
  
--- 19,28 ----
  
  /*
!     old CodeWarrior version (<= 6) don't have sigset_t defined which
!     is needed for pthreads
  */
  #if defined(__MWERKS__) && (__MWERKS__ == 1)  // read __MWERKS__ numbering starts with CW7
!     typedef unsigned int sigset_t;
!     #define _CW_NOPRECOMP // no precompiled headers
  #endif
  

Index: flcwpd-x.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flcwpd-x.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** flcwpd-x.h	30 Dec 2003 03:32:46 -0000	1.4
--- flcwpd-x.h	21 Jun 2004 13:58:19 -0000	1.5
***************
*** 15,19 ****
  
  #ifndef __MWERKS__
! 	#error "This header file is for CodeWarrior only."
  #endif
  
--- 15,19 ----
  
  #ifndef __MWERKS__
!     #error "This header file is for CodeWarrior only."
  #endif
  
***************
*** 25,34 ****
  
  #ifndef _CW_NOPRECOMP
! //	#include <MacHeadersMach-O.h> 
! //	#include <MSL MacHeadersMach-O.h> 
  #endif
  
  #if __option(sym) || !__option(opt_dead_code)
! 	#define FLEXT_DEBUG
  #endif
  
--- 25,34 ----
  
  #ifndef _CW_NOPRECOMP
! //  #include <MacHeadersMach-O.h> 
! //  #include <MSL MacHeadersMach-O.h> 
  #endif
  
  #if __option(sym) || !__option(opt_dead_code)
!     #define FLEXT_DEBUG
  #endif
  

Index: fltimer.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/fltimer.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** fltimer.cpp	27 Mar 2004 03:22:14 -0000	1.4
--- fltimer.cpp	21 Jun 2004 13:58:20 -0000	1.5
***************
*** 10,14 ****
  
  /*! \file fltimer.cpp
! 	\brief flext timer functions and classes   
  */
  
--- 10,14 ----
  
  /*! \file fltimer.cpp
!     \brief flext timer functions and classes   
  */
  
***************
*** 30,40 ****
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	return clock_gettimesince(0)*0.001;
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	double tm;
! 	clock_getftime(&tm);
! 	return tm*0.001;
  #else
! 	#error Not implemented
  #endif
  }
--- 30,40 ----
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
!     return clock_gettimesince(0)*0.001;
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     double tm;
!     clock_getftime(&tm);
!     return tm*0.001;
  #else
!     #error Not implemented
  #endif
  }
***************
*** 43,51 ****
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	return 0;
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	return 0.001;
  #else
! 	#error Not implemented
  #endif
  }
--- 43,51 ----
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
!     return 0;
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     return 0.001;
  #else
!     #error Not implemented
  #endif
  }
***************
*** 56,66 ****
  static double getstarttime()
  {
! 	starttime = 0;
! 	return flext::GetOSTime();
  }
  
  double flext::GetOSTime()
  {
! 	double tm;
  
  #if FLEXT_OS == FLEXT_OS_WIN
--- 56,66 ----
  static double getstarttime()
  {
!     starttime = 0;
!     return flext::GetOSTime();
  }
  
  double flext::GetOSTime()
  {
!     double tm;
  
  #if FLEXT_OS == FLEXT_OS_WIN
***************
*** 76,90 ****
      }
  #elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX || FLEXT_OSAPI == FLEXT_OSAPI_MAC_MACH // POSIX
! 	timeval tmv;
! 	gettimeofday(&tmv,NULL);
! 	tm = tmv.tv_sec+tmv.tv_usec*1.e-6;
  #elif FLEXT_OS == FLEXT_OS_MAC // that's just for OS9 & Carbon!
! 	UnsignedWide tick;
! 	Microseconds(&tick);
! 	tm = (tick.hi*((double)(1L<<((sizeof tick.lo)*4))*(double)(1L<<((sizeof tick.lo)*4)))+tick.lo)*1.e-6; 
  #else
! 	#error Not implemented
  #endif
! 	return tm-starttime;
  }
  
--- 76,90 ----
      }
  #elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX || FLEXT_OSAPI == FLEXT_OSAPI_MAC_MACH // POSIX
!     timeval tmv;
!     gettimeofday(&tmv,NULL);
!     tm = tmv.tv_sec+tmv.tv_usec*1.e-6;
  #elif FLEXT_OS == FLEXT_OS_MAC // that's just for OS9 & Carbon!
!     UnsignedWide tick;
!     Microseconds(&tick);
!     tm = (tick.hi*((double)(1L<<((sizeof tick.lo)*4))*(double)(1L<<((sizeof tick.lo)*4)))+tick.lo)*1.e-6; 
  #else
!     #error Not implemented
  #endif
!     return tm-starttime;
  }
  
***************
*** 92,110 ****
  {
  #if FLEXT_OS == FLEXT_OS_WIN
! 	::Sleep((long)(s*1000.));
  #elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX || FLEXT_OSAPI == FLEXT_OSAPI_MAC_MACH // POSIX
! 	usleep((long)(s*1000000.));
  #elif FLEXT_OS == FLEXT_OS_MAC // that's just for OS9 & Carbon!
! 	UnsignedWide tick;
! 	Microseconds(&tick);
! 	double target = tick.hi*((double)(1L<<((sizeof tick.lo)*4))*(double)(1L<<((sizeof tick.lo)*4)))+tick.lo+s*1.e6; 
! 	for(;;) {
! 		// this is just a loop running until the time has passed - stone age (but we yield at least)
! 		Microseconds(&tick);
! 		if(target <= tick.hi*((double)(1L<<((sizeof tick.lo)*4))*(double)(1L<<((sizeof tick.lo)*4)))+tick.lo) break;
! 		YieldToAnyThread(); // yielding surely reduces the timing precision (but we're civilized)
! 	}
  #else
! 	#error Not implemented
  #endif
  }
--- 92,110 ----
  {
  #if FLEXT_OS == FLEXT_OS_WIN
!     ::Sleep((long)(s*1000.));
  #elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX || FLEXT_OSAPI == FLEXT_OSAPI_MAC_MACH // POSIX
!     usleep((long)(s*1000000.));
  #elif FLEXT_OS == FLEXT_OS_MAC // that's just for OS9 & Carbon!
!     UnsignedWide tick;
!     Microseconds(&tick);
!     double target = tick.hi*((double)(1L<<((sizeof tick.lo)*4))*(double)(1L<<((sizeof tick.lo)*4)))+tick.lo+s*1.e6; 
!     for(;;) {
!         // this is just a loop running until the time has passed - stone age (but we yield at least)
!         Microseconds(&tick);
!         if(target <= tick.hi*((double)(1L<<((sizeof tick.lo)*4))*(double)(1L<<((sizeof tick.lo)*4)))+tick.lo) break;
!         YieldToAnyThread(); // yielding surely reduces the timing precision (but we're civilized)
!     }
  #else
!     #error Not implemented
  #endif
  }
***************
*** 114,128 ****
  */
  flext::Timer::Timer(bool qu):
! 	queued(qu),
! 	clss(NULL),userdata(NULL),
! 	period(0)
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	clk = (t_clock *)clock_new(this,(t_method)callback);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	clk = (t_clock *)clock_new(this,(t_method)callback);
! 	if(queued) qelem = (t_qelem *)qelem_new(this,(method)queuefun);
  #else
! 	#error Not implemented
  #endif
  }
--- 114,128 ----
  */
  flext::Timer::Timer(bool qu):
!     queued(qu),
!     clss(NULL),userdata(NULL),
!     period(0)
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
!     clk = (t_clock *)clock_new(this,(t_method)callback);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     clk = (t_clock *)clock_new(this,(t_method)callback);
!     if(queued) qelem = (t_qelem *)qelem_new(this,(method)queuefun);
  #else
!     #error Not implemented
  #endif
  }
***************
*** 131,140 ****
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	clock_free(clk);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	clock_free(clk);
! 	if(queued) ::qelem_free(qelem);
  #else
! 	#error Not implemented
  #endif
  }
--- 131,140 ----
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
!     clock_free(clk);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     clock_free(clk);
!     if(queued) ::qelem_free(qelem);
  #else
!     #error Not implemented
  #endif
  }
***************
*** 143,245 ****
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	clock_unset(clk);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	clock_unset(clk);
! 	if(queued) ::qelem_unset(qelem);
  #else
! 	#error Not implemented
  #endif
! 	return true;
  }
  
  /*! \param tm absolute time (in seconds)
! 	\param data user data
! 	\param dopast if set events with times lying in the past will be triggered immediately, if not set they are ignored
! 	\return true on success
  */
  bool flext::Timer::At(double tm,void *data,bool dopast)
  {
! 	userdata = data;
! 	period = 0;
  #if FLEXT_SYS == FLEXT_SYS_PD 
! 	const double ms = tm*1000.;
! 	if(dopast || clock_gettimesince(ms) <= 0)
! 		clock_set(clk,ms);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	const double ms = tm*1000.;
! 	double cur;
! 	clock_getftime(&cur);
! 	if(cur <= ms)
! 		clock_fdelay(clk,ms-cur);
! 	else if(dopast) // trigger timer is past
! 		clock_fdelay(clk,0);
  #else
! 	#error Not implemented
  #endif
! 	return true;
  }
  
  /*! \param tm relative time (in seconds)
! 	\param data user data
! 	\return true on success
  */
  bool flext::Timer::Delay(double tm,void *data)
  {
! 	userdata = data;
! 	period = 0;
  #if FLEXT_SYS == FLEXT_SYS_PD 
! 	clock_delay(clk,tm*1000);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	clock_fdelay(clk,tm*1000.);
  #else
! 	#error Not implemented
  #endif
! 	return true;
  }
  
  /*! \param tm relative time between periodic events (in seconds)
! 	\param data user data
! 	\return true on success
! 	\note the first event will be delayed by tm
  */
  bool flext::Timer::Periodic(double tm,void *data) 
  {
! 	userdata = data;
! 	period = tm;
  #if FLEXT_SYS == FLEXT_SYS_PD 
! 	clock_delay(clk,tm*1000);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	clock_fdelay(clk,tm*1000.);
  #else
! 	#error Not implemented
  #endif
! 	return true;
  }
  
  /*! \brief Callback function for system clock.
! 	\todo Make periodic events scheduled as such.
  */
  void flext::Timer::callback(Timer *tmr)
  {
! 	if(tmr->period) {
! 		// clearly it would be more precise if the periodic event is scheduled as such
! 		// and not retriggered every time
  #if FLEXT_SYS == FLEXT_SYS_PD 
! 		clock_delay(tmr->clk,tmr->period*1000);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 		clock_fdelay(tmr->clk,tmr->period*1000.);
  #else
! 	#error Not implemented
  #endif
! 	}
  
! 	if(tmr->cback) {
  #if FLEXT_SYS == FLEXT_SYS_MAX
! 		if(tmr->queued) 
! 			qelem_set(tmr->qelem);
! 		else
  #endif
! 			tmr->Work();
! 	}
  }
  
--- 143,245 ----
  {
  #if FLEXT_SYS == FLEXT_SYS_PD
!     clock_unset(clk);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     clock_unset(clk);
!     if(queued) ::qelem_unset(qelem);
  #else
!     #error Not implemented
  #endif
!     return true;
  }
  
  /*! \param tm absolute time (in seconds)
!     \param data user data
!     \param dopast if set events with times lying in the past will be triggered immediately, if not set they are ignored
!     \return true on success
  */
  bool flext::Timer::At(double tm,void *data,bool dopast)
  {
!     userdata = data;
!     period = 0;
  #if FLEXT_SYS == FLEXT_SYS_PD 
!     const double ms = tm*1000.;
!     if(dopast || clock_gettimesince(ms) <= 0)
!         clock_set(clk,ms);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     const double ms = tm*1000.;
!     double cur;
!     clock_getftime(&cur);
!     if(cur <= ms)
!         clock_fdelay(clk,ms-cur);
!     else if(dopast) // trigger timer is past
!         clock_fdelay(clk,0);
  #else
!     #error Not implemented
  #endif
!     return true;
  }
  
  /*! \param tm relative time (in seconds)
!     \param data user data
!     \return true on success
  */
  bool flext::Timer::Delay(double tm,void *data)
  {
!     userdata = data;
!     period = 0;
  #if FLEXT_SYS == FLEXT_SYS_PD 
!     clock_delay(clk,tm*1000);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     clock_fdelay(clk,tm*1000.);
  #else
!     #error Not implemented
  #endif
!     return true;
  }
  
  /*! \param tm relative time between periodic events (in seconds)
!     \param data user data
!     \return true on success
!     \note the first event will be delayed by tm
  */
  bool flext::Timer::Periodic(double tm,void *data) 
  {
!     userdata = data;
!     period = tm;
  #if FLEXT_SYS == FLEXT_SYS_PD 
!     clock_delay(clk,tm*1000);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     clock_fdelay(clk,tm*1000.);
  #else
!     #error Not implemented
  #endif
!     return true;
  }
  
  /*! \brief Callback function for system clock.
!     \todo Make periodic events scheduled as such.
  */
  void flext::Timer::callback(Timer *tmr)
  {
!     if(tmr->period) {
!         // clearly it would be more precise if the periodic event is scheduled as such
!         // and not retriggered every time
  #if FLEXT_SYS == FLEXT_SYS_PD 
!         clock_delay(tmr->clk,tmr->period*1000);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!         clock_fdelay(tmr->clk,tmr->period*1000.);
  #else
!     #error Not implemented
  #endif
!     }
  
!     if(tmr->cback) {
  #if FLEXT_SYS == FLEXT_SYS_MAX
!         if(tmr->queued) 
!             qelem_set(tmr->qelem);
!         else
  #endif
!             tmr->Work();
!     }
  }
  
***************
*** 251,262 ****
  
  /*! \brief Virtual worker function - by default it calls the user callback function.
! 	\remark The respective callback parameter format is chosen depending on whether clss is defined or not.
  */
  void flext::Timer::Work()
  {
! 	if(clss) 
! 		((bool (*)(flext_base *,void *))cback)(clss,userdata);
! 	else
! 		cback(userdata);
  }
  
--- 251,262 ----
  
  /*! \brief Virtual worker function - by default it calls the user callback function.
!     \remark The respective callback parameter format is chosen depending on whether clss is defined or not.
  */
  void flext::Timer::Work()
  {
!     if(clss) 
!         ((bool (*)(flext_base *,void *))cback)(clss,userdata);
!     else
!         cback(userdata);
  }
  

Index: flcwpd-x-thr.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flcwpd-x-thr.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** flcwpd-x-thr.h	30 Dec 2003 03:32:46 -0000	1.3
--- flcwpd-x-thr.h	21 Jun 2004 13:58:19 -0000	1.4
***************
*** 18,27 ****
  #if 0
  /*
! 	old CodeWarrior version (<= 6) don't have sigset_t defined which
! 	is needed for pthreads
  */
  #if defined(__MWERKS__) && (__MWERKS__ <= 0x6000)
! 	typedef unsigned int sigset_t;
! 	#define _CW_NOPRECOMP // no precompiled headers
  #endif
  #endif
--- 18,27 ----
  #if 0
  /*
!     old CodeWarrior version (<= 6) don't have sigset_t defined which
!     is needed for pthreads
  */
  #if defined(__MWERKS__) && (__MWERKS__ <= 0x6000)
!     typedef unsigned int sigset_t;
!     #define _CW_NOPRECOMP // no precompiled headers
  #endif
  #endif

Index: flsndobj.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flsndobj.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** flsndobj.h	2 Jan 2003 04:32:06 -0000	1.6
--- flsndobj.h	21 Jun 2004 13:58:19 -0000	1.7
***************
*** 22,88 ****
  
  class FLEXT_SHARE flext_sndobj:
! 	public flext_dsp
  {
! 	FLEXT_HEADER(flext_sndobj,flext_dsp)
   
  public:
! 	flext_sndobj();
  
! 	// these have to be overridden in child classes
! 	virtual bool NewObjs() { return true; }
! 	virtual void FreeObjs() {}
! 	virtual void ProcessObjs() {}
  
! 	// inputs and outputs
! 	SndObj &InObj(int i) { return *tmpobj[i]; }
! 	SndIO &OutObj(int i) { return *outobj[i]; }
  
  protected:
! 	virtual bool Init();
! 	virtual void Exit();
  
! 	virtual void m_dsp(int n,t_sample *const *in,t_sample *const *out); 
! 	virtual void m_signal(int n,t_sample *const *in,t_sample *const *out); 
  
  private:
! 	//! SndObj for reading from inlet buffer
! 	class Inlet:
! 		public SndIO
! 	{
! 	public:
! 		Inlet(const t_sample *b,int vecsz,float sr);
! 		virtual short Read();
! 		virtual short Write();
  
! 		void SetBuf(const t_sample *b) { buf = b; }
  
! 	private:
! 		const t_sample *buf;
! 	};
  
! 	//! SndObj for writing to outlet buffer
! 	class Outlet:
! 		public SndIO
! 	{
! 	public:
! 		Outlet(t_sample *b,int vecsz,float sr);
! 		virtual short Read();
! 		virtual short Write();
  
! 		void SetBuf(t_sample *b) { buf = b; }
  
! 	private:
! 		t_sample *buf;
! 	};
  
! 	void ClearObjs();
  
! 	int inobjs,outobjs;
! 	SndObj **tmpobj;
! 	Inlet **inobj;
! 	Outlet **outobj;
  
! 	float smprt;
! 	int blsz;
  };
  
--- 22,88 ----
  
  class FLEXT_SHARE flext_sndobj:
!     public flext_dsp
  {
!     FLEXT_HEADER(flext_sndobj,flext_dsp)
   
  public:
!     flext_sndobj();
  
!     // these have to be overridden in child classes
!     virtual bool NewObjs() { return true; }
!     virtual void FreeObjs() {}
!     virtual void ProcessObjs() {}
  
!     // inputs and outputs
!     SndObj &InObj(int i) { return *tmpobj[i]; }
!     SndIO &OutObj(int i) { return *outobj[i]; }
  
  protected:
!     virtual bool Init();
!     virtual void Exit();
  
!     virtual void m_dsp(int n,t_sample *const *in,t_sample *const *out); 
!     virtual void m_signal(int n,t_sample *const *in,t_sample *const *out); 
  
  private:
!     //! SndObj for reading from inlet buffer
!     class Inlet:
!         public SndIO
!     {
!     public:
!         Inlet(const t_sample *b,int vecsz,float sr);
!         virtual short Read();
!         virtual short Write();
  
!         void SetBuf(const t_sample *b) { buf = b; }
  
!     private:
!         const t_sample *buf;
!     };
  
!     //! SndObj for writing to outlet buffer
!     class Outlet:
!         public SndIO
!     {
!     public:
!         Outlet(t_sample *b,int vecsz,float sr);
!         virtual short Read();
!         virtual short Write();
  
!         void SetBuf(t_sample *b) { buf = b; }
  
!     private:
!         t_sample *buf;
!     };
  
!     void ClearObjs();
  
!     int inobjs,outobjs;
!     SndObj **tmpobj;
!     Inlet **inobj;
!     Outlet **outobj;
  
!     float smprt;
!     int blsz;
  };
  

Index: flsndobj.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flsndobj.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** flsndobj.cpp	2 Jan 2003 04:32:06 -0000	1.6
--- flsndobj.cpp	21 Jun 2004 13:58:19 -0000	1.7
***************
*** 14,95 ****
  
  flext_sndobj::flext_sndobj():
! 	inobjs(0),outobjs(0),
! 	inobj(NULL),tmpobj(NULL),outobj(NULL),
! 	smprt(0),blsz(0)
  {}
  
  bool flext_sndobj::Init()
  {
! 	bool ret = flext_dsp::Init();
! 	inobjs = CntInSig();
! 	outobjs = CntOutSig();
! 	return ret;
  }
  
  void flext_sndobj::Exit()
  {
! 	ClearObjs();
! 	flext_dsp::Exit();
  }
  
  void flext_sndobj::ClearObjs()
  {
! 	FreeObjs();
  
! 	if(inobj) {
! 		for(int i = 0; i < inobjs; ++i) delete inobj[i]; 
! 		delete[] inobj; inobj = NULL; 
! 	}
! 	if(tmpobj) {
! 		for(int i = 0; i < inobjs; ++i) delete tmpobj[i];
! 		delete[] tmpobj; tmpobj = NULL;
! 	}
! 	if(outobj) {
! 		for(int i = 0; i < outobjs; ++i) delete outobj[i];
! 		delete[] outobj; outobj = NULL; 
! 	}
  }
  
  void flext_sndobj::m_dsp(int n,t_sample *const *in,t_sample *const *out)
  {
! 	// called on every rebuild of the dsp chain
! 	
! 	int i;
! 	if(Blocksize() != blsz || Samplerate() != smprt) {
! 		// block size or sample rate has changed... rebuild all objects
  
! 		ClearObjs();
  
! 		blsz = Blocksize();
! 		smprt = Samplerate();
  
! 		// set up sndobjs for inlets and outlets
! 		if(inobjs) {
! 			inobj = new Inlet *[inobjs];
! 			tmpobj = new SndObj *[inobjs];
! 			for(i = 0; i < inobjs; ++i) {
! 				inobj[i] = new Inlet(in[i],blsz,smprt);
! 				tmpobj[i] = new SndObj(NULL,blsz,smprt);
! 			}
! 		}
! 		if(outobjs) {
! 			outobj = new Outlet *[outobjs];
! 			for(i = 0; i < outobjs; ++i) outobj[i] = new Outlet(out[i],blsz,smprt);
! 		}
  
! 		if(!NewObjs()) ClearObjs();
! 	}
! 	else {
! 		// assign changed input/output vectors
  
! 		for(i = 0; i < inobjs; ++i) inobj[i]->SetBuf(in[i]);
! 		for(i = 0; i < outobjs; ++i) outobj[i]->SetBuf(out[i]);
! 	}
  }
  
  void flext_sndobj::m_signal(int n,t_sample *const *in,t_sample *const *out)
  {
! 	for(int i = 0; i < inobjs; ++i) *tmpobj[i] << *inobj[i];
! 	ProcessObjs();
  }
  
--- 14,95 ----
  
  flext_sndobj::flext_sndobj():
!     inobjs(0),outobjs(0),
!     inobj(NULL),tmpobj(NULL),outobj(NULL),
!     smprt(0),blsz(0)
  {}
  
  bool flext_sndobj::Init()
  {
!     bool ret = flext_dsp::Init();
!     inobjs = CntInSig();
!     outobjs = CntOutSig();
!     return ret;
  }
  
  void flext_sndobj::Exit()
  {
!     ClearObjs();
!     flext_dsp::Exit();
  }
  
  void flext_sndobj::ClearObjs()
  {
!     FreeObjs();
  
!     if(inobj) {
!         for(int i = 0; i < inobjs; ++i) delete inobj[i]; 
!         delete[] inobj; inobj = NULL; 
!     }
!     if(tmpobj) {
!         for(int i = 0; i < inobjs; ++i) delete tmpobj[i];
!         delete[] tmpobj; tmpobj = NULL;
!     }
!     if(outobj) {
!         for(int i = 0; i < outobjs; ++i) delete outobj[i];
!         delete[] outobj; outobj = NULL; 
!     }
  }
  
  void flext_sndobj::m_dsp(int n,t_sample *const *in,t_sample *const *out)
  {
!     // called on every rebuild of the dsp chain
!     
!     int i;
!     if(Blocksize() != blsz || Samplerate() != smprt) {
!         // block size or sample rate has changed... rebuild all objects
  
!         ClearObjs();
  
!         blsz = Blocksize();
!         smprt = Samplerate();
  
!         // set up sndobjs for inlets and outlets
!         if(inobjs) {
!             inobj = new Inlet *[inobjs];
!             tmpobj = new SndObj *[inobjs];
!             for(i = 0; i < inobjs; ++i) {
!                 inobj[i] = new Inlet(in[i],blsz,smprt);
!                 tmpobj[i] = new SndObj(NULL,blsz,smprt);
!             }
!         }
!         if(outobjs) {
!             outobj = new Outlet *[outobjs];
!             for(i = 0; i < outobjs; ++i) outobj[i] = new Outlet(out[i],blsz,smprt);
!         }
  
!         if(!NewObjs()) ClearObjs();
!     }
!     else {
!         // assign changed input/output vectors
  
!         for(i = 0; i < inobjs; ++i) inobj[i]->SetBuf(in[i]);
!         for(i = 0; i < outobjs; ++i) outobj[i]->SetBuf(out[i]);
!     }
  }
  
  void flext_sndobj::m_signal(int n,t_sample *const *in,t_sample *const *out)
  {
!     for(int i = 0; i < inobjs; ++i) *tmpobj[i] << *inobj[i];
!     ProcessObjs();
  }
  
***************
*** 101,110 ****
  short flext_sndobj::Inlet::Read() 
  { 
! 	if(!m_error) { 
! 		for(m_vecpos = 0; m_vecpos < m_samples; m_vecpos++)
! 			m_output[m_vecpos] = buf[m_vecpos];
! 		return 1; 
! 	} 
! 	else return 0; 
  }
  
--- 101,110 ----
  short flext_sndobj::Inlet::Read() 
  { 
!     if(!m_error) { 
!         for(m_vecpos = 0; m_vecpos < m_samples; m_vecpos++)
!             m_output[m_vecpos] = buf[m_vecpos];
!         return 1; 
!     } 
!     else return 0; 
  }
  
***************
*** 120,130 ****
  short flext_sndobj::Outlet::Write() 
  { 
! 	if(!m_error) { 
! 		if(m_IOobjs[0])
! 			for(m_vecpos = 0; m_vecpos < m_samples; m_vecpos++)
! 				buf[m_vecpos] = m_IOobjs[0]->Output(m_vecpos);
! 		return 1; 
! 	} 
! 	else return 0; 
  }
  
--- 120,130 ----
  short flext_sndobj::Outlet::Write() 
  { 
!     if(!m_error) { 
!         if(m_IOobjs[0])
!             for(m_vecpos = 0; m_vecpos < m_samples; m_vecpos++)
!                 buf[m_vecpos] = m_IOobjs[0]->Output(m_vecpos);
!         return 1; 
!     } 
!     else return 0; 
  }
  

Index: flout.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flout.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -C2 -d -r1.15 -r1.16
*** flout.cpp	10 Dec 2003 03:32:53 -0000	1.15
--- flout.cpp	21 Jun 2004 13:58:19 -0000	1.16
***************
*** 59,405 ****
  bool flext_base::InitInlets()
  {
! 	bool ok = true;
  
! 	// ----------------------------------
! 	// create inlets
! 	// ----------------------------------
  
! 	incnt = insigs = 0; 
  
      // digest inlist
      {
! 		xlet *xi;
! 		incnt = 0;
! 		for(xi = inlist; xi; xi = xi->nxt) ++incnt;
! 		xlet::type *list = new xlet::type[incnt];
! 		int i;
! 		for(xi = inlist,i = 0; xi; xi = xi->nxt,++i) list[i] = xi->tp;
! 		
! #if FLEXT_SYS == FLEXT_SYS_MAX		
! 		// copy inlet descriptions
! 		indesc = new char *[incnt];
! 		for(xi = inlist,i = 0; xi; xi = xi->nxt,++i) {
! 			int l = xi->desc?strlen(xi->desc):0;
! 			if(l) {
! 				indesc[i] = new char[l+1];
! 				memcpy(indesc[i],xi->desc,l);
! 				indesc[i][l] = 0;
! 			}
! 			else
! 				indesc[i] = NULL;
! 		}
  #endif
  
! 		delete inlist; inlist = NULL;
! 		
  #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX
! 		inlets = new px_object *[incnt];
! 		for(i = 0; i < incnt; ++i) inlets[i] = NULL;
  #endif
! 		
! 		// type info is now in list array
  #if FLEXT_SYS == FLEXT_SYS_PD
! 		{
! 			int cnt = 0;
  
! 			if(incnt >= 1) {
! 				switch(list[0]) {
! 					case xlet::tp_sig:
! 						++insigs;
! 						break;
! 					default:
! 						// leftmost inlet is already there...
! 						break;
! 				} 
! 				++cnt;
! 			}		
  
! 			for(int ix = 1; ix < incnt; ++ix,++cnt) {
! 				switch(list[ix]) {
! 					case xlet::tp_float:
! 					case xlet::tp_int: {
! 						char sym[] = "ft??";
! 						if(ix >= 10) { 
! 							if(compatibility) {
! 								// Max allows max. 9 inlets
! 								post("%s: Only 9 float/int inlets allowed in compatibility mode",thisName());
! 								ok = false;
! 							}
! 							else {
! 								if(ix > 99)
! 									post("%s: Inlet index > 99 not allowed for float/int inlets",thisName());
! 								sym[2] = '0'+ix/10,sym[3] = '0'+ix%10;
! 							}
! 						}
! 						else 
! 							sym[2] = '0'+ix,sym[3] = 0;  
! 					    if(ok) inlet_new(&x_obj->obj, &x_obj->obj.ob_pd, (t_symbol *)sym_float, gensym(sym)); 
! 						break;
! 					}
! 					case xlet::tp_sym: 
! 					    (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix);  // proxy for 2nd inlet messages 
! 						inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, (t_symbol *)sym_symbol, (t_symbol *)sym_symbol);  
! 						break;
! 					case xlet::tp_list:
! 					    (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix);  // proxy for 2nd inlet messages 
! 						inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, (t_symbol *)sym_list, (t_symbol *)sym_list);  
! 						break;
! 					case xlet::tp_any:
! 					    (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix);  // proxy for 2nd inlet messages 
! 						inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, 0, 0);  
! 						break;
! 					case xlet::tp_sig:
! 						if(compatibility && list[ix-1] != xlet::tp_sig) {
! 							post("%s: All signal inlets must be left-aligned in compatibility mode",thisName());
! 							ok = false;
! 						}
! 						else {
! 							// pd doesn't seem to be able to handle signals and messages into the same inlet...
! 							
! 							inlet_new(&x_obj->obj, &x_obj->obj.ob_pd, (t_symbol *)sym_signal, (t_symbol *)sym_signal);  
! 							++insigs;
! 						}
! 						break;
! 					default:
! 						error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]);
! 						ok = false;
! 				} 
! 			}
  
! 			incnt = cnt;
! 		}
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 		{
! 			int ix,cnt;
! 			// count leftmost signal inlets
! 			while(insigs < incnt && list[insigs] == xlet::tp_sig) ++insigs;
! 			
! 			for(cnt = 0,ix = incnt-1; ix >= insigs; --ix,++cnt) {
! 				if(ix == 0) {
! 					if(list[ix] != xlet::tp_any) {
! 						error("%s: Leftmost inlet must be of type signal or anything",thisName());
! 						ok = false;
! 					}
! 				}
! 				else {
! 					switch(list[ix]) {
! 						case xlet::tp_sig:
! 							error("%s: All signal inlets must be left-aligned",thisName());
! 							ok = false;
! 							break;
! 						case xlet::tp_float:
! 							if(ix >= 10) { 
! 								post("%s: Only 9 float inlets possible",thisName());
! 								ok = false;
! 							}
! 							else
! 								floatin(x_obj,ix);  
! 							break;
! 						case xlet::tp_int:
! 							if(ix >= 10) { 
! 								post("%s: Only 9 int inlets possible",thisName());
! 								ok = false;
! 							}
! 							else
! 								intin(x_obj,ix);  
! 							break;
! 						case xlet::tp_any: // non-leftmost
! 						case xlet::tp_sym:
! 						case xlet::tp_list:
! 							inlets[ix] = (px_object *)proxy_new(x_obj,ix,&((flext_hdr *)x_obj)->curinlet);  
! 							break;
! 						default:
! 							error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]);
! 							ok = false;
! 					} 
! 				}
! 			}
  
! //			incnt = cnt;
! 	
! 			if(insigs) 
! //				dsp_setup(thisHdr(),insigs); // signal inlets	
! 				dsp_setupbox(thisHdr(),insigs); // signal inlets	
! 		}
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
! 		{
! 			t_class *cl = thisClass();
! 			int cnt = 0;
! 			for(int ix = 0; ix < incnt; ++ix,++cnt) {
! 				switch(list[ix]) {
! 					case xlet::tp_float:
! 					case xlet::tp_int:
! //						fts_class_inlet_number(cl, ix, jmax_proxy);
! 						break;
! 					case xlet::tp_sym: 
! //						fts_class_inlet_symbol(cl, ix, jmax_proxy);
! 						break;
! 					case xlet::tp_sig:
! 						if(compatibility && list[ix-1] != xlet::tp_sig) {
! 							post("%s: All signal inlets must be left-aligned in compatibility mode",thisName());
! 							ok = false;
! 						}
! 						else {
! 							if(!insigs) fts_dsp_declare_inlet(cl,0);							
! 							++insigs;
! 						}
! 						// no break -> let a signal inlet also accept any messages
! 					case xlet::tp_list:
! 					case xlet::tp_any:
! //						fts_class_inlet_varargs(cl,ix, jmax_proxy);
! 						break;
! 					default:
! 						error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]);
! 						ok = false;
! 				} 
! 			}
  
! 			incnt = cnt;
  
! 			fts_object_set_inlets_number((fts_object_t *)thisHdr(), incnt);
! 		}
  #else
  #error
  #endif
  
! 		delete[] list;
! 	}
  
! 	return ok;	
  }
  
  bool flext_base::InitOutlets()
  {
! 	bool ok = true;
  
! 	// ----------------------------------
! 	// create outlets
! 	// ----------------------------------
  
! 	outcnt = outsigs = 0; 
! 	
  #if FLEXT_SYS == FLEXT_SYS_MAX
! 	// for Max/MSP the rightmost outlet has to be created first
! 	outlet *attrtmp = NULL;
! 	if(procattr) 
! 		attrtmp = (outlet *)newout_anything(thisHdr());
  #endif
  
      // digest outlist
! 	{
! 		xlet *xi;
  
! 		// count outlets
! 		outcnt = 0;
! 		for(xi = outlist; xi; xi = xi->nxt) ++outcnt;
  
! 		xlet::type *list = new xlet::type[outcnt];
! 		int i;
! 		for(xi = outlist,i = 0; xi; xi = xi->nxt,++i) list[i] = xi->tp;
  
! #if FLEXT_SYS == FLEXT_SYS_MAX		
! 		// copy outlet descriptions
! 		outdesc = new char *[outcnt];
! 		for(xi = outlist,i = 0; xi; xi = xi->nxt,++i) {
! 			int l = xi->desc?strlen(xi->desc):0;
! 			if(l) {
! 				outdesc[i] = new char[l+1];
! 				memcpy(outdesc[i],xi->desc,l);
! 				outdesc[i][l] = 0;
! 			}
! 			else
! 				outdesc[i] = NULL;
! 		}
  #endif
  
! 		delete outlist; outlist = NULL;
! 		
  #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX
! 		outlets = new outlet *[outcnt+(procattr?1:0)];
  
! 		// type info is now in list array
  #if FLEXT_SYS == FLEXT_SYS_PD
! 		for(int ix = 0; ix < outcnt; ++ix) 
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 		for(int ix = outcnt-1; ix >= 0; --ix) 
  #else
  #error
  #endif
! 		{
! 			switch(list[ix]) {
! 				case xlet::tp_float:
! 					outlets[ix] = (outlet *)newout_float(&x_obj->obj);
! 					break;
! 				case xlet::tp_int: 
! 					outlets[ix] = (outlet *)newout_flint(&x_obj->obj);
! 					break;
! 				case xlet::tp_sig:
! 					outlets[ix] = (outlet *)newout_signal(&x_obj->obj);
! 					++outsigs;
! 					break;
! 				case xlet::tp_sym:
! 					outlets[ix] = (outlet *)newout_symbol(&x_obj->obj);
! 					break;
! 				case xlet::tp_list:
! 					outlets[ix] = (outlet *)newout_list(&x_obj->obj);
! 					break;
! 				case xlet::tp_any:
! 					outlets[ix] = (outlet *)newout_anything(&x_obj->obj);
! 					break;
  #ifdef FLEXT_DEBUG
! 				default:
! 					ERRINTERNAL();
! 					ok = false;
  #endif
! 			} 
! 		}
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
! 		t_class *cl = thisClass();
! 		for(int ix = 0; ix < outcnt; ++ix) {
! 			switch(list[ix]) {
! 				case xlet::tp_float:
! 				case xlet::tp_int: 
! //					fts_class_outlet_number(cl, ix);
! 					break;
! 				case xlet::tp_sym:
! //					fts_class_outlet_symbol(cl, ix);
! 					break;
! 				case xlet::tp_list:
! 				case xlet::tp_any:
! //					fts_class_outlet_anything(cl, ix);
! 					break;
! 				case xlet::tp_sig:
! 					if(!outsigs) fts_dsp_declare_outlet(cl,0);
! 					++outsigs;
! 					break;
  #ifdef FLEXT_DEBUG
! 				default:
! 					ERRINTERNAL();
! 					ok = false;
  #endif
! 			} 
! 		}
  
! 		fts_object_set_outlets_number((fts_object_t *)thisHdr(), outcnt+(procattr?1:0));
  #endif
  
! 		delete[] list;
! 	}
  
  #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX
! 	if(procattr) {
! 		// attribute dump outlet is the last one
! 		outlets[outcnt] = 
  #if FLEXT_SYS == FLEXT_SYS_PD
! 		// attribute dump outlet is the last one
! 			(outlet *)newout_anything(&x_obj->obj);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 			attrtmp;
  #endif
  
! 	}
  #endif
! 	
! 	return ok;
  }
  
--- 59,405 ----
  bool flext_base::InitInlets()
  {
!     bool ok = true;
  
!     // ----------------------------------
!     // create inlets
!     // ----------------------------------
  
!     incnt = insigs = 0; 
  
      // digest inlist
      {
!         xlet *xi;
!         incnt = 0;
!         for(xi = inlist; xi; xi = xi->nxt) ++incnt;
!         xlet::type *list = new xlet::type[incnt];
!         int i;
!         for(xi = inlist,i = 0; xi; xi = xi->nxt,++i) list[i] = xi->tp;
!         
! #if FLEXT_SYS == FLEXT_SYS_MAX      
!         // copy inlet descriptions
!         indesc = new char *[incnt];
!         for(xi = inlist,i = 0; xi; xi = xi->nxt,++i) {
!             int l = xi->desc?strlen(xi->desc):0;
!             if(l) {
!                 indesc[i] = new char[l+1];
!                 memcpy(indesc[i],xi->desc,l);
!                 indesc[i][l] = 0;
!             }
!             else
!                 indesc[i] = NULL;
!         }
  #endif
  
!         delete inlist; inlist = NULL;
!         
  #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX
!         inlets = new px_object *[incnt];
!         for(i = 0; i < incnt; ++i) inlets[i] = NULL;
  #endif
!         
!         // type info is now in list array
  #if FLEXT_SYS == FLEXT_SYS_PD
!         {
!             int cnt = 0;
  
!             if(incnt >= 1) {
!                 switch(list[0]) {
!                     case xlet::tp_sig:
!                         ++insigs;
!                         break;
!                     default:
!                         // leftmost inlet is already there...
!                         break;
!                 } 
!                 ++cnt;
!             }       
  
!             for(int ix = 1; ix < incnt; ++ix,++cnt) {
!                 switch(list[ix]) {
!                     case xlet::tp_float:
!                     case xlet::tp_int: {
!                         char sym[] = "ft??";
!                         if(ix >= 10) { 
!                             if(compatibility) {
!                                 // Max allows max. 9 inlets
!                                 post("%s: Only 9 float/int inlets allowed in compatibility mode",thisName());
!                                 ok = false;
!                             }
!                             else {
!                                 if(ix > 99)
!                                     post("%s: Inlet index > 99 not allowed for float/int inlets",thisName());
!                                 sym[2] = '0'+ix/10,sym[3] = '0'+ix%10;
!                             }
!                         }
!                         else 
!                             sym[2] = '0'+ix,sym[3] = 0;  
!                         if(ok) inlet_new(&x_obj->obj, &x_obj->obj.ob_pd, (t_symbol *)sym_float, gensym(sym)); 
!                         break;
!                     }
!                     case xlet::tp_sym: 
!                         (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix);  // proxy for 2nd inlet messages 
!                         inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, (t_symbol *)sym_symbol, (t_symbol *)sym_symbol);  
!                         break;
!                     case xlet::tp_list:
!                         (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix);  // proxy for 2nd inlet messages 
!                         inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, (t_symbol *)sym_list, (t_symbol *)sym_list);  
!                         break;
!                     case xlet::tp_any:
!                         (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix);  // proxy for 2nd inlet messages 
!                         inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, 0, 0);  
!                         break;
!                     case xlet::tp_sig:
!                         if(compatibility && list[ix-1] != xlet::tp_sig) {
!                             post("%s: All signal inlets must be left-aligned in compatibility mode",thisName());
!                             ok = false;
!                         }
!                         else {
!                             // pd doesn't seem to be able to handle signals and messages into the same inlet...
!                             
!                             inlet_new(&x_obj->obj, &x_obj->obj.ob_pd, (t_symbol *)sym_signal, (t_symbol *)sym_signal);  
!                             ++insigs;
!                         }
!                         break;
!                     default:
!                         error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]);
!                         ok = false;
!                 } 
!             }
  
!             incnt = cnt;
!         }
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!         {
!             int ix,cnt;
!             // count leftmost signal inlets
!             while(insigs < incnt && list[insigs] == xlet::tp_sig) ++insigs;
!             
!             for(cnt = 0,ix = incnt-1; ix >= insigs; --ix,++cnt) {
!                 if(ix == 0) {
!                     if(list[ix] != xlet::tp_any) {
!                         error("%s: Leftmost inlet must be of type signal or anything",thisName());
!                         ok = false;
!                     }
!                 }
!                 else {
!                     switch(list[ix]) {
!                         case xlet::tp_sig:
!                             error("%s: All signal inlets must be left-aligned",thisName());
!                             ok = false;
!                             break;
!                         case xlet::tp_float:
!                             if(ix >= 10) { 
!                                 post("%s: Only 9 float inlets possible",thisName());
!                                 ok = false;
!                             }
!                             else
!                                 floatin(x_obj,ix);  
!                             break;
!                         case xlet::tp_int:
!                             if(ix >= 10) { 
!                                 post("%s: Only 9 int inlets possible",thisName());
!                                 ok = false;
!                             }
!                             else
!                                 intin(x_obj,ix);  
!                             break;
!                         case xlet::tp_any: // non-leftmost
!                         case xlet::tp_sym:
!                         case xlet::tp_list:
!                             inlets[ix] = (px_object *)proxy_new(x_obj,ix,&((flext_hdr *)x_obj)->curinlet);  
!                             break;
!                         default:
!                             error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]);
!                             ok = false;
!                     } 
!                 }
!             }
  
! //          incnt = cnt;
!     
!             if(insigs) 
! //              dsp_setup(thisHdr(),insigs); // signal inlets   
!                 dsp_setupbox(thisHdr(),insigs); // signal inlets    
!         }
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
!         {
!             t_class *cl = thisClass();
!             int cnt = 0;
!             for(int ix = 0; ix < incnt; ++ix,++cnt) {
!                 switch(list[ix]) {
!                     case xlet::tp_float:
!                     case xlet::tp_int:
! //                      fts_class_inlet_number(cl, ix, jmax_proxy);
!                         break;
!                     case xlet::tp_sym: 
! //                      fts_class_inlet_symbol(cl, ix, jmax_proxy);
!                         break;
!                     case xlet::tp_sig:
!                         if(compatibility && list[ix-1] != xlet::tp_sig) {
!                             post("%s: All signal inlets must be left-aligned in compatibility mode",thisName());
!                             ok = false;
!                         }
!                         else {
!                             if(!insigs) fts_dsp_declare_inlet(cl,0);                            
!                             ++insigs;
!                         }
!                         // no break -> let a signal inlet also accept any messages
!                     case xlet::tp_list:
!                     case xlet::tp_any:
! //                      fts_class_inlet_varargs(cl,ix, jmax_proxy);
!                         break;
!                     default:
!                         error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]);
!                         ok = false;
!                 } 
!             }
  
!             incnt = cnt;
  
!             fts_object_set_inlets_number((fts_object_t *)thisHdr(), incnt);
!         }
  #else
  #error
  #endif
  
!         delete[] list;
!     }
  
!     return ok;  
  }
  
  bool flext_base::InitOutlets()
  {
!     bool ok = true;
  
!     // ----------------------------------
!     // create outlets
!     // ----------------------------------
  
!     outcnt = outsigs = 0; 
!     
  #if FLEXT_SYS == FLEXT_SYS_MAX
!     // for Max/MSP the rightmost outlet has to be created first
!     outlet *attrtmp = NULL;
!     if(procattr) 
!         attrtmp = (outlet *)newout_anything(thisHdr());
  #endif
  
      // digest outlist
!     {
!         xlet *xi;
  
!         // count outlets
!         outcnt = 0;
!         for(xi = outlist; xi; xi = xi->nxt) ++outcnt;
  
!         xlet::type *list = new xlet::type[outcnt];
!         int i;
!         for(xi = outlist,i = 0; xi; xi = xi->nxt,++i) list[i] = xi->tp;
  
! #if FLEXT_SYS == FLEXT_SYS_MAX      
!         // copy outlet descriptions
!         outdesc = new char *[outcnt];
!         for(xi = outlist,i = 0; xi; xi = xi->nxt,++i) {
!             int l = xi->desc?strlen(xi->desc):0;
!             if(l) {
!                 outdesc[i] = new char[l+1];
!                 memcpy(outdesc[i],xi->desc,l);
!                 outdesc[i][l] = 0;
!             }
!             else
!                 outdesc[i] = NULL;
!         }
  #endif
  
!         delete outlist; outlist = NULL;
!         
  #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX
!         outlets = new outlet *[outcnt+(procattr?1:0)];
  
!         // type info is now in list array
  #if FLEXT_SYS == FLEXT_SYS_PD
!         for(int ix = 0; ix < outcnt; ++ix) 
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!         for(int ix = outcnt-1; ix >= 0; --ix) 
  #else
  #error
  #endif
!         {
!             switch(list[ix]) {
!                 case xlet::tp_float:
!                     outlets[ix] = (outlet *)newout_float(&x_obj->obj);
!                     break;
!                 case xlet::tp_int: 
!                     outlets[ix] = (outlet *)newout_flint(&x_obj->obj);
!                     break;
!                 case xlet::tp_sig:
!                     outlets[ix] = (outlet *)newout_signal(&x_obj->obj);
!                     ++outsigs;
!                     break;
!                 case xlet::tp_sym:
!                     outlets[ix] = (outlet *)newout_symbol(&x_obj->obj);
!                     break;
!                 case xlet::tp_list:
!                     outlets[ix] = (outlet *)newout_list(&x_obj->obj);
!                     break;
!                 case xlet::tp_any:
!                     outlets[ix] = (outlet *)newout_anything(&x_obj->obj);
!                     break;
  #ifdef FLEXT_DEBUG
!                 default:
!                     ERRINTERNAL();
!                     ok = false;
  #endif
!             } 
!         }
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
!         t_class *cl = thisClass();
!         for(int ix = 0; ix < outcnt; ++ix) {
!             switch(list[ix]) {
!                 case xlet::tp_float:
!                 case xlet::tp_int: 
! //                  fts_class_outlet_number(cl, ix);
!                     break;
!                 case xlet::tp_sym:
! //                  fts_class_outlet_symbol(cl, ix);
!                     break;
!                 case xlet::tp_list:
!                 case xlet::tp_any:
! //                  fts_class_outlet_anything(cl, ix);
!                     break;
!                 case xlet::tp_sig:
!                     if(!outsigs) fts_dsp_declare_outlet(cl,0);
!                     ++outsigs;
!                     break;
  #ifdef FLEXT_DEBUG
!                 default:
!                     ERRINTERNAL();
!                     ok = false;
  #endif
!             } 
!         }
  
!         fts_object_set_outlets_number((fts_object_t *)thisHdr(), outcnt+(procattr?1:0));
  #endif
  
!         delete[] list;
!     }
  
  #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX
!     if(procattr) {
!         // attribute dump outlet is the last one
!         outlets[outcnt] = 
  #if FLEXT_SYS == FLEXT_SYS_PD
!         // attribute dump outlet is the last one
!             (outlet *)newout_anything(&x_obj->obj);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!             attrtmp;
  #endif
  
!     }
  #endif
!     
!     return ok;
  }
  

Index: flbase.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flbase.h,v
retrieving revision 1.25
retrieving revision 1.26
diff -C2 -d -r1.25 -r1.26
*** flbase.h	23 Apr 2004 02:32:55 -0000	1.25
--- flbase.h	21 Jun 2004 13:58:19 -0000	1.26
***************
*** 444,451 ****
--- 444,457 ----
  #define FLEXTTYPE_int0 FLEXTTPN_DEFFLOAT
  #define CALLBTYPE_int float
+ #define FLEXTTYPE_bool FLEXTTPN_FLOAT
+ #define FLEXTTYPE_bool0 FLEXTTPN_DEFFLOAT
+ #define CALLBTYPE_bool float
  #elif FLEXT_SYS == FLEXT_SYS_MAX || FLEXT_SYS == FLEXT_SYS_JMAX
  #define FLEXTTYPE_int FLEXTTPN_INT
  #define FLEXTTYPE_int0 FLEXTTPN_DEFINT
  #define CALLBTYPE_int int
+ #define FLEXTTYPE_bool FLEXTTPN_INT
+ #define FLEXTTYPE_bool0 FLEXTTPN_DEFINT
+ #define CALLBTYPE_bool int
  #else
  #error
***************
*** 465,468 ****
--- 471,476 ----
  
  
+ #define ARGMEMBER_bool(a) GetBool(a)
+ #define ARGMEMBER_bool0(a) ARGMEMBER_bool(a)
  #define ARGMEMBER_int(a) GetInt(a)
  #define ARGMEMBER_int0(a) ARGMEMBER_int(a)

Index: flutil.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flutil.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -C2 -d -r1.14 -r1.15
*** flutil.cpp	22 Jul 2003 02:32:51 -0000	1.14
--- flutil.cpp	21 Jun 2004 13:58:20 -0000	1.15
***************
*** 19,27 ****
  #include <windows.h>
  #elif FLEXT_OS == FLEXT_OS_MAC
! 	#if FLEXT_OSAPI != FLEXT_OSAPI_MAC_MACH
! 		#include <MacMemory.h>
! 	#else
! 		#include <Carbon/Carbon.h>
! 	#endif
  #endif
  
--- 19,27 ----
  #include <windows.h>
  #elif FLEXT_OS == FLEXT_OS_MAC
!     #if FLEXT_OSAPI != FLEXT_OSAPI_MAC_MACH
!         #include <MacMemory.h>
!     #else
!         #include <Carbon/Carbon.h>
!     #endif
  #endif
  
***************
*** 31,37 ****
      MoveMemory(dst,src,bytes);
  #elif FLEXT_OS == FLEXT_OS_MAC
! 	BlockMoveData(src,dst,bytes);
  #else
! 	memcpy(dst,src,bytes);
  #endif
  }
--- 31,37 ----
      MoveMemory(dst,src,bytes);
  #elif FLEXT_OS == FLEXT_OS_MAC
!     BlockMoveData(src,dst,bytes);
  #else
!     memcpy(dst,src,bytes);
  #endif
  }
***************
*** 44,48 ****
      BlockZero(dst,bytes);
  #else
! 	memset(dst,0,bytes);
  #endif
  }
--- 44,48 ----
      BlockZero(dst,bytes);
  #else
!     memset(dst,0,bytes);
  #endif
  }
***************
*** 51,64 ****
  bool flext::Forward(const t_symbol *recv,const t_symbol *s,int argc,const t_atom *argv)
  {
! 	void *cl = recv->s_thing;
! 	if(!cl) return false;
      
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	pd_typedmess((t_class **)cl,(t_symbol *)s,argc,(t_atom *)argv);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	typedmess(recv->s_thing,(t_symbol *)s,argc,(t_atom *)argv);
  #else
  #error Not implemented
  #endif
! 	return true;
  }
--- 51,64 ----
  bool flext::Forward(const t_symbol *recv,const t_symbol *s,int argc,const t_atom *argv)
  {
!     void *cl = recv->s_thing;
!     if(!cl) return false;
      
  #if FLEXT_SYS == FLEXT_SYS_PD
!     pd_typedmess((t_class **)cl,(t_symbol *)s,argc,(t_atom *)argv);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     typedmess(recv->s_thing,(t_symbol *)s,argc,(t_atom *)argv);
  #else
  #error Not implemented
  #endif
!     return true;
  }

Index: fldefs_methadd.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/fldefs_methadd.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** fldefs_methadd.h	12 Dec 2003 03:32:56 -0000	1.2
--- fldefs_methadd.h	21 Jun 2004 13:58:19 -0000	1.3
***************
*** 18,25 ****
  
  
! /*!	\defgroup FLEXT_D_CADDMETHOD Add flext methods within class scope
      \ingroup FLEXT_D_METHOD
! 	\note These can only be used at class construction time
! 	@{ 
  */
  
--- 18,25 ----
  
  
! /*! \defgroup FLEXT_D_CADDMETHOD Add flext methods within class scope
      \ingroup FLEXT_D_METHOD
!     \note These can only be used at class construction time
!     @{ 
  */
  
***************
*** 27,40 ****
  #define FLEXT_CADDBANG(CL,IX,M_FUN) \
  \
! AddMethod(CL,IX,"bang",FLEXT_CALL_PRE(M_FUN))	
  
  //! Add a handler for a method with either no, list or anything arguments
  #define FLEXT_CADDMETHOD(CL,IX,M_FUN) \
! AddMethod(CL,IX,FLEXT_CALL_PRE(M_FUN))	
  
  //! Add a a handler for a method with implicit arguments
  #define FLEXT_CADDMETHOD_(CL,IX,M_TAG,M_FUN) \
  \
! AddMethod(CL,IX,M_TAG,FLEXT_CALL_PRE(M_FUN))	
  
  //! Add a handler for a method with 1 enum type argument
--- 27,40 ----
  #define FLEXT_CADDBANG(CL,IX,M_FUN) \
  \
! AddMethod(CL,IX,"bang",FLEXT_CALL_PRE(M_FUN))   
  
  //! Add a handler for a method with either no, list or anything arguments
  #define FLEXT_CADDMETHOD(CL,IX,M_FUN) \
! AddMethod(CL,IX,FLEXT_CALL_PRE(M_FUN))  
  
  //! Add a a handler for a method with implicit arguments
  #define FLEXT_CADDMETHOD_(CL,IX,M_TAG,M_FUN) \
  \
! AddMethod(CL,IX,M_TAG,FLEXT_CALL_PRE(M_FUN))    
  
  //! Add a handler for a method with 1 enum type argument
***************
*** 46,50 ****
  #define FLEXT_CADDMETHOD_1(CL,IX,M_TAG,M_FUN,TP1) \
  \
! AddMethod(ClMeths(CL),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),a_null)	
  
  //! Add a handler for a method with 2 arguments
--- 46,50 ----
  #define FLEXT_CADDMETHOD_1(CL,IX,M_TAG,M_FUN,TP1) \
  \
! AddMethod(ClMeths(CL),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),a_null)   
  
  //! Add a handler for a method with 2 arguments
***************
*** 69,73 ****
  
  
! //	Shortcuts
  
  //! Add a handler for a method with a boolean argument
--- 69,73 ----
  
  
! //  Shortcuts
  
  //! Add a handler for a method with a boolean argument
***************
*** 109,117 ****
  
  
! /*!	\defgroup FLEXT_D_ADDMETHOD Add flext methods
      \ingroup FLEXT_D_METHOD
! 	\note These can only be used at object construction time 
! 	\note (in constructor or in Init() function before call to parent's Init())
! 	@{ 
  */
  
--- 109,117 ----
  
  
! /*! \defgroup FLEXT_D_ADDMETHOD Add flext methods
      \ingroup FLEXT_D_METHOD
!     \note These can only be used at object construction time 
!     \note (in constructor or in Init() function before call to parent's Init())
!     @{ 
  */
  
***************
*** 124,158 ****
  #define FLEXT_ADDDIST() \
  \
! SetDist(true)	
  
  //! Add a method handler for bang 
  #define FLEXT_ADDBANG(IX,M_FUN) \
  \
! AddMethod(IX,"bang",FLEXT_CALL_PRE(M_FUN))	
  
  //! Add a handler for a method with either no, list or anything arguments
  #define FLEXT_ADDMETHOD(IX,M_FUN) \
! AddMethod(IX,FLEXT_CALL_PRE(M_FUN))	
  
  /*! \brief Add a handler for a method with a (variable argument) list
! 	\deprecated This definition obscures that _ indicates the usage of a message tag - use FLEXT_ADDMETHOD instead
! 	\note This is already covered by FLEXT_ADDMETHOD, but here for the sake of clarity
  */
  #define FLEXT_ADDMETHOD_V(IX,M_FUN) \
  \
! AddMethod(IX,FLEXT_CALL_PRE(M_FUN))	
  
  /*! \brief Add a handler for a method with an anything argument
! 	\deprecated This definition obscures that _ indicates the usage of a message tag - use FLEXT_ADDMETHOD instead
! 	\note This is already covered by FLEXT_ADDMETHOD, but here for the sake of clarity
  */
  #define FLEXT_ADDMETHOD_A(IX,M_FUN) \
  \
! AddMethod(IX,FLEXT_CALL_PRE(M_FUN))	
  
  //! Add a a handler for a tagged method with implicit arguments
  #define FLEXT_ADDMETHOD_(IX,M_TAG,M_FUN) \
  \
! AddMethod(IX,M_TAG,FLEXT_CALL_PRE(M_FUN))	
  
  //! Add a handler for a method with 1 enum type argument
--- 124,158 ----
  #define FLEXT_ADDDIST() \
  \
! SetDist(true)   
  
  //! Add a method handler for bang 
  #define FLEXT_ADDBANG(IX,M_FUN) \
  \
! AddMethod(IX,"bang",FLEXT_CALL_PRE(M_FUN))  
  
  //! Add a handler for a method with either no, list or anything arguments
  #define FLEXT_ADDMETHOD(IX,M_FUN) \
! AddMethod(IX,FLEXT_CALL_PRE(M_FUN)) 
  
  /*! \brief Add a handler for a method with a (variable argument) list
!     \deprecated This definition obscures that _ indicates the usage of a message tag - use FLEXT_ADDMETHOD instead
!     \note This is already covered by FLEXT_ADDMETHOD, but here for the sake of clarity
  */
  #define FLEXT_ADDMETHOD_V(IX,M_FUN) \
  \
! AddMethod(IX,FLEXT_CALL_PRE(M_FUN)) 
  
  /*! \brief Add a handler for a method with an anything argument
!     \deprecated This definition obscures that _ indicates the usage of a message tag - use FLEXT_ADDMETHOD instead
!     \note This is already covered by FLEXT_ADDMETHOD, but here for the sake of clarity
  */
  #define FLEXT_ADDMETHOD_A(IX,M_FUN) \
  \
! AddMethod(IX,FLEXT_CALL_PRE(M_FUN)) 
  
  //! Add a a handler for a tagged method with implicit arguments
  #define FLEXT_ADDMETHOD_(IX,M_TAG,M_FUN) \
  \
! AddMethod(IX,M_TAG,FLEXT_CALL_PRE(M_FUN))   
  
  //! Add a handler for a method with 1 enum type argument
***************
*** 164,168 ****
  #define FLEXT_ADDMETHOD_1(IX,M_TAG,M_FUN,TP1) \
  \
! AddMethod(ThMeths(),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),a_null)	
  
  //! Add a handler for a method with 2 arguments
--- 164,168 ----
  #define FLEXT_ADDMETHOD_1(IX,M_TAG,M_FUN,TP1) \
  \
! AddMethod(ThMeths(),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),a_null) 
  
  //! Add a handler for a method with 2 arguments
***************
*** 187,191 ****
  
  
! //	Shortcuts
  
  //! Add a handler for a method with a boolean argument
--- 187,191 ----
  
  
! //  Shortcuts
  
  //! Add a handler for a method with a boolean argument

Index: flmeth.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flmeth.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** flmeth.cpp	6 Mar 2004 03:25:48 -0000	1.9
--- flmeth.cpp	21 Jun 2004 13:58:19 -0000	1.10
***************
*** 22,40 ****
  
  flext_base::MethItem::MethItem(AttrItem *conn): 
! 	Item(conn),index(0),
! 	argc(0),args(NULL)
! 	,fun(NULL)
  {}
  
  flext_base::MethItem::~MethItem() 
  { 
! 	if(args) delete[] args; 
  }
  
  void flext_base::MethItem::SetArgs(methfun _fun,int _argc,metharg *_args)
  {
! 	fun = _fun;
! 	if(args) delete[] args;
! 	argc = _argc,args = _args;
  }
  
--- 22,40 ----
  
  flext_base::MethItem::MethItem(AttrItem *conn): 
!     Item(conn),index(0),
!     argc(0),args(NULL)
!     ,fun(NULL)
  {}
  
  flext_base::MethItem::~MethItem() 
  { 
!     if(args) delete[] args; 
  }
  
  void flext_base::MethItem::SetArgs(methfun _fun,int _argc,metharg *_args)
  {
!     fun = _fun;
!     if(args) delete[] args;
!     argc = _argc,args = _args;
  }
  
***************
*** 43,47 ****
  {
      const t_symbol *t = tag?MakeSymbol(tag):NULL;
! 	methhead->Add(new MethItem,t,inlet);
  }
  
--- 43,47 ----
  {
      const t_symbol *t = tag?MakeSymbol(tag):NULL;
!     methhead->Add(new MethItem,t,inlet);
  }
  
***************
*** 50,110 ****
  void flext_base::AddMethod(ItemCont *ma,int inlet,const char *tag,methfun fun,metharg tp,...)
  {
! 	va_list marker; 
  
! 	// at first just count the arg type list (in argc)
! 	int argc = 0;
! 	va_start(marker,tp);
! 	metharg *args = NULL,arg = tp;
! 	for(; arg != a_null; ++argc) arg = (metharg)va_arg(marker,int); //metharg);
! 	va_end(marker);
! 	
! 	if(argc > 0) {
! 		if(argc > FLEXT_MAXMETHARGS) {
! 			error("flext - method %s: only %i arguments are type-checkable: use variable argument list for more",tag?tag:"?",FLEXT_MAXMETHARGS);
! 			argc = FLEXT_MAXMETHARGS;
! 		}
  
! 		args = new metharg[argc];
  
! 		va_start(marker,tp);
! 		metharg a = tp;
! 		for(int ix = 0; ix < argc; ++ix) {
  #ifdef FLEXT_DEBUG
! 			if(a == a_list && ix > 0) {
! 				ERRINTERNAL();
! 			}
  #endif
  #if FLEXT_SYS == FLEXT_SYS_PD
! 			if(a == a_pointer && flext_base::compatibility) {
! 				post("Pointer arguments are not allowed in compatibility mode"); 
! 			}
  #endif
! 			args[ix] = a;
! 			a = (metharg)va_arg(marker,int); //metharg);
! 		}
! 		va_end(marker);
! 	}
! 	
! 	MethItem *mi = new MethItem;
      mi->index = ma->Members();
! 	mi->SetArgs(fun,argc,args);
! 	ma->Add(mi,MakeSymbol(tag),inlet);
  }
  
  void flext_base::ListMethods(AtomList &la,int inlet) const
  {
! 	typedef DataMap<int,const t_symbol *> MethList;
! 	MethList list[2];
  
! 	int i;
! 	for(i = 0; i <= 1; ++i) {
! 		ItemCont *a = i?methhead:clmethhead;
! 		if(a && a->Contained(inlet)) {
              ItemSet &ai = a->GetInlet(inlet);
              for(ItemSet::iterator as = ai.begin(); as != ai.end(); ++as) {
                  for(Item *al = as.data(); al; al = al->nxt) {
! 					MethItem *aa = (MethItem *)al;
  
! 					// check it's not related to an attribute
                      if(!aa->IsAttr()) {
                          list[i][aa->index] = as.key();
--- 50,110 ----
  void flext_base::AddMethod(ItemCont *ma,int inlet,const char *tag,methfun fun,metharg tp,...)
  {
!     va_list marker; 
  
!     // at first just count the arg type list (in argc)
!     int argc = 0;
!     va_start(marker,tp);
!     metharg *args = NULL,arg = tp;
!     for(; arg != a_null; ++argc) arg = (metharg)va_arg(marker,int); //metharg);
!     va_end(marker);
!     
!     if(argc > 0) {
!         if(argc > FLEXT_MAXMETHARGS) {
!             error("flext - method %s: only %i arguments are type-checkable: use variable argument list for more",tag?tag:"?",FLEXT_MAXMETHARGS);
!             argc = FLEXT_MAXMETHARGS;
!         }
  
!         args = new metharg[argc];
  
!         va_start(marker,tp);
!         metharg a = tp;
!         for(int ix = 0; ix < argc; ++ix) {
  #ifdef FLEXT_DEBUG
!             if(a == a_list && ix > 0) {
!                 ERRINTERNAL();
!             }
  #endif
  #if FLEXT_SYS == FLEXT_SYS_PD
!             if(a == a_pointer && flext_base::compatibility) {
!                 post("Pointer arguments are not allowed in compatibility mode"); 
!             }
  #endif
!             args[ix] = a;
!             a = (metharg)va_arg(marker,int); //metharg);
!         }
!         va_end(marker);
!     }
!     
!     MethItem *mi = new MethItem;
      mi->index = ma->Members();
!     mi->SetArgs(fun,argc,args);
!     ma->Add(mi,MakeSymbol(tag),inlet);
  }
  
  void flext_base::ListMethods(AtomList &la,int inlet) const
  {
!     typedef DataMap<int,const t_symbol *> MethList;
!     MethList list[2];
  
!     int i;
!     for(i = 0; i <= 1; ++i) {
!         ItemCont *a = i?methhead:clmethhead;
!         if(a && a->Contained(inlet)) {
              ItemSet &ai = a->GetInlet(inlet);
              for(ItemSet::iterator as = ai.begin(); as != ai.end(); ++as) {
                  for(Item *al = as.data(); al; al = al->nxt) {
!                     MethItem *aa = (MethItem *)al;
  
!                     // check it's not related to an attribute
                      if(!aa->IsAttr()) {
                          list[i][aa->index] = as.key();
***************
*** 112,145 ****
                      }
                  }
! 			}
! 		}
! 	}
  
! 	la(list[0].size()+list[1].size());
! 	int ix = 0;
! 	MethList::iterator it;
! 	for(i = 0; i <= 1; ++i)
! 		for(it = list[i].begin(); it != list[i].end(); ++it) 
! 			SetSymbol(la[ix++],it.data());
  }
  
  bool flext_base::ListMethods(int inlet) const
  {
! 	if(procattr) {
! 		AtomList la;
! 		ListMethods(la,inlet);
! 		ToOutAnything(GetOutAttr(),MakeSymbol("methods"),la.Count(),la.Atoms());
! 		return true;
! 	}
! 	else
! 		return false;
  }
  
  bool flext_base::cb_ListMethods(flext_base *c,int argc,const t_atom *argv) 
  { 
! 	if(argc == 0 || (argc == 1 && CanbeInt(argv[0])))
! 		return c->ListMethods(argc?GetAInt(argv[0]):0); 
! 	else
! 		return false;
  }
  
--- 112,145 ----
                      }
                  }
!             }
!         }
!     }
  
!     la(list[0].size()+list[1].size());
!     int ix = 0;
!     MethList::iterator it;
!     for(i = 0; i <= 1; ++i)
!         for(it = list[i].begin(); it != list[i].end(); ++it) 
!             SetSymbol(la[ix++],it.data());
  }
  
  bool flext_base::ListMethods(int inlet) const
  {
!     if(procattr) {
!         AtomList la;
!         ListMethods(la,inlet);
!         ToOutAnything(GetOutAttr(),MakeSymbol("methods"),la.Count(),la.Atoms());
!         return true;
!     }
!     else
!         return false;
  }
  
  bool flext_base::cb_ListMethods(flext_base *c,int argc,const t_atom *argv) 
  { 
!     if(argc == 0 || (argc == 1 && CanbeInt(argv[0])))
!         return c->ListMethods(argc?GetAInt(argv[0]):0); 
!     else
!         return false;
  }
  

Index: fldefs.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/fldefs.h,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -d -r1.17 -r1.18
*** fldefs.h	12 Dec 2003 03:32:56 -0000	1.17
--- fldefs.h	21 Jun 2004 13:58:19 -0000	1.18
***************
*** 16,26 ****
  #define __FLEXT_DEFS_H
  
! /*!	\defgroup FLEXT_DEFS Definitions for basic flext functionality
! 	@{ 
  */
  
  /*! \brief Switch for compilation of derived virtual classes
! 	\remark These need dynamic type casts (and RTTI, naturally)
! 	\ingroup FLEXT_GLOBALS
  */
  #ifdef FLEXT_VIRT
--- 16,26 ----
  #define __FLEXT_DEFS_H
  
! /*! \defgroup FLEXT_DEFS Definitions for basic flext functionality
!     @{ 
  */
  
  /*! \brief Switch for compilation of derived virtual classes
!     \remark These need dynamic type casts (and RTTI, naturally)
!     \ingroup FLEXT_GLOBALS
  */
  #ifdef FLEXT_VIRT
***************
*** 30,34 ****
  #endif
  
! //!	@}  FLEXT_DEFS
  
  #include "fldefs_hdr.h"
--- 30,34 ----
  #endif
  
! //! @}  FLEXT_DEFS
  
  #include "fldefs_hdr.h"
***************
*** 39,44 ****
  // ====================================================================================
  
! /*!	\defgroup FLEXT_D_METHOD Declarations for flext methods
! 	@{ 
  */
  
--- 39,44 ----
  // ====================================================================================
  
! /*! \defgroup FLEXT_D_METHOD Declarations for flext methods
!     @{ 
  */
  
***************
*** 55,61 ****
  #ifdef FLEXT_ATTRIBUTES 
  
! /*!	\defgroup FLEXT_D_ATTRIB Attribute definition
! 	\note These have to reside inside the class declaration
! 	@{ 
  */
  
--- 55,61 ----
  #ifdef FLEXT_ATTRIBUTES 
  
! /*! \defgroup FLEXT_D_ATTRIB Attribute definition
!     \note These have to reside inside the class declaration
!     @{ 
  */
  

Index: flatom_app.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flatom_app.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** flatom_app.cpp	1 Jan 2003 04:32:04 -0000	1.2
--- flatom_app.cpp	21 Jun 2004 13:58:19 -0000	1.3
***************
*** 18,76 ****
  flext::AtomList &flext::AtomList::Append(const t_atom &a)
  {
! 	t_atom *nlst = new t_atom[cnt+1];
! 	for(int i = 0; i < cnt; ++i) SetAtom(nlst[i],lst[i]);
! 	SetAtom(nlst[cnt],a);
! 	
! 	if(lst) delete[] lst;
!  	lst = nlst;
! 	++cnt;
  
! 	return *this;
  }
  
  flext::AtomList &flext::AtomList::Append(int argc,const t_atom *argv)
  {
! 	if(argc) {
! 		t_atom *nlst = new t_atom[cnt+argc];
! 		int i;
! 		for(i = 0; i < cnt; ++i) SetAtom(nlst[i],lst[i]);
! 		if(argv) 
! 			for(i = 0; i < argc; ++i) SetAtom(nlst[cnt+i],argv[i]);
! 		
! 		if(lst) delete[] lst;
! 		lst = nlst;
! 		cnt += argc;
! 	}
! 	return *this;
  }
  
  flext::AtomList &flext::AtomList::Prepend(const t_atom &a)
  {
! 	t_atom *nlst = new t_atom[cnt+1];
! 	for(int i = 0; i < cnt; ++i) SetAtom(nlst[i+1],lst[i]);
! 	SetAtom(nlst[0],a);
! 	
! 	if(lst) delete[] lst;
! 	lst = nlst;
! 	++cnt;
  
! 	return *this;
  }
  
  flext::AtomList &flext::AtomList::Prepend(int argc,const t_atom *argv)
  {
! 	if(argc) {
! 		t_atom *nlst = new t_atom[cnt+argc];
! 		int i;
  
! 		if(argv) 
! 			for(i = 0; i < argc; ++i) SetAtom(nlst[i],argv[i]);
! 		for(i = 0; i < cnt; ++i) SetAtom(nlst[argc+i],lst[i]);
! 		
! 		if(lst) delete[] lst;
! 		lst = nlst;
! 		cnt += argc;
! 	}
! 	return *this;
  }
  
--- 18,76 ----
  flext::AtomList &flext::AtomList::Append(const t_atom &a)
  {
!     t_atom *nlst = new t_atom[cnt+1];
!     for(int i = 0; i < cnt; ++i) SetAtom(nlst[i],lst[i]);
!     SetAtom(nlst[cnt],a);
!     
!     if(lst) delete[] lst;
!     lst = nlst;
!     ++cnt;
  
!     return *this;
  }
  
  flext::AtomList &flext::AtomList::Append(int argc,const t_atom *argv)
  {
!     if(argc) {
!         t_atom *nlst = new t_atom[cnt+argc];
!         int i;
!         for(i = 0; i < cnt; ++i) SetAtom(nlst[i],lst[i]);
!         if(argv) 
!             for(i = 0; i < argc; ++i) SetAtom(nlst[cnt+i],argv[i]);
!         
!         if(lst) delete[] lst;
!         lst = nlst;
!         cnt += argc;
!     }
!     return *this;
  }
  
  flext::AtomList &flext::AtomList::Prepend(const t_atom &a)
  {
!     t_atom *nlst = new t_atom[cnt+1];
!     for(int i = 0; i < cnt; ++i) SetAtom(nlst[i+1],lst[i]);
!     SetAtom(nlst[0],a);
!     
!     if(lst) delete[] lst;
!     lst = nlst;
!     ++cnt;
  
!     return *this;
  }
  
  flext::AtomList &flext::AtomList::Prepend(int argc,const t_atom *argv)
  {
!     if(argc) {
!         t_atom *nlst = new t_atom[cnt+argc];
!         int i;
  
!         if(argv) 
!             for(i = 0; i < argc; ++i) SetAtom(nlst[i],argv[i]);
!         for(i = 0; i < cnt; ++i) SetAtom(nlst[argc+i],lst[i]);
!         
!         if(lst) delete[] lst;
!         lst = nlst;
!         cnt += argc;
!     }
!     return *this;
  }
  

Index: flstk.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flstk.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** flstk.h	13 Feb 2003 04:31:41 -0000	1.5
--- flstk.h	21 Jun 2004 13:58:19 -0000	1.6
***************
*** 16,64 ****
  
  class FLEXT_SHARE flext_stk:
! 	public flext_dsp
  { 
! 	FLEXT_HEADER(flext_stk,flext_dsp)
   
  public:
! 	flext_stk();
  
! 	// these have to be overridden in child classes
! 	virtual bool NewObjs() { return true; }
! 	virtual void FreeObjs() {}
! 	virtual void ProcessObjs(int blocksize) {}
  
  protected:
! 	virtual bool Init();
! 	virtual void Exit();
  
! 	//! STK object for reading from inlet buffer
! 	class Input:
! 		public Stk
! 	{
! 	public:
! 		Input(const t_sample *b,int vecsz);
  
! 		inline MY_FLOAT lastOut() const { return (MY_FLOAT)buf[index]; }
  
! 		inline MY_FLOAT tick() { 
! 	        if(++index >= vecsz) index = 0; 
! 	        return lastOut(); 
          }
  
! 		MY_FLOAT *tick(MY_FLOAT *vector,unsigned int vectorSize);
  
! 		inline void SetBuf(const t_sample *b) { buf = b; }
  
! 	private:
! 		const t_sample *buf;
! 		int vecsz,index;
! 	};
  
! 	//! STK object for writing to outlet buffer
! 	class Output:
! 		public Stk
! 	{
! 	public:
! 		Output(t_sample *b,int vecsz);
  
          inline void tick(MY_FLOAT s) { 
--- 16,64 ----
  
  class FLEXT_SHARE flext_stk:
!     public flext_dsp
  { 
!     FLEXT_HEADER(flext_stk,flext_dsp)
   
  public:
!     flext_stk();
  
!     // these have to be overridden in child classes
!     virtual bool NewObjs() { return true; }
!     virtual void FreeObjs() {}
!     virtual void ProcessObjs(int blocksize) {}
  
  protected:
!     virtual bool Init();
!     virtual void Exit();
  
!     //! STK object for reading from inlet buffer
!     class Input:
!         public Stk
!     {
!     public:
!         Input(const t_sample *b,int vecsz);
  
!         inline MY_FLOAT lastOut() const { return (MY_FLOAT)buf[index]; }
  
!         inline MY_FLOAT tick() { 
!             if(++index >= vecsz) index = 0; 
!             return lastOut(); 
          }
  
!         MY_FLOAT *tick(MY_FLOAT *vector,unsigned int vectorSize);
  
!         inline void SetBuf(const t_sample *b) { buf = b; }
  
!     private:
!         const t_sample *buf;
!         int vecsz,index;
!     };
  
!     //! STK object for writing to outlet buffer
!     class Output:
!         public Stk
!     {
!     public:
!         Output(t_sample *b,int vecsz);
  
          inline void tick(MY_FLOAT s) { 
***************
*** 67,94 ****
          }
  
! 		void tick(const MY_FLOAT *vector,unsigned int vectorSize);
  
! 		inline void SetBuf(t_sample *b) { buf = b; }
  
! 	private:
! 		t_sample *buf;
! 		int vecsz,index;
! 	};
  
! 	Input &Inlet(int ix) { return *inobj[ix]; }
! 	Output &Outlet(int ix) { return *outobj[ix]; }
  
  private:
! 	virtual void m_dsp(int n,t_sample *const *in,t_sample *const *out); 
! 	virtual void m_signal(int n,t_sample *const *in,t_sample *const *out); 
  
! 	void ClearObjs();
  
! 	int inobjs,outobjs;
! 	Input **inobj;
! 	Output **outobj;
  
! 	float smprt;
! 	int blsz;
  };
  
--- 67,94 ----
          }
  
!         void tick(const MY_FLOAT *vector,unsigned int vectorSize);
  
!         inline void SetBuf(t_sample *b) { buf = b; }
  
!     private:
!         t_sample *buf;
!         int vecsz,index;
!     };
  
!     Input &Inlet(int ix) { return *inobj[ix]; }
!     Output &Outlet(int ix) { return *outobj[ix]; }
  
  private:
!     virtual void m_dsp(int n,t_sample *const *in,t_sample *const *out); 
!     virtual void m_signal(int n,t_sample *const *in,t_sample *const *out); 
  
!     void ClearObjs();
  
!     int inobjs,outobjs;
!     Input **inobj;
!     Output **outobj;
  
!     float smprt;
!     int blsz;
  };
  

Index: flsupport.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flsupport.h,v
retrieving revision 1.68
retrieving revision 1.69
diff -C2 -d -r1.68 -r1.69
*** flsupport.h	23 Apr 2004 22:14:14 -0000	1.68
--- flsupport.h	21 Jun 2004 13:58:19 -0000	1.69
***************
*** 420,430 ****
  	static bool CanbeInt(const t_atom &a) { return IsFloat(a) || IsInt(a); }
  
- 	//! Set the atom to represent a boolean
- 	static void SetBool(t_atom &a,bool v) { SetInt(a,v?1:0); }
- 	//! Check whether the atom can be represented as a boolean
- 	static bool CanbeBool(const t_atom &a) { return CanbeInt(a); }
- 	//! Check for an boolean and get its value 
- 	static bool GetABool(const t_atom &a) { return GetAInt(a) != 0; }
- 
  #if FLEXT_SYS == FLEXT_SYS_PD
  	//! Check for a float and get its value 
--- 420,423 ----
***************
*** 501,504 ****
--- 494,506 ----
  #endif
  
+ 	//! Set the atom to represent a boolean
+ 	static void SetBool(t_atom &a,bool v) { SetInt(a,v?1:0); }
+ 	//! Check whether the atom can be represented as a boolean
+ 	static bool CanbeBool(const t_atom &a) { return CanbeInt(a); }
+ 	//! Check for an boolean and get its value 
+ 	static bool GetABool(const t_atom &a) { return GetAInt(a) != 0; }
+ 	//! Check for an boolean and get its value 
+ 	static bool GetBool(const t_atom &a) { return GetInt(a) != 0; }
+ 
  // --- atom list stuff -------------------------------------------
  

Index: flext.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flext.cpp,v
retrieving revision 1.27
retrieving revision 1.28
diff -C2 -d -r1.27 -r1.28
*** flext.cpp	22 Feb 2004 03:34:00 -0000	1.27
--- flext.cpp	21 Jun 2004 13:58:19 -0000	1.28
***************
*** 22,54 ****
  
  flext_base::FLEXT_CLASSDEF(flext_base)():
! 	inlist(NULL),outlist(NULL),
! 	curtag(NULL),
! 	incnt(0),outcnt(0),
! 	insigs(0),outsigs(0),
! 	distmsgs(false)
  #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX
! 	,outlets(NULL),inlets(NULL)
  #endif
  #if FLEXT_SYS == FLEXT_SYS_MAX
! 	,indesc(NULL),outdesc(NULL)
  #endif
  {
! 	FLEXT_LOG1("%s - flext logging is on",thisName());
  
! 	t_classid clid = thisClassId();
! 	clmethhead = ClMeths(clid);
! 	methhead = new ItemCont;
! 	bindhead = NULL;
  
! 	if(procattr) {
! 		// initialize when attribute processing is enabled
! 		attrhead = new ItemCont;
! 		clattrhead = ClAttrs(clid);
! 		attrdata = new AttrDataCont;
! 	}
! 	else {
! 		attrhead = clattrhead = NULL;
! 		attrdata = NULL;
! 	}
  }
  
--- 22,54 ----
  
  flext_base::FLEXT_CLASSDEF(flext_base)():
!     inlist(NULL),outlist(NULL),
!     curtag(NULL),
!     incnt(0),outcnt(0),
!     insigs(0),outsigs(0),
!     distmsgs(false)
  #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX
!     ,outlets(NULL),inlets(NULL)
  #endif
  #if FLEXT_SYS == FLEXT_SYS_MAX
!     ,indesc(NULL),outdesc(NULL)
  #endif
  {
!     FLEXT_LOG1("%s - flext logging is on",thisName());
  
!     t_classid clid = thisClassId();
!     clmethhead = ClMeths(clid);
!     methhead = new ItemCont;
!     bindhead = NULL;
  
!     if(procattr) {
!         // initialize when attribute processing is enabled
!         attrhead = new ItemCont;
!         clattrhead = ClAttrs(clid);
!         attrdata = new AttrDataCont;
!     }
!     else {
!         attrhead = clattrhead = NULL;
!         attrdata = NULL;
!     }
  }
  
***************
*** 57,179 ****
  #if FLEXT_SYS == FLEXT_SYS_MAX
      // according to David Z. one should do that first...
! //	if(insigs) dsp_free(thisHdr());
! 	if(insigs) dsp_freebox(thisHdr());
  #endif
  
  #ifdef FLEXT_THREADS
! 	StopThreads();
  #endif
  
! 	// send remaining pending messages for this object
! 	QFlush(this);
  
! 	// delete message lists
! 	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;
! 	if(outlist) delete outlist;
  
  #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX
! 	if(outlets) delete[] outlets;
  
! 	if(inlets) {
! 		for(int ix = 0; ix < incnt; ++ix)
! 			if(inlets[ix]) {
! 				// release proxy object
  #if FLEXT_SYS == FLEXT_SYS_PD
! 				pd_free(&inlets[ix]->obj.ob_pd);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 				freeobject((object *)inlets[ix]);
  #endif
! 			}
! 		delete[] inlets;
! 	}
  #endif
  
  #if FLEXT_SYS == FLEXT_SYS_MAX
! 	if(indesc) {
! 		for(int i = 0; i < incnt; ++i) if(indesc[i]) delete[] indesc[i];
! 		delete[] indesc;
! 	}
! 	if(outdesc) {
! 		for(int i = 0; i < outcnt; ++i) if(outdesc[i]) delete[] outdesc[i];
! 		delete[] outdesc;
! 	}
  #endif
  }
  
  /*! This virtual function is called after the object has been created, that is, 
! 	after the constructor has been processed. 
! 	It creates the inlets and outlets and the message and attribute lists.
! 	\note You can override it in your own class, but be sure to call it, 
! 	\note otherwise no inlets/outlets will be created
! 	\note All inlet, outlets, method and attribute declarations must be made before a call to Init!
! 	\remark Creation of inlets/outlets can't be done upon declaration, as Max/MSP needs creation
! 	\remark in reverse.
  */
  bool flext_base::Init()
  {
! 	bool ok = flext_obj::Init();
  
! 	if(ok) ok = InitInlets() && InitOutlets();
  
! 	if(ok) {
! 		if(procattr && m_holdaargc && m_holdaargv) {
! 			// initialize creation attributes
! 			ok = InitAttrib(m_holdaargc,m_holdaargv);
! 		}
! 	}
  
! 	return ok;
  }
  
  /*! Set up proxy classes and basic methods at class creation time
! 	This ensures that they are processed before the registered flext messages
  */
  void flext_base::Setup(t_classid id)
  {
! 	t_class *c = getClass(id);
  
  #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX
! 	add_method(c,cb_help,"help");
! 	add_loadbang(c,cb_loadbang);
  #if FLEXT_SYS == FLEXT_SYS_MAX
! 	add_assist(c,cb_assist);
  #endif
  #else
! 	fts_class_message_varargs(c,MakeSymbol("help"),cb_help);
! 	#pragma message ("no implementation of loadbang or assist")	
  #endif
  
! 	if(process_attributes) {
! 		AddMethod(id,0,"getattributes",cb_ListAttrib);
! 		AddMethod(id,0,"getmethods",cb_ListMethods);
  
  #if FLEXT_SYS == FLEXT_SYS_PD && !defined(FLEXT_NOATTREDIT)
! 		AddMethod(id,0,"attributedialog",cb_AttrDialog);
! 		SetAttrEditor(id);
  #endif
! 	}
  
! 	SetProxies(c);
  
! 	StartQueue();
  }
  
  #if FLEXT_SYS == FLEXT_SYS_JMAX
! void flext_base::cb_help(fts_object_t *c,int, fts_symbol_t, int, const fts_atom_t *) { thisObject(c)->m_help(); }	
  #else
! void flext_base::cb_help(t_class *c) { thisObject(c)->m_help(); }	
! void flext_base::cb_loadbang(t_class *c) { thisObject(c)->m_loadbang(); }	
  #endif
  
  void flext_base::m_help()
  {
! 	// This should better be overloaded
! 	post("%s (using flext " FLEXT_VERSTR ") - compiled on %s %s",thisName(),__DATE__,__TIME__);
  }
  
--- 57,179 ----
  #if FLEXT_SYS == FLEXT_SYS_MAX
      // according to David Z. one should do that first...
! //  if(insigs) dsp_free(thisHdr());
!     if(insigs) dsp_freebox(thisHdr());
  #endif
  
  #ifdef FLEXT_THREADS
!     StopThreads();
  #endif
  
!     // send remaining pending messages for this object
!     QFlush(this);
  
!     // delete message lists
!     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;
!     if(outlist) delete outlist;
  
  #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX
!     if(outlets) delete[] outlets;
  
!     if(inlets) {
!         for(int ix = 0; ix < incnt; ++ix)
!             if(inlets[ix]) {
!                 // release proxy object
  #if FLEXT_SYS == FLEXT_SYS_PD
!                 pd_free(&inlets[ix]->obj.ob_pd);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!                 freeobject((object *)inlets[ix]);
  #endif
!             }
!         delete[] inlets;
!     }
  #endif
  
  #if FLEXT_SYS == FLEXT_SYS_MAX
!     if(indesc) {
!         for(int i = 0; i < incnt; ++i) if(indesc[i]) delete[] indesc[i];
!         delete[] indesc;
!     }
!     if(outdesc) {
!         for(int i = 0; i < outcnt; ++i) if(outdesc[i]) delete[] outdesc[i];
!         delete[] outdesc;
!     }
  #endif
  }
  
  /*! This virtual function is called after the object has been created, that is, 
!     after the constructor has been processed. 
!     It creates the inlets and outlets and the message and attribute lists.
!     \note You can override it in your own class, but be sure to call it, 
!     \note otherwise no inlets/outlets will be created
!     \note All inlet, outlets, method and attribute declarations must be made before a call to Init!
!     \remark Creation of inlets/outlets can't be done upon declaration, as Max/MSP needs creation
!     \remark in reverse.
  */
  bool flext_base::Init()
  {
!     bool ok = flext_obj::Init();
  
!     if(ok) ok = InitInlets() && InitOutlets();
  
!     if(ok) {
!         if(procattr && m_holdaargc && m_holdaargv) {
!             // initialize creation attributes
!             ok = InitAttrib(m_holdaargc,m_holdaargv);
!         }
!     }
  
!     return ok;
  }
  
  /*! Set up proxy classes and basic methods at class creation time
!     This ensures that they are processed before the registered flext messages
  */
  void flext_base::Setup(t_classid id)
  {
!     t_class *c = getClass(id);
  
  #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX
!     add_method(c,cb_help,"help");
!     add_loadbang(c,cb_loadbang);
  #if FLEXT_SYS == FLEXT_SYS_MAX
!     add_assist(c,cb_assist);
  #endif
  #else
!     fts_class_message_varargs(c,MakeSymbol("help"),cb_help);
!     #pragma message ("no implementation of loadbang or assist") 
  #endif
  
!     if(process_attributes) {
!         AddMethod(id,0,"getattributes",cb_ListAttrib);
!         AddMethod(id,0,"getmethods",cb_ListMethods);
  
  #if FLEXT_SYS == FLEXT_SYS_PD && !defined(FLEXT_NOATTREDIT)
!         AddMethod(id,0,"attributedialog",cb_AttrDialog);
!         SetAttrEditor(id);
  #endif
!     }
  
!     SetProxies(c);
  
!     StartQueue();
  }
  
  #if FLEXT_SYS == FLEXT_SYS_JMAX
! void flext_base::cb_help(fts_object_t *c,int, fts_symbol_t, int, const fts_atom_t *) { thisObject(c)->m_help(); }   
  #else
! void flext_base::cb_help(t_class *c) { thisObject(c)->m_help(); }   
! void flext_base::cb_loadbang(t_class *c) { thisObject(c)->m_loadbang(); }   
  #endif
  
  void flext_base::m_help()
  {
!     // This should better be overloaded
!     post("%s (using flext " FLEXT_VERSTR ") - compiled on %s %s",thisName(),__DATE__,__TIME__);
  }
  
***************
*** 187,201 ****
  {
  #if FLEXT_SYS == FLEXT_SYS_MAX
! 	switch(msg) {
! 	case 1: //ASSIST_INLET:
! 		strcpy(s,arg < incnt && indesc[arg]?indesc[arg]:""); 
! 		break;
! 	case 2: //ASSIST_OUTLET:
! 		if(arg < outcnt)
! 			strcpy(s,outdesc[arg]?outdesc[arg]:""); 
! 		else
! 			strcpy(s,arg == outcnt && procattr?"Attributes":""); 
! 		break;
! 	}
  #endif
  }
--- 187,201 ----
  {
  #if FLEXT_SYS == FLEXT_SYS_MAX
!     switch(msg) {
!     case 1: //ASSIST_INLET:
!         strcpy(s,arg < incnt && indesc[arg]?indesc[arg]:""); 
!         break;
!     case 2: //ASSIST_OUTLET:
!         if(arg < outcnt)
!             strcpy(s,outdesc[arg]?outdesc[arg]:""); 
!         else
!             strcpy(s,arg == outcnt && procattr?"Attributes":""); 
!         break;
!     }
  #endif
  }

Index: fllib.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/fllib.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -C2 -d -r1.24 -r1.25
*** fllib.cpp	23 Apr 2004 02:32:55 -0000	1.24
--- fllib.cpp	21 Jun 2004 13:58:19 -0000	1.25
***************
*** 171,175 ****
  #endif
  	process_attributes = attr;
! 	setupfun();
  }
  
--- 171,187 ----
  #endif
  	process_attributes = attr;
! 
!     try {
! 	    setupfun();
!     }
!     catch(std::exception &x) {
!         error("%s - Exception at library setup: %s",name,x.what());
!     }
!     catch(const char *txt) {
!     	error("%s - Exception at library setup: %s",name,txt);
!     }
!     catch(...) {
!     	error("%s - Unknown exception at library setup",name);
!     }
  }
  
***************
*** 288,293 ****
  	}
  
! 	// call class setup function
!     setupfun(clid);
  }
  	
--- 300,316 ----
  	}
  
!     try {
! 	    // call class setup function
!         setupfun(clid);
!     }
!     catch(std::exception &x) {
!         error("%s - Exception while initializing class: %s",idname,x.what());
!     }
!     catch(const char *txt) {
!     	error("%s - Exception while initializing class: %s",idname,txt);
!     }
!     catch(...) {
!     	error("%s - Unknown exception while initializing class",idname);
!     }
  }
  	
***************
*** 371,433 ****
  		}
  
  		if(ok) {
! 			t_classid clid;
  
  #if FLEXT_SYS == FLEXT_SYS_PD
! 			clid = lo->clss;
! 			obj = (flext_hdr *)::pd_new(lo->clss);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 			clid = lo;
! 			obj = (flext_hdr *)::newobject(lo->clss);
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
! 			clid = lo->clss;
  #else
  #error
  #endif
  
! 			flext_obj::m_holder = obj;
! 			flext_obj::m_holdname = s;
! 			flext_obj::m_holdattr = lo->attr;
  
! 			// get actual flext object (newfun calls "new flext_obj()")
! 			if(lo->argc >= 0)
! 				obj->data = lo->newfun(lo->argc,args); 
! 			else
! 				obj->data = lo->newfun(argc,argv); 
! 	
! 			flext_obj::m_holder = NULL;
! 			flext_obj::m_holdname = NULL;
! 			flext_obj::m_holdattr = false;
  
! 			ok = obj->data &&
! 				// check constructor exit flag
! 				obj->data->InitOk();
  
! 			if(ok) {
! 				if(lo->attr) {
! 					// DON'T convert eventual patcher args here... this is done by the actual attribute stuff
! 					// so that the initial $- or #- be preserved!
  
! 					// store creation args for attribute initialization (inside flext_base::Init())
! 					flext_obj::m_holdaargc = _argc_-argc;
! 					flext_obj::m_holdaargv = argv+argc;
! 				}
! 				else {
! 					flext_obj::m_holdaargc = 0;
! 					flext_obj::m_holdaargv = NULL;
! 				}
  
! 				// call virtual init function 
! 				// here, inlets, outlets, methods and attributes can be set up
! 				ok = obj->data->Init();
  
! 				// call another virtual init function 
! 				if(ok) ok = obj->data->Finalize();
  
! 				flext_obj::m_holdaargc = 0;
! 				flext_obj::m_holdaargv = NULL;
! 			}
  
! 			if(!ok) { 
  				// there was some init error, free object
  				lo->freefun(obj); 
--- 394,472 ----
  		}
  
+ 
  		if(ok) {
!             try {
! 			    t_classid clid;
  
  #if FLEXT_SYS == FLEXT_SYS_PD
! 			    clid = lo->clss;
! 			    obj = (flext_hdr *)::pd_new(lo->clss);
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 			    clid = lo;
! 			    obj = (flext_hdr *)::newobject(lo->clss);
  #elif FLEXT_SYS == FLEXT_SYS_JMAX
! 			    clid = lo->clss;
  #else
  #error
  #endif
  
!                 flext_obj::m_holder = obj;
! 			    flext_obj::m_holdname = s;
! 			    flext_obj::m_holdattr = lo->attr;
  
! 			    // get actual flext object (newfun calls "new flext_obj()")
! 			    if(lo->argc >= 0)
! 				    obj->data = lo->newfun(lo->argc,args); 
! 			    else
! 				    obj->data = lo->newfun(argc,argv); 
!     	
! 			    flext_obj::m_holder = NULL;
! 			    flext_obj::m_holdname = NULL;
! 			    flext_obj::m_holdattr = false;
  
! 			    ok = obj->data &&
! 				    // check constructor exit flag
! 				    obj->data->InitOk();
  
! 			    if(ok) {
! 				    if(lo->attr) {
! 					    // DON'T convert eventual patcher args here... this is done by the actual attribute stuff
! 					    // so that the initial $- or #- be preserved!
  
! 					    // store creation args for attribute initialization (inside flext_base::Init())
! 					    flext_obj::m_holdaargc = _argc_-argc;
! 					    flext_obj::m_holdaargv = argv+argc;
! 				    }
! 				    else {
! 					    flext_obj::m_holdaargc = 0;
! 					    flext_obj::m_holdaargv = NULL;
! 				    }
  
! 				    // call virtual init function 
! 				    // here, inlets, outlets, methods and attributes can be set up
! 				    ok = obj->data->Init();
  
! 				    // call another virtual init function 
! 				    if(ok) ok = obj->data->Finalize();
  
! 				    flext_obj::m_holdaargc = 0;
! 				    flext_obj::m_holdaargv = NULL;
! 			    }
  
!             } //try
!             catch(std::exception &x) {
!                 error("%s - Exception while creating object: %s",GetString(s),x.what());
!                 ok = false;
!             }
!             catch(const char *txt) {
!     		    error("%s - Exception while creating object: %s",GetString(s),txt);
!                 ok = false;
!             }
!             catch(...) {
!     		    error("%s - Unknown exception while creating object",GetString(s));
!                 ok = false;
!             }
! 
!             if(!ok) { 
  				// there was some init error, free object
  				lo->freefun(obj); 
***************
*** 461,469 ****
  
  	if(lcl) {
! 		// call virtual exit function
! 		hdr->data->Exit();
  
! 		// now call object destructor and deallocate
! 		lcl->freefun(hdr);
  	}
  #ifdef FLEXT_DEBUG
--- 500,519 ----
  
  	if(lcl) {
!         try {
! 		    // call virtual exit function
! 		    hdr->data->Exit();
  
! 		    // now call object destructor and deallocate
! 		    lcl->freefun(hdr);
!         } //try
!         catch(std::exception &x) {
!             error("%s - Exception while destroying object: %s",GetString(name),x.what());
!         }
!         catch(const char *txt) {
!     		error("%s - Exception while destroying object: %s",GetString(name),txt);
!         }
!         catch(...) {
!     		error("%s - Unknown exception while destroying object",GetString(name));
!         }
  	}
  #ifdef FLEXT_DEBUG

Index: flstdc.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flstdc.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -C2 -d -r1.22 -r1.23
*** flstdc.h	23 Apr 2004 02:32:55 -0000	1.22
--- flstdc.h	21 Jun 2004 13:58:19 -0000	1.23
***************
*** 100,107 ****
--- 100,112 ----
  
  
+ // necessary for the old OS9 SDK
+ extern "C" {	    	    	    
+ 
  #include "ext.h"
  #include "ext_user.h"
  #include "z_dsp.h"
  
+ } // extern "C"
+ 
  #undef WIN_VERSION
  

Index: flitem.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flitem.cpp,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** flitem.cpp	6 Mar 2004 03:25:48 -0000	1.11
--- flitem.cpp	21 Jun 2004 13:58:19 -0000	1.12
***************
*** 19,23 ****
  flext_base::Item::~Item()
  {
! 	if(nxt) delete nxt;
  }
  
--- 19,23 ----
  flext_base::Item::~Item()
  {
!     if(nxt) delete nxt;
  }
  
***************
*** 26,60 ****
  flext_base::ItemSet::~ItemSet()
  {
! 	for(iterator it = begin(); it != end(); ++it)
! 		if(it.data()) delete it.data();
  }
  
  flext_base::ItemCont::ItemCont(): 
! 	memsize(0),size(0),members(0),cont(NULL)
  {}
  
  flext_base::ItemCont::~ItemCont()
  {
! 	if(cont) {
! 		for(int i = 0; i < size; ++i) delete cont[i];
! 		delete[] cont;
! 	}
  }
  
  void flext_base::ItemCont::Resize(int nsz)
  {
! 	if(nsz > memsize) {
! 		int nmemsz = nsz+10;  // increment maximum allocation size
! 		ItemSet **ncont = new ItemSet *[nmemsz]; // make new array
! 		if(cont) {
! 			memcpy(ncont,cont,size*sizeof(*cont)); // copy existing entries
! 			delete[] cont; 
! 		}
! 		cont = ncont;  // set current array
! 		memsize = nmemsz;  // set new allocation size
! 	}
  
! 	// make new items
! 	while(size < nsz) cont[size++] = new ItemSet;
  }
  
--- 26,60 ----
  flext_base::ItemSet::~ItemSet()
  {
!     for(iterator it = begin(); it != end(); ++it)
!         if(it.data()) delete it.data();
  }
  
  flext_base::ItemCont::ItemCont(): 
!     memsize(0),size(0),members(0),cont(NULL)
  {}
  
  flext_base::ItemCont::~ItemCont()
  {
!     if(cont) {
!         for(int i = 0; i < size; ++i) delete cont[i];
!         delete[] cont;
!     }
  }
  
  void flext_base::ItemCont::Resize(int nsz)
  {
!     if(nsz > memsize) {
!         int nmemsz = nsz+10;  // increment maximum allocation size
!         ItemSet **ncont = new ItemSet *[nmemsz]; // make new array
!         if(cont) {
!             memcpy(ncont,cont,size*sizeof(*cont)); // copy existing entries
!             delete[] cont; 
!         }
!         cont = ncont;  // set current array
!         memsize = nmemsz;  // set new allocation size
!     }
  
!     // make new items
!     while(size < nsz) cont[size++] = new ItemSet;
  }
  
***************
*** 63,73 ****
      if(!Contained(inlet)) Resize(inlet+2);
      ItemSet &set = GetInlet(inlet);
! 	Item *&lst = set[tag];
! 	if(!lst) 
! 		lst = item;
! 	else
! 		for(;;)
! 			if(!lst->nxt) {	lst->nxt = item; break;	}
! 			else lst = lst->nxt;
      members++;
  }
--- 63,73 ----
      if(!Contained(inlet)) Resize(inlet+2);
      ItemSet &set = GetInlet(inlet);
!     Item *&lst = set[tag];
!     if(!lst) 
!         lst = item;
!     else
!         for(;;)
!             if(!lst->nxt) { lst->nxt = item; break; }
!             else lst = lst->nxt;
      members++;
  }
***************
*** 81,87 ****
              for(Item *lit = it.data(),*prv = NULL; lit; prv = lit,lit = lit->nxt) {
                  if(lit == item) {
! 					if(prv) prv->nxt = lit->nxt;
! 					else it.data() = lit->nxt;
! 				
                      lit->nxt = NULL; delete lit;
                      return true;
--- 81,87 ----
              for(Item *lit = it.data(),*prv = NULL; lit; prv = lit,lit = lit->nxt) {
                  if(lit == item) {
!                     if(prv) prv->nxt = lit->nxt;
!                     else it.data() = lit->nxt;
!                 
                      lit->nxt = NULL; delete lit;
                      return true;

Index: flcwmax.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flcwmax.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** flcwmax.h	23 May 2003 18:34:12 -0000	1.7
--- flcwmax.h	21 Jun 2004 13:58:19 -0000	1.8
***************
*** 17,21 ****
  
  #ifndef __MWERKS__
! 	#error "This header file is for CodeWarrior only."
  #endif
  
--- 17,21 ----
  
  #ifndef __MWERKS__
!     #error "This header file is for CodeWarrior only."
  #endif
  
***************
*** 24,33 ****
   
  #ifndef _CW_NOPRECOMP
! 	#include <MacHeaders.h>
  #endif
  
  #if /*__option(sym) ||*/ !__option(opt_dead_code)
! 	#pragma message("Optimization disabled -> Compiling a debug version (with FLEXT_DEBUG)")
! 	#define FLEXT_DEBUG
  #endif
  
--- 24,33 ----
   
  #ifndef _CW_NOPRECOMP
!     #include <MacHeaders.h>
  #endif
  
  #if /*__option(sym) ||*/ !__option(opt_dead_code)
!     #pragma message("Optimization disabled -> Compiling a debug version (with FLEXT_DEBUG)")
!     #define FLEXT_DEBUG
  #endif
  

Index: flatom_pr.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/flatom_pr.cpp,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -d -r1.17 -r1.18
*** flatom_pr.cpp	26 Mar 2004 03:22:11 -0000	1.17
--- flatom_pr.cpp	21 Jun 2004 13:58:19 -0000	1.18
***************
*** 26,79 ****
  bool flext::PrintAtom(const t_atom &a,char *buf,int bufsz)
  {
! 	bool ok = true;
! 	if(IsFloat(a)) {
! 		STD::snprintf(buf,bufsz,"%g",GetFloat(a));
! 	}
! 	else if(IsInt(a)) {
! 		STD::snprintf(buf,bufsz,"%i",GetInt(a));
! 	}
! 	else if(IsSymbol(a)) {
          if(!FLEXT_ASSERT(GetSymbol(a))) *buf = 0;
          else 
              STD::strncpy(buf,GetString(a),bufsz);
! 	}
! 	else if(IsPointer(a)) {
! 		STD::snprintf(buf,bufsz,"%p",GetPointer(a));
! 	}
  #if FLEXT_SYS == FLEXT_SYS_PD
! 	else if(a.a_type == A_DOLLAR) {
! 		STD::snprintf(buf,bufsz,"$%d",a.a_w.w_index);
! 	}
! 	else if(a.a_type == A_DOLLSYM) {
! 		STD::snprintf(buf,bufsz,"$%s",GetString(a));
! 	}
  #elif FLEXT_SYS == FLEXT_SYS_MAX
! 	else if(a.a_type == A_DOLLAR) {
! 		STD::snprintf(buf,bufsz,"$%d",a.a_w.w_long);
! 	}
  #else
  //#pragma message("Not implemented")
  #endif
! 	else {
          error("flext: atom type unknown");
! 		ok = false;
! 	}
! 	return ok;
  }
  
  bool flext::PrintList(int argc,const t_atom *argv,char *buf,int bufsz)
  {
! 	bool ok = true;
      for(int i = 0; ok && i < argc && bufsz > 0; ++i) {
! 		if(i) { *(buf++) = ' '; --bufsz; } // prepend space
  
! 		if(PrintAtom(argv[i],buf,bufsz)) {
! 			int len = strlen(buf);
! 			buf += len,bufsz -= len;
! 		}
! 		else
! 			ok = false;
      }
! 	*buf = 0;
      return ok;
  }
--- 26,79 ----
  bool flext::PrintAtom(const t_atom &a,char *buf,int bufsz)
  {
!     bool ok = true;
!     if(IsFloat(a)) {
!         STD::snprintf(buf,bufsz,"%g",GetFloat(a));
!     }
!     else if(IsInt(a)) {
!         STD::snprintf(buf,bufsz,"%i",GetInt(a));
!     }
!     else if(IsSymbol(a)) {
          if(!FLEXT_ASSERT(GetSymbol(a))) *buf = 0;
          else 
              STD::strncpy(buf,GetString(a),bufsz);
!     }
!     else if(IsPointer(a)) {
!         STD::snprintf(buf,bufsz,"%p",GetPointer(a));
!     }
  #if FLEXT_SYS == FLEXT_SYS_PD
!     else if(a.a_type == A_DOLLAR) {
!         STD::snprintf(buf,bufsz,"$%d",a.a_w.w_index);
!     }
!     else if(a.a_type == A_DOLLSYM) {
!         STD::snprintf(buf,bufsz,"$%s",GetString(a));
!     }
  #elif FLEXT_SYS == FLEXT_SYS_MAX
!     else if(a.a_type == A_DOLLAR) {
!         STD::snprintf(buf,bufsz,"$%d",a.a_w.w_long);
!     }
  #else
  //#pragma message("Not implemented")
  #endif
!     else {
          error("flext: atom type unknown");
!         ok = false;
!     }
!     return ok;
  }
  
  bool flext::PrintList(int argc,const t_atom *argv,char *buf,int bufsz)
  {
!     bool ok = true;
      for(int i = 0; ok && i < argc && bufsz > 0; ++i) {
!         if(i) { *(buf++) = ' '; --bufsz; } // prepend space
  
!         if(PrintAtom(argv[i],buf,bufsz)) {
!             int len = strlen(buf);
!             buf += len,bufsz -= len;
!         }
!         else
!             ok = false;
      }
!     *buf = 0;
      return ok;
  }
***************
*** 82,118 ****
  bool flext::ScanAtom(t_atom &a,const char *buf)
  {
! 	// skip whitespace
! 	while(*buf && isspace(*buf)) ++buf;
! 	if(!*buf) return false;
  
! 	char tmp[1024];
! 	strcpy(tmp,buf);
! 	char *c = tmp;
  
! 	// check for word type (s = 0,1,2 ... int,float,symbol)
! 	int s = 0;
! 	for(; *c && !isspace(*c); ++c) {
! 		if(!isdigit(*c)) 
! 			s = (*c != '.' || s == 1)?2:1;
! 	}
  
! 	switch(s) {
! 	case 0: // integer
  #if FLEXT_SYS == FLEXT_SYS_MAX
! 		SetInt(a,atol(tmp));
! 		break;
  #endif
! 	case 1: // float
! 		SetFloat(a,(float)atof(tmp));
! 		break;
! 	default: { // anything else is a symbol
! 		char t = *c; *c = 0;
! 		SetString(a,tmp);
! 		*c = t;
! 		break;
! 	}
! 	}
  
! 	return true;
  }
  
--- 82,118 ----
  bool flext::ScanAtom(t_atom &a,const char *buf)
  {
!     // skip whitespace
!     while(*buf && isspace(*buf)) ++buf;
!     if(!*buf) return false;
  
!     char tmp[1024];
!     strcpy(tmp,buf);
!     char *c = tmp;
  
!     // check for word type (s = 0,1,2 ... int,float,symbol)
!     int s = 0;
!     for(; *c && !isspace(*c); ++c) {
!         if(!isdigit(*c)) 
!             s = (*c != '.' || s == 1)?2:1;
!     }
  
!     switch(s) {
!     case 0: // integer
  #if FLEXT_SYS == FLEXT_SYS_MAX
!         SetInt(a,atol(tmp));
!         break;
  #endif
!     case 1: // float
!         SetFloat(a,(float)atof(tmp));
!         break;
!     default: { // anything else is a symbol
!         char t = *c; *c = 0;
!         SetString(a,tmp);
!         *c = t;
!         break;
!     }
!     }
  
!     return true;
  }
  

Index: fldefs_methcall.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/fldefs_methcall.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** fldefs_methcall.h	12 Dec 2003 03:32:56 -0000	1.2
--- fldefs_methcall.h	21 Jun 2004 13:58:19 -0000	1.3
***************
*** 18,24 ****
  
  
! /*!	\defgroup FLEXT_D_CALLMETHOD Call flext methods manually
      \ingroup FLEXT_D_METHOD
! 	@{ 
  */
  
--- 18,24 ----
  
  
! /*! \defgroup FLEXT_D_CALLMETHOD Call flext methods manually
      \ingroup FLEXT_D_METHOD
!     @{ 
  */
  

Index: fldefs_attradd.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/flext/source/fldefs_attradd.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** fldefs_attradd.h	12 Dec 2003 03:32:56 -0000	1.2
--- fldefs_attradd.h	21 Jun 2004 13:58:19 -0000	1.3
***************
*** 18,44 ****
  
  
! /*!	\defgroup FLEXT_D_CADDATTR Announce object attributes at class scope
      \ingroup FLEXT_D_ATTRIB
! 	\note These can only be used at class construction time
! 	@{ 
  */
  
  //! Add handler for a gettable attribute
! #define	FLEXT_CADDATTR_GET(CL,NAME,GFUN) \
  \
  AddAttrib(CL,NAME,(FLEXT_GET_PRE(GFUN)),NULL)
  
  //! Add handler for a settable attribute
! #define	FLEXT_CADDATTR_SET(CL,NAME,SFUN) \
  \
  AddAttrib(CL,NAME,NULL,(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable attribute
! #define	FLEXT_CADDATTR_VAR(CL,NAME,GFUN,SFUN) \
  \
  AddAttrib(CL,NAME,(FLEXT_GET_PRE(GFUN)),(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable attribute
! #define	FLEXT_CADDATTR_VAR1(CL,NAME,FUN) \
  \
  AddAttrib(CL,NAME,(FLEXT_GET_PRE(FUN)),(FLEXT_SET_PRE(FUN)))
--- 18,44 ----
  
  
! /*! \defgroup FLEXT_D_CADDATTR Announce object attributes at class scope
      \ingroup FLEXT_D_ATTRIB
!     \note These can only be used at class construction time
!     @{ 
  */
  
  //! Add handler for a gettable attribute
! #define FLEXT_CADDATTR_GET(CL,NAME,GFUN) \
  \
  AddAttrib(CL,NAME,(FLEXT_GET_PRE(GFUN)),NULL)
  
  //! Add handler for a settable attribute
! #define FLEXT_CADDATTR_SET(CL,NAME,SFUN) \
  \
  AddAttrib(CL,NAME,NULL,(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable attribute
! #define FLEXT_CADDATTR_VAR(CL,NAME,GFUN,SFUN) \
  \
  AddAttrib(CL,NAME,(FLEXT_GET_PRE(GFUN)),(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable attribute
! #define FLEXT_CADDATTR_VAR1(CL,NAME,FUN) \
  \
  AddAttrib(CL,NAME,(FLEXT_GET_PRE(FUN)),(FLEXT_SET_PRE(FUN)))
***************
*** 46,65 ****
  
  //! Add handler for a gettable enum attribute
! #define	FLEXT_CADDATTR_GET_E(CL,NAME,GFUN) \
  \
  AddAttrib(CL,NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(GFUN)),NULL)
  
  //! Add handler for a settable enum attribute
! #define	FLEXT_CADDATTR_SET_E(CL,NAME,SFUN) \
  \
  AddAttrib(CL,NAME,NULL,(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable enum attribute
! #define	FLEXT_CADDATTR_VAR_E(CL,NAME,GFUN,SFUN) \
  \
  AddAttrib(CL,NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(GFUN)),(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable enum attribute
! #define	FLEXT_CADDATTR_VAR1_E(CL,NAME,FUN) \
  \
  AddAttrib(CL,NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(FUN)),(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(FUN)))
--- 46,65 ----
  
  //! Add handler for a gettable enum attribute
! #define FLEXT_CADDATTR_GET_E(CL,NAME,GFUN) \
  \
  AddAttrib(CL,NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(GFUN)),NULL)
  
  //! Add handler for a settable enum attribute
! #define FLEXT_CADDATTR_SET_E(CL,NAME,SFUN) \
  \
  AddAttrib(CL,NAME,NULL,(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable enum attribute
! #define FLEXT_CADDATTR_VAR_E(CL,NAME,GFUN,SFUN) \
  \
  AddAttrib(CL,NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(GFUN)),(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable enum attribute
! #define FLEXT_CADDATTR_VAR1_E(CL,NAME,FUN) \
  \
  AddAttrib(CL,NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(FUN)),(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(FUN)))
***************
*** 68,95 ****
  
  
! /*!	\defgroup FLEXT_D_ADDATTR Announce object attributes 
      \ingroup FLEXT_D_ATTRIB
! 	\note These can only be used at object construction time
! 	\note (in constructor or in Init() function before call to parent's Init())
! 	@{ 
  */
  
  //! Add handler for a gettable attribute
! #define	FLEXT_ADDATTR_GET(NAME,GFUN) \
  \
  AddAttrib(NAME,(FLEXT_GET_PRE(GFUN)),NULL)
  
  //! Add handler for a settable attribute
! #define	FLEXT_ADDATTR_SET(NAME,SFUN) \
  \
  AddAttrib(NAME,NULL,(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable attribute
! #define	FLEXT_ADDATTR_VAR(NAME,GFUN,SFUN) \
  \
  AddAttrib(NAME,(FLEXT_GET_PRE(GFUN)),(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable attribute
! #define	FLEXT_ADDATTR_VAR1(NAME,FUN) \
  \
  AddAttrib(NAME,(FLEXT_GET_PRE(FUN)),(FLEXT_SET_PRE(FUN)))
--- 68,95 ----
  
  
! /*! \defgroup FLEXT_D_ADDATTR Announce object attributes 
      \ingroup FLEXT_D_ATTRIB
!     \note These can only be used at object construction time
!     \note (in constructor or in Init() function before call to parent's Init())
!     @{ 
  */
  
  //! Add handler for a gettable attribute
! #define FLEXT_ADDATTR_GET(NAME,GFUN) \
  \
  AddAttrib(NAME,(FLEXT_GET_PRE(GFUN)),NULL)
  
  //! Add handler for a settable attribute
! #define FLEXT_ADDATTR_SET(NAME,SFUN) \
  \
  AddAttrib(NAME,NULL,(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable attribute
! #define FLEXT_ADDATTR_VAR(NAME,GFUN,SFUN) \
  \
  AddAttrib(NAME,(FLEXT_GET_PRE(GFUN)),(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable attribute
! #define FLEXT_ADDATTR_VAR1(NAME,FUN) \
  \
  AddAttrib(NAME,(FLEXT_GET_PRE(FUN)),(FLEXT_SET_PRE(FUN)))
***************
*** 97,116 ****
  
  //! Add handler for a gettable enum attribute
! #define	FLEXT_ADDATTR_GET_E(NAME,GFUN) \
  \
  AddAttrib(NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(GFUN)),NULL)
  
  //! Add handler for a settable enum attribute
! #define	FLEXT_ADDATTR_SET_E(NAME,SFUN) \
  \
  AddAttrib(NAME,NULL,(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable enum attribute
! #define	FLEXT_ADDATTR_VAR_E(NAME,GFUN,SFUN) \
  \
  AddAttrib(NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(GFUN)),(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable enum attribute
! #define	FLEXT_ADDATTR_VAR1_E(NAME,FUN) \
  \
  AddAttrib(NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(FUN)),(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(FUN)))
--- 97,116 ----
  
  //! Add handler for a gettable enum attribute
! #define FLEXT_ADDATTR_GET_E(NAME,GFUN) \
  \
  AddAttrib(NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(GFUN)),NULL)
  
  //! Add handler for a settable enum attribute
! #define FLEXT_ADDATTR_SET_E(NAME,SFUN) \
  \
  AddAttrib(NAME,NULL,(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable enum attribute
! #define FLEXT_ADDATTR_VAR_E(NAME,GFUN,SFUN) \
  \
  AddAttrib(NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(GFUN)),(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(SFUN)))
  
  //! Add handlers for a both get- and settable enum attribute
! #define FLEXT_ADDATTR_VAR1_E(NAME,FUN) \
  \
  AddAttrib(NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(FUN)),(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(FUN)))





More information about the Pd-cvs mailing list