[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