/* iter.c -- sequential list unpacking ------- */ #include "ext.h" #include "ext_common.h" #define MAXSIZE 256 typedef struct iter { t_object i_ob; t_atom i_av[MAXSIZE]; short i_ac; } t_iter; t_symbol *ps_bang; void *iter_class; void iter_assist(t_iter *x, void *b, long m, long a, char *s); void iter_int(t_iter *x, long n); void iter_float(t_iter *x, double f); void iter_bang(t_iter *x); void iter_list(t_iter *x, t_symbol *s, short ac, t_atom *av); void iter_anything(t_iter *x, t_symbol *s, short ac, t_atom *av); void *iter_new(long dummy); void main() { setup((t_messlist **)&iter_class, (method)iter_new,0L, (short)sizeof(t_iter), 0L, A_DEFLONG, 0); addint((method)iter_int); addbang((method)iter_bang); addmess((method)iter_list,"list", A_GIMME, 0); addmess((method)iter_anything,"anything",A_GIMME,0); addmess((method)iter_assist,"assist",A_CANT,0); addfloat((method)iter_float); ps_bang = gensym("bang"); finder_addclass("Lists","iter"); rescopy('STR#',3005); } void iter_assist(t_iter *x, void *b, long m, long a, char *s) { assist_string(3005,m,a,1,2,s); } void iter_int(t_iter *x, long n) { x->i_ac = 1; SETLONG(x->i_av,n); outlet_int(x->i_ob.o_outlet,n); } void iter_float(t_iter *x, double f) { long n; x->i_ac = 1; SETFLOAT(x->i_av,f); outlet_float(x->i_ob.o_outlet,f); } void iter_bang(t_iter *x) { short i; t_atom *av; for (i=0, av = x->i_av; i < x->i_ac; i++,av++) { if (av->a_type == A_LONG) outlet_int(x->i_ob.o_outlet,av->a_w.w_long); else if (av->a_type == A_FLOAT) outlet_float(x->i_ob.o_outlet,av->a_w.w_float); else if (av->a_type == A_SYM) outlet_anything(x->i_ob.o_outlet,av->a_w.w_sym,0,0); } } void iter_list(t_iter *x, Symbol *s, short ac, Atom *av) { short i,k; long n; ac = MIN(ac,MAXSIZE); for (i=0; i < ac; i++,av++) { x->i_av[i] = *av; if (av->a_type==A_LONG) outlet_int(x->i_ob.o_outlet,av->a_w.w_long); else if (av->a_type==A_FLOAT) outlet_float(x->i_ob.o_outlet,av->a_w.w_float); else if (av->a_type==A_SYM) outlet_anything(x->i_ob.o_outlet,av->a_w.w_sym,0,0); } x->i_ac = ac; } void iter_anything(t_iter *x, Symbol *s, short ac, Atom *av) { short i,k; long n; outlet_anything(x->i_ob.o_outlet,s,0,0); x->i_av[0].a_w.w_sym = s; x->i_av[0].a_type = A_SYM; ac = MIN(ac,MAXSIZE-1); for (i=0; i < ac; i++,av++) { x->i_av[i+1] = *av; if (av->a_type==A_LONG) outlet_int(x->i_ob.o_outlet,av->a_w.w_long); else if (av->a_type==A_FLOAT) outlet_float(x->i_ob.o_outlet,av->a_w.w_float); else if (av->a_type==A_SYM) outlet_anything(x->i_ob.o_outlet,av->a_w.w_sym,0,0); } x->i_ac = ac+1; } void *iter_new(long dummy) { t_iter *x; short i; x = (t_iter *)newobject(iter_class); x->i_ac = 0; for (i=0; i < MAXSIZE; i++) SETLONG(x->i_av+i,0); outlet_new(x,0L); return x; }