diff options
author | Hans-Christoph Steiner <eighthave@users.sourceforge.net> | 2006-02-03 23:17:43 +0000 |
---|---|---|
committer | Hans-Christoph Steiner <eighthave@users.sourceforge.net> | 2006-02-03 23:17:43 +0000 |
commit | 3c2fe34f82fb962813798a96290f341fc6d1c03a (patch) | |
tree | 30f58eaf79952a5206ab96f5242cae7f21a39d17 /externals/build/src/list.c | |
parent | 57f713a6e5a6619e6b428c8b47c317e49106497f (diff) |
ok, now its actually working, it needs to be loaded as a lib
svn path=/trunk/; revision=4547
Diffstat (limited to 'externals/build/src/list.c')
-rw-r--r-- | externals/build/src/list.c | 421 |
1 files changed, 0 insertions, 421 deletions
diff --git a/externals/build/src/list.c b/externals/build/src/list.c deleted file mode 100644 index a90a7783..00000000 --- a/externals/build/src/list.c +++ /dev/null @@ -1,421 +0,0 @@ -/* Copyright (c) 1997- Miller Puckette and others. -* For information on usage and redistribution, and for a DISCLAIMER OF ALL -* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ - -#include "m_pd.h" -/* #include <string.h> */ -#ifdef _WIN32 -#include <malloc.h> -#else -#include <alloca.h> -#endif - -extern t_pd *newest; - -#define HAVE_ALLOCA 1 /* LATER this should be set by configure script! */ -#define LIST_NGETBYTE 100 /* bigger that this we use alloc, not alloca */ - -/* the "list" object family. - - list append - append a list to another - list prepend - prepend a list to another - list split - first n elements to first outlet, rest to second outlet - list trim - trim off "list" selector - list length - output number of items in list - list nth - nth item in list, counting from zero - -Not sure we need these: - list cat - build a list by accumulating elements - list foreach - spit out elements of a list one by one - list array - get items from a named array as a list - list reverse - permute elements of a list back to front - list pack - synonym for 'pack' - list unpack - synonym for 'unpack' - list first - output first n elements. - list last - output last n elements -*/ - -/* -------------- utility functions: storage, copying -------------- */ - /* List element for storage. Keep an atom and, in case it's a pointer, - an associated 'gpointer' to protect against stale pointers. */ -typedef struct _listelem -{ - t_atom l_a; - t_gpointer l_p; -} t_listelem; - -typedef struct _alist -{ - t_pd l_pd; /* object to point inlets to */ - int l_n; /* number of items */ - t_listelem *l_vec; /* pointer to items */ -} t_alist; - -#if 0 /* probably won't use this version... */ -#ifdef HAVE_ALLOCA -#define LIST_ALLOCA(x, n) ( \ - (x).l_n = (n), \ - (x).l_vec = (t_listelem *)((n) < LIST_NGETBYTE ? \ - alloca((n) * sizeof(t_listelem)) : getbytes((n) * sizeof(t_listelem)))) \ -#define LIST_FREEA(x) ( \ - ((x).l_n < LIST_NGETBYTE || - (freebytes((x).l_vec, (x).l_n * sizeof(t_listelem)), 0))) - -#else -#define LIST_ALLOCA(x, n) ( \ - (x).l_n = (n), \ - (x).l_vec = (t_listelem *)getbytes((n) * sizeof(t_listelem))) -#define LIST_FREEA(x) (freebytes((x).l_vec, (x).l_n * sizeof(t_listelem))) -#endif -#endif - -#if HAVE_ALLOCA -#define ATOMS_ALLOCA(x, n) ((x) = (t_atom *)((n) < LIST_NGETBYTE ? \ - alloca((n) * sizeof(t_atom)) : getbytes((n) * sizeof(t_atom)))) -#define ATOMS_FREEA(x, n) ( \ - ((n) < LIST_NGETBYTE || (freebytes((x), (n) * sizeof(t_atom)), 0))) -#else -#define ATOMS_ALLOCA(x, n) ((x) = (t_atom *)getbytes((n) * sizeof(t_atom))) -#define ATOMS_FREEA(x, n) (freebytes((x), (n) * sizeof(t_atom))) -#endif - -static void atoms_copy(int argc, t_atom *from, t_atom *to) -{ - int i; - for (i = 0; i < argc; i++) - to[i] = from[i]; -} - -/* ------------- fake class to divert inlets to ----------------- */ - -t_class *alist_class; - -static void alist_init(t_alist *x) -{ - x->l_pd = alist_class; - x->l_n = 0; - x->l_vec = 0; -} - -static void alist_clear(t_alist *x) -{ - int i; - for (i = 0; i < x->l_n; i++) - { - if (x->l_vec[i].l_a.a_type == A_POINTER) - gpointer_unset(x->l_vec[i].l_a.a_w.w_gpointer); - } - if (x->l_vec) - freebytes(x->l_vec, x->l_n * sizeof(*x->l_vec)); -} - -static void alist_list(t_alist *x, t_symbol *s, int argc, t_atom *argv) -{ - int i; - alist_clear(x); - if (!(x->l_vec = (t_listelem *)getbytes(argc * sizeof(*x->l_vec)))) - { - x->l_n = 0; - error("list_alloc: out of memory"); - return; - } - x->l_n = argc; - for (i = 0; i < argc; i++) - { - x->l_vec[i].l_a = argv[i]; - if (x->l_vec[i].l_a.a_type == A_POINTER) - gpointer_copy(x->l_vec[i].l_a.a_w.w_gpointer, &x->l_vec[i].l_p); - } -} - -static void alist_anything(t_alist *x, t_symbol *s, int argc, t_atom *argv) -{ - int i; - alist_clear(x); - if (!(x->l_vec = (t_listelem *)getbytes((argc+1) * sizeof(*x->l_vec)))) - { - x->l_n = 0; - error("list_alloc: out of memory"); - return; - } - x->l_n = argc+1; - SETSYMBOL(&x->l_vec[0].l_a, s); - for (i = 0; i < argc; i++) - { - x->l_vec[i+1].l_a = argv[i]; - if (x->l_vec[i+1].l_a.a_type == A_POINTER) - gpointer_copy(x->l_vec[i+1].l_a.a_w.w_gpointer, &x->l_vec[i+1].l_p); - } -} - -static void alist_toatoms(t_alist *x, t_atom *to) -{ - int i; - for (i = 0; i < x->l_n; i++) - to[i] = x->l_vec[i].l_a; -} - -static void alist_setup(void) -{ - alist_class = class_new(gensym("list inlet"), - 0, 0, sizeof(t_alist), 0, 0); - class_addlist(alist_class, alist_list); - class_addanything(alist_class, alist_anything); -} - -/* ------------- list append --------------------- */ - -t_class *list_append_class; - -typedef struct _list_append -{ - t_object x_obj; - t_alist x_alist; -} t_list_append; - -static void *list_append_new(t_symbol *s, int argc, t_atom *argv) -{ - t_list_append *x = (t_list_append *)pd_new(list_append_class); - alist_init(&x->x_alist); - alist_list(&x->x_alist, 0, argc, argv); - outlet_new(&x->x_obj, &s_list); - inlet_new(&x->x_obj, &x->x_alist.l_pd, 0, 0); - return (x); -} - -static void list_append_list(t_list_append *x, t_symbol *s, - int argc, t_atom *argv) -{ - t_atom *outv; - int n, outc = x->x_alist.l_n + argc; - ATOMS_ALLOCA(outv, outc); - atoms_copy(argc, argv, outv); - alist_toatoms(&x->x_alist, outv+argc); - outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv); - ATOMS_FREEA(outv, outc); -} - -static void list_append_anything(t_list_append *x, t_symbol *s, - int argc, t_atom *argv) -{ - t_atom *outv; - int n, outc = x->x_alist.l_n + argc + 1; - ATOMS_ALLOCA(outv, outc); - SETSYMBOL(outv, s); - atoms_copy(argc, argv, outv + 1); - alist_toatoms(&x->x_alist, outv + 1 + argc); - outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv); - ATOMS_FREEA(outv, outc); -} - -static void list_append_free(t_list_append *x) -{ - alist_clear(&x->x_alist); -} - -static void list_append_setup(void) -{ - list_append_class = class_new(gensym("list append"), - (t_newmethod)list_append_new, (t_method)list_append_free, - sizeof(t_list_append), 0, A_GIMME, 0); - class_addlist(list_append_class, list_append_list); - class_addanything(list_append_class, list_append_anything); - class_sethelpsymbol(list_append_class, &s_list); -} - -/* ------------- list prepend --------------------- */ - -t_class *list_prepend_class; - -typedef struct _list_prepend -{ - t_object x_obj; - t_alist x_alist; -} t_list_prepend; - -static void *list_prepend_new(t_symbol *s, int argc, t_atom *argv) -{ - t_list_prepend *x = (t_list_prepend *)pd_new(list_prepend_class); - alist_init(&x->x_alist); - alist_list(&x->x_alist, 0, argc, argv); - outlet_new(&x->x_obj, &s_list); - inlet_new(&x->x_obj, &x->x_alist.l_pd, 0, 0); - return (x); -} - -static void list_prepend_list(t_list_prepend *x, t_symbol *s, - int argc, t_atom *argv) -{ - t_atom *outv; - int n, outc = x->x_alist.l_n + argc; - ATOMS_ALLOCA(outv, outc); - alist_toatoms(&x->x_alist, outv); - atoms_copy(argc, argv, outv + x->x_alist.l_n); - outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv); - ATOMS_FREEA(outv, outc); -} - -static void list_prepend_anything(t_list_prepend *x, t_symbol *s, - int argc, t_atom *argv) -{ - t_atom *outv; - int n, outc = x->x_alist.l_n + argc + 1; - ATOMS_ALLOCA(outv, outc); - alist_toatoms(&x->x_alist, outv); - SETSYMBOL(outv + x->x_alist.l_n, s); - atoms_copy(argc, argv, outv + x->x_alist.l_n + 1); - outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv); - ATOMS_FREEA(outv, outc); -} - -static void list_prepend_free(t_list_prepend *x) -{ - alist_clear(&x->x_alist); -} - -static void list_prepend_setup(void) -{ - list_prepend_class = class_new(gensym("list prepend"), - (t_newmethod)list_prepend_new, (t_method)list_prepend_free, - sizeof(t_list_prepend), 0, A_GIMME, 0); - class_addlist(list_prepend_class, list_prepend_list); - class_addanything(list_prepend_class, list_prepend_anything); - class_sethelpsymbol(list_prepend_class, &s_list); -} - -/* ------------- list split --------------------- */ - -t_class *list_split_class; - -typedef struct _list_split -{ - t_object x_obj; - t_float x_f; - t_outlet *x_out1; - t_outlet *x_out2; - t_outlet *x_out3; -} t_list_split; - -static void *list_split_new(t_floatarg f) -{ - t_list_split *x = (t_list_split *)pd_new(list_split_class); - x->x_out1 = outlet_new(&x->x_obj, &s_list); - x->x_out2 = outlet_new(&x->x_obj, &s_list); - x->x_out3 = outlet_new(&x->x_obj, &s_list); - floatinlet_new(&x->x_obj, &x->x_f); - x->x_f = f; - return (x); -} - -static void list_split_list(t_list_split *x, t_symbol *s, - int argc, t_atom *argv) -{ - int n = x->x_f; - if (n < 0) - n = 0; - if (argc >= n) - { - outlet_list(x->x_out2, &s_list, argc-n, argv+n); - outlet_list(x->x_out1, &s_list, n, argv); - } - else outlet_list(x->x_out3, &s_list, argc, argv); -} - -static void list_split_anything(t_list_split *x, t_symbol *s, - int argc, t_atom *argv) -{ - t_atom *outv; - ATOMS_ALLOCA(outv, argc+1); - SETSYMBOL(outv, s); - atoms_copy(argc, argv, outv + 1); - list_split_list(x, &s_list, argc+1, outv); - ATOMS_FREEA(outv, argc+1); -} - -static void list_split_setup(void) -{ - list_split_class = class_new(gensym("list split"), - (t_newmethod)list_split_new, 0, - sizeof(t_list_split), 0, A_DEFFLOAT, 0); - class_addlist(list_split_class, list_split_list); - class_addanything(list_split_class, list_split_anything); - class_sethelpsymbol(list_split_class, &s_list); -} - -/* ------------- list trim --------------------- */ - -t_class *list_trim_class; - -typedef struct _list_trim -{ - t_object x_obj; -} t_list_trim; - -static void *list_trim_new( void) -{ - t_list_trim *x = (t_list_trim *)pd_new(list_trim_class); - outlet_new(&x->x_obj, &s_list); - return (x); -} - -static void list_trim_list(t_list_trim *x, t_symbol *s, - int argc, t_atom *argv) -{ - if (argc < 1 || argv[0].a_type != A_SYMBOL) - outlet_list(x->x_obj.ob_outlet, &s_list, argc, argv); - else outlet_anything(x->x_obj.ob_outlet, argv[0].a_w.w_symbol, - argc-1, argv+1); -} - -static void list_trim_anything(t_list_trim *x, t_symbol *s, - int argc, t_atom *argv) -{ - outlet_anything(x->x_obj.ob_outlet, s, argc, argv); -} - -static void list_trim_setup(void) -{ - list_trim_class = class_new(gensym("list trim"), - (t_newmethod)list_trim_new, 0, - sizeof(t_list_trim), 0, 0); - class_addlist(list_trim_class, list_trim_list); - class_addanything(list_trim_class, list_trim_anything); - class_sethelpsymbol(list_trim_class, &s_list); -} - -/* ------------- list ------------------- */ - -static void *list_new(t_pd *dummy, t_symbol *s, int argc, t_atom *argv) -{ - if (!argc || argv[0].a_type != A_SYMBOL) - newest = list_append_new(s, argc, argv); - else - { - t_symbol *s2 = argv[0].a_w.w_symbol; - if (s2 == gensym("append")) - newest = list_append_new(s, argc-1, argv+1); - else if (s2 == gensym("prepend")) - newest = list_prepend_new(s, argc-1, argv+1); - else if (s2 == gensym("split")) - newest = list_split_new(atom_getfloatarg(1, argc, argv)); - else if (s2 == gensym("trim")) - newest = list_trim_new(); - else - { - error("list %s: unknown function", s2->s_name); - newest = 0; - } - } - return (newest); -} - -void list_setup(void) -{ - alist_setup(); - list_append_setup(); - list_prepend_setup(); - list_split_setup(); - list_trim_setup(); - class_addcreator((t_newmethod)list_new, &s_list, A_GIMME, 0); - post("Info: this [list] has been backported from Pd 0.39.2"); -} |