[PD-cvs] SF.net SVN: pure-data:[10670] trunk/externals/mrpeach/tab2flist/tab2flist.c
mrpeach at users.sourceforge.net
mrpeach at users.sourceforge.net
Wed Jan 28 22:45:26 CET 2009
Revision: 10670
http://pure-data.svn.sourceforge.net/pure-data/?rev=10670&view=rev
Author: mrpeach
Date: 2009-01-28 21:45:26 +0000 (Wed, 28 Jan 2009)
Log Message:
-----------
Added "delimiter" message to enable output from offset to first delimiter.
Modified Paths:
--------------
trunk/externals/mrpeach/tab2flist/tab2flist.c
Modified: trunk/externals/mrpeach/tab2flist/tab2flist.c
===================================================================
--- trunk/externals/mrpeach/tab2flist/tab2flist.c 2009-01-28 21:42:46 UTC (rev 10669)
+++ trunk/externals/mrpeach/tab2flist/tab2flist.c 2009-01-28 21:45:26 UTC (rev 10670)
@@ -20,12 +20,17 @@
t_symbol *x_arrayname;
t_float x_offset;
t_float x_length;
+ t_float *x_delimiters;
+ int x_n_delimiters;
} t_tab2flist;
+static void tab2flist_delimit(t_tab2flist *x, int *argc, t_atom *argv);
//static void tab2flist_list(t_tab2flist *x, t_symbol *s, int argc, t_atom *argv);
static void tab2flist_float(t_tab2flist *x, t_float f);
static void tab2flist_bang(t_tab2flist *x);
static void tab2flist_set(t_tab2flist *x, t_symbol *s);
+static void tab2flist_delimiter(t_tab2flist *x, t_symbol *s, int argc, t_atom *argv);
+static void tab2flist_free(t_tab2flist *x);
static void *tab2flist_new(t_symbol *s);
void tab2flist_setup(void);
@@ -33,6 +38,7 @@
{
/* output a list of x_length floats from the table starting from x_offset */
/* output zero for elements outside the table (e.g. negative x_offset) */
+ /* if delimiters are specified, stop when encountering a delimiter */
t_garray *a;
int n, i, tabpoints, listpoints;
@@ -86,12 +92,34 @@
}
i++;
}
+ if (x->x_n_delimiters > 0) tab2flist_delimit(x, &listpoints, atomlist);
outlet_list(x->x_listout, &s_list, listpoints, atomlist);
freebytes(atomlist, listsize);
}
}
}
+static void tab2flist_delimit(t_tab2flist *x, int *argc, t_atom *argv)
+{
+ /* for each element in argv, check if it matches a delimiter */
+ /* if so, truncate the list and set the new length */
+ int i,j, n = *argc;
+ t_float f;
+
+ for (i = 0; i < n; ++i)
+ {
+ f = atom_getfloat(&argv[i]);
+ for (j = 0; j < x->x_n_delimiters; ++j)
+ {
+ if (f == x->x_delimiters[j])
+ {
+ *argc = i;
+ return;
+ }
+ }
+ }
+
+}
#ifdef NOWAY
static void tab2flist_list(t_tab2flist *x, t_symbol *s, int argc, t_atom *argv)
@@ -132,12 +160,47 @@
x->x_arrayname = s;
}
+static void tab2flist_delimiter(t_tab2flist *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int i;
+ /* expect a list of at least one float for delimiter values */
+
+ /* Check the incoming list for floatness... */
+ for (i = 0; i < argc; ++i)
+ {
+ if (argv[i].a_type != A_FLOAT)
+ {
+ pd_error(x, "tab2flist_delimiter: list must contain only floats");
+ return;
+ }
+ }
+ /* allocate storage for the delimiters */
+ if (x->x_delimiters == NULL) x->x_delimiters = getbytes(argc*sizeof(t_float));
+ else
+ x->x_delimiters = resizebytes(x->x_delimiters, x->x_n_delimiters*sizeof(t_float), argc*sizeof(t_float));
+ if (x->x_delimiters == NULL)
+ {
+ pd_error(x, "tab2flist_delimiter can't get %lu bytes for delimiters", argc*sizeof(t_float));
+ x->x_n_delimiters = 0;
+ return;
+ }
+ x->x_n_delimiters = argc;
+ for (i = 0; i < argc; ++i)
+ x->x_delimiters[i] = atom_getfloat(&argv[i]);
+}
+
+static void tab2flist_free(t_tab2flist *x)
+{
+ if (x->x_n_delimiters > 0) freebytes(x->x_delimiters, x->x_n_delimiters*sizeof(t_float));
+}
+
static void *tab2flist_new(t_symbol *s)
{
t_tab2flist *x = (t_tab2flist *)pd_new(tab2flist_class);
x->x_listout = outlet_new(&x->x_obj, &s_list);
floatinlet_new(&x->x_obj, &x->x_length);
- x->x_offset = 0;
+ x->x_offset = x->x_n_delimiters = 0;
+ x->x_delimiters = NULL;
x->x_length = -1; /* default to output the whole table */
x->x_arrayname = s;
return (x);
@@ -146,11 +209,13 @@
void tab2flist_setup(void)
{
tab2flist_class = class_new(gensym("tab2flist"), (t_newmethod)tab2flist_new,
- 0, sizeof(t_tab2flist), 0, A_DEFSYM, 0);
+ (t_method) tab2flist_free, sizeof(t_tab2flist), 0, A_DEFSYM, 0);
class_addbang(tab2flist_class, (t_method)tab2flist_bang);
// class_addlist(tab2flist_class, (t_method)tab2flist_list);
class_addfloat(tab2flist_class, (t_method)tab2flist_float);
class_addmethod(tab2flist_class, (t_method)tab2flist_set, gensym("set"),
A_SYMBOL, 0);
+ class_addmethod(tab2flist_class, (t_method)tab2flist_delimiter, gensym("delimiter"),
+ A_GIMME, 0);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Pd-cvs
mailing list