Max 5 API Reference
00001 /** 00002 @file 00003 iter - sequential list unpacking 00004 00005 updated 3/22/09 ajm: new API 00006 00007 @ingroup examples 00008 */ 00009 00010 #include "ext.h" 00011 #include "ext_obex.h" 00012 #include "ext_common.h" 00013 00014 typedef struct iter { 00015 t_object i_ob; 00016 t_atom *i_av; 00017 short i_ac; 00018 } t_iter; 00019 00020 t_symbol *ps_bang; 00021 void *iter_class; 00022 00023 void iter_assist(t_iter *x, void *b, long m, long a, char *s); 00024 void iter_int(t_iter *x, long n); 00025 void iter_float(t_iter *x, double f); 00026 void iter_bang(t_iter *x); 00027 void iter_list(t_iter *x, t_symbol *s, short ac, t_atom *av); 00028 void iter_anything(t_iter *x, t_symbol *s, short ac, t_atom *av); 00029 void *iter_new(long dummy); 00030 void iter_free(t_iter *x); 00031 void iter_resize(t_iter *x, long size); 00032 00033 int main() 00034 { 00035 t_class *c; 00036 00037 c = class_new("iter", (method)iter_new, (method)iter_free, (short)sizeof(t_iter), 0L, A_DEFLONG, 0); 00038 class_addmethod(c, (method)iter_int, "int", A_LONG, 0); 00039 class_addmethod(c, (method)iter_bang, "bang", 0); 00040 class_addmethod(c, (method)iter_list, "list", A_GIMME, 0); 00041 class_addmethod(c, (method)iter_anything, "anything", A_GIMME, 0); 00042 class_addmethod(c, (method)iter_assist, "assist", A_CANT, 0); 00043 class_addmethod(c, (method)iter_float, "float", A_FLOAT, 0); 00044 class_register(CLASS_BOX, c); 00045 iter_class = c; 00046 00047 ps_bang = gensym("bang"); 00048 00049 return 0; 00050 } 00051 00052 void iter_assist(t_iter *x, void *b, long m, long a, char *s) 00053 { 00054 if (m == ASSIST_INLET) 00055 sprintf(s,"list to be Unraveled"); 00056 else 00057 sprintf(s,"Sequential Output of Incoming list"); 00058 } 00059 00060 void iter_int(t_iter *x, long n) 00061 { 00062 iter_resize(x,1); 00063 x->i_ac = 1; 00064 atom_setlong(x->i_av,n); 00065 outlet_int(x->i_ob.o_outlet,n); 00066 } 00067 00068 void iter_float(t_iter *x, double f) 00069 { 00070 iter_resize(x,1); 00071 x->i_ac = 1; 00072 atom_setfloat(x->i_av,f); 00073 outlet_float(x->i_ob.o_outlet,f); 00074 } 00075 00076 void iter_bang(t_iter *x) 00077 { 00078 short i; 00079 t_atom *av; 00080 00081 for (i=0, av = x->i_av; i < x->i_ac; i++,av++) { 00082 if (atom_gettype(av) == A_LONG) 00083 outlet_int(x->i_ob.o_outlet,atom_getlong(av)); 00084 else if (atom_gettype(av) == A_FLOAT) 00085 outlet_float(x->i_ob.o_outlet,atom_getfloat(av)); 00086 else if (atom_gettype(av) == A_SYM) 00087 outlet_anything(x->i_ob.o_outlet,atom_getsym(av),0,0); 00088 } 00089 } 00090 00091 void iter_list(t_iter *x, Symbol *s, short ac, Atom *av) 00092 { 00093 short i; 00094 00095 iter_resize(x,ac); 00096 for (i=0; i < ac; i++,av++) { 00097 x->i_av[i] = *av; 00098 if (atom_gettype(av)==A_LONG) 00099 outlet_int(x->i_ob.o_outlet,atom_getlong(av)); 00100 else if (atom_gettype(av)==A_FLOAT) 00101 outlet_float(x->i_ob.o_outlet,atom_getfloat(av)); 00102 else if (atom_gettype(av)==A_SYM) 00103 outlet_anything(x->i_ob.o_outlet,atom_getsym(av),0,0); 00104 } 00105 x->i_ac = ac; 00106 } 00107 00108 void iter_anything(t_iter *x, Symbol *s, short ac, Atom *av) 00109 { 00110 short i; 00111 00112 iter_resize(x,ac+1); 00113 outlet_anything(x->i_ob.o_outlet,s,0,0); 00114 x->i_av[0].a_w.w_sym = s; 00115 x->i_av[0].a_type = A_SYM; 00116 for (i=0; i < ac; i++,av++) { 00117 x->i_av[i+1] = *av; 00118 if (atom_gettype(av)==A_LONG) 00119 outlet_int(x->i_ob.o_outlet,atom_getlong(av)); 00120 else if (atom_gettype(av)==A_FLOAT) 00121 outlet_float(x->i_ob.o_outlet,atom_getfloat(av)); 00122 else if (atom_gettype(av)==A_SYM) 00123 outlet_anything(x->i_ob.o_outlet,atom_getsym(av),0,0); 00124 } 00125 x->i_ac = ac+1; 00126 } 00127 00128 void *iter_new(long dummy) 00129 { 00130 t_iter *x; 00131 00132 x = object_alloc(iter_class); 00133 x->i_ac = 0; 00134 x->i_av = NULL; 00135 outlet_new(x,0L); 00136 return x; 00137 } 00138 00139 void iter_free(t_iter *x) 00140 { 00141 if (x->i_av) 00142 sysmem_freeptr(x->i_av); 00143 } 00144 00145 void iter_resize(t_iter *x, long size) 00146 { 00147 if (size!=x->i_ac) { 00148 if (x->i_av) 00149 sysmem_freeptr(x->i_av); 00150 if (size) 00151 x->i_av = (t_atom *)sysmem_newptr(size*sizeof(t_atom)); 00152 else 00153 x->i_av = NULL; 00154 x->i_ac = size; 00155 } 00156 }
Copyright © 2008, Cycling '74