From 128745865016d5dcfee8441564c4cc13dd82100e Mon Sep 17 00:00:00 2001 From: Ed Kelly Date: Sat, 15 Sep 2012 13:21:23 +0000 Subject: Version 0.1.4 of ekext, gemnotes v0.2.3 svn path=/trunk/externals/ekext/; revision=16234 --- ninjalist.c | 200 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100755 ninjalist.c (limited to 'ninjalist.c') diff --git a/ninjalist.c b/ninjalist.c new file mode 100755 index 0000000..11f43de --- /dev/null +++ b/ninjalist.c @@ -0,0 +1,200 @@ +/* takes a map like 0 1 3 4 7 and only returns the number if it is present */ +/* in the map. */ +#include "m_pd.h" +#define MAXENTRIES 1024 +#define LASTENTRY 1023 + +static t_class *ninjalist_class; + +typedef struct _map +{ + t_atom map[MAXENTRIES]; + t_atom nomap[MAXENTRIES]; +} t_map; + +typedef struct _ninjalist +{ + t_object x_obj; + t_map x_map; + t_float input, max, outmap; + t_outlet *mapped, *value, *mapout, *inst; +} t_ninjalist; + +void ninjalist_float(t_ninjalist *x, t_floatarg fin) +{ + int arg = 0; + float test = 0; + x->input = arg = fin; + test = atom_getfloatarg(arg, MAXENTRIES, x->x_map.map); + outlet_bang(x->inst); + outlet_float(x->value, test); + outlet_float(x->mapped, arg); +} + +void ninjalist_set(t_ninjalist *x, t_floatarg fmap, t_floatarg fval) /* set one value + in the array */ +{ + float fvaller; + if(fmap < MAXENTRIES && fmap >= 0) + { + int imap = (int)fmap; + fvaller = fval != 0 ? 0 : 1; + SETFLOAT(&x->x_map.map[imap], fval); + SETFLOAT(&x->x_map.nomap[imap], fvaller); + x->max = fmap > x->max ? fmap : x->max; + } +} + +void ninjalist_delete(t_ninjalist *x, t_floatarg loc) /* remove a value */ +{ + int addloc = (int)loc + 1; + int maxentry = (int)x->max; + int i; + float buffer; + if(locmax && loc>=0) + { + for(i=addloc;i<=maxentry;i++) + { + buffer = atom_getfloatarg(i,MAXENTRIES,x->x_map.map); + SETFLOAT(&x->x_map.map[i-1],buffer); + if(buffer!=0) + { + SETFLOAT(&x->x_map.nomap[i-1],0); + } + else + { + SETFLOAT(&x->x_map.nomap[i-1],1); + } + } + SETFLOAT(&x->x_map.map[maxentry],0); + x->max--; + } + else if(loc==x->max) + { + x->max--; + SETFLOAT(&x->x_map.map[maxentry],0); + } +} + +void ninjalist_insert(t_ninjalist *x, t_floatarg loc, t_floatarg val) +/* insert a value at specific location, moving subsequent values up */ +{ + int location = (int)loc; + int maxentry = (int)x->max+1; + int i; + float buffer; + if(loc>=0 && maxentry < MAXENTRIES) + { + for(i=maxentry;i>=location;i--) + { + buffer = atom_getfloatarg(i-1,MAXENTRIES,x->x_map.map); + SETFLOAT(&x->x_map.map[i],buffer); + if(buffer!=0) + { + SETFLOAT(&x->x_map.nomap[i],0); + } + else + { + SETFLOAT(&x->x_map.nomap[i],1); + } + } + x->max++; + SETFLOAT(&x->x_map.map[location], val); + if(val) + { + SETFLOAT(&x->x_map.nomap[location],0); + } + else + { + SETFLOAT(&x->x_map.nomap[location],1); + } + } +} + +void ninjalist_get(t_ninjalist *x, t_floatarg inv) /* outlet to map or inverse */ +{ + if(inv!=0) + { + outlet_list(x->mapout, gensym("list"), x->max+1, x->x_map.nomap); + } + else outlet_list(x->mapout, gensym("list"), x->max+1, x->x_map.map); + x->outmap = inv; +} + +void ninjalist_clear(t_ninjalist *x) +{ + int i; + for(i=0;ix_map.map[i], 0); + SETFLOAT(&x->x_map.nomap[i], 1); + } + x->max = 0; +} + +void ninjalist_map(t_ninjalist *x, t_symbol *s, int argc, t_atom *argv) /* set the whole map */ +{ + int i; + for(i=0;ix_map.map+i, 0); + SETFLOAT(x->x_map.nomap+i, 1); + } + x->max = 0; + float arg; + for(i=0;ix_map.map[i], arg); + SETFLOAT(&x->x_map.nomap[i], 0); + x->max = i; + } + } + if (x->max > 0 && x->outmap == 0) + { + outlet_list(x->mapout, gensym("list"), x->max+1, x->x_map.map); + } + else if (x->max > 0 && x->outmap == 1) + { + outlet_list(x->mapout, gensym("list"), x->max+1, x->x_map.nomap); + } +} + +void *ninjalist_new(t_floatarg f) +{ + t_ninjalist *x = (t_ninjalist *)pd_new(ninjalist_class); + x->max = 0; + x->outmap = 0; + int i; + for(i=0;ix_map.map+i, 0); + SETFLOAT(x->x_map.nomap+i, 1); + } + x->mapped = outlet_new(&x->x_obj, &s_float); + x->value = outlet_new(&x->x_obj, &s_float); + x->mapout = outlet_new(&x->x_obj, &s_list); + x->inst = outlet_new(&x->x_obj, &s_bang); + return (void *)x; +} + +void ninjalist_setup(void) +{ + ninjalist_class = class_new(gensym("ninjalist"), + (t_newmethod)ninjalist_new, + 0, sizeof(t_ninjalist), + 0, A_DEFFLOAT, 0); + post("|^^^^^^^^^^^ninjalist^^^^^^^^^^^|"); + post("|->^^^integer map to floats^^^<-|"); + post("|^^^^^^^Edward Kelly 2012^^^^^^^|"); + + class_addfloat(ninjalist_class, ninjalist_float); + class_addmethod(ninjalist_class, (t_method)ninjalist_set, gensym("set"), A_DEFFLOAT, A_DEFFLOAT, 0); + class_addmethod(ninjalist_class, (t_method)ninjalist_map, gensym("map"), A_GIMME, 0); + class_addmethod(ninjalist_class, (t_method)ninjalist_clear, gensym("clear"), A_DEFFLOAT, 0); + class_addmethod(ninjalist_class, (t_method)ninjalist_get, gensym("get"), A_DEFFLOAT, 0); + class_addmethod(ninjalist_class, (t_method)ninjalist_delete, gensym("delete"), A_DEFFLOAT, 0); + class_addmethod(ninjalist_class, (t_method)ninjalist_insert, gensym("insert"), A_DEFFLOAT, A_DEFFLOAT, 0); +} -- cgit v1.2.1