aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas O Fredericks <mrtof@users.sourceforge.net>2010-05-12 19:17:15 +0000
committerThomas O Fredericks <mrtof@users.sourceforge.net>2010-05-12 19:17:15 +0000
commitf6f29377728c80d1e1c72fdc3f9a113712d737f6 (patch)
treebd57888677fd17cc2ce8bd2227240ae3a034e875 /src
parentce7d7364150288a3214561111e77040318dae520 (diff)
Added to_ and from_ascii_code
svn path=/trunk/externals/tof/; revision=13515
Diffstat (limited to 'src')
-rw-r--r--src/from_ascii_code.c111
-rw-r--r--src/to_ascii_code.c97
2 files changed, 208 insertions, 0 deletions
diff --git a/src/from_ascii_code.c b/src/from_ascii_code.c
new file mode 100644
index 0000000..31f5086
--- /dev/null
+++ b/src/from_ascii_code.c
@@ -0,0 +1,111 @@
+#include "m_pd.h"
+
+//static char* from_ascii_code_text;
+// Common binbuf to all objects
+static t_binbuf* from_ascii_code_binbuf;
+
+typedef struct _from_ascii_code
+{
+
+ t_object x_ob;
+ int eof_is_set;
+ int eof;
+ t_outlet* outlet_left;
+ //t_outlet* outlet_right;
+ char* text;
+ int text_size;
+ int size;
+} t_from_ascii_code;
+
+static t_class *from_ascii_code_class;
+
+// Force output even if eof has not been received
+static void from_ascii_code_bang(t_from_ascii_code *x) {
+
+ if ( x->size ) {
+ binbuf_clear(from_ascii_code_binbuf);
+ binbuf_text(from_ascii_code_binbuf, x->text, x->size);
+ t_atom *argv = binbuf_getvec(from_ascii_code_binbuf);
+ int argc = binbuf_getnatom(from_ascii_code_binbuf);
+ if ( argc) {
+ if ( (argv->a_type == A_SYMBOL) ) {
+ outlet_anything(x->outlet_left,atom_getsymbol(argv),argc-1,argv+1);
+ } else {
+ outlet_anything(x->outlet_left,&s_list,argc,argv);
+ }
+ }
+ x->size = 0;
+ }
+}
+
+
+static void from_ascii_code_float(t_from_ascii_code *x, t_float f) {
+
+ if ( x->eof_is_set && f == x->eof ) {
+ from_ascii_code_bang(x);
+ } else if ( f > 31 && f < 127 ) {
+ x->text[x->size] = (char) f;
+ x->size = x->size + 1;
+ if ( x->size >= x->text_size ) {
+
+ x->text = resizebytes(x->text, x->text_size * sizeof(*(x->text)),
+ (x->text_size + 100) * sizeof(*(x->text)));
+ x->text_size = x->text_size + 100;
+ }
+ }
+}
+
+static void from_ascii_code_list(t_from_ascii_code *x, t_symbol *s, int argc, t_atom *argv) {
+ int i;
+ for ( i=0; i < argc; i++ ) {
+ if ( ((argv+i)->a_type == A_FLOAT) ) {
+ from_ascii_code_float(x,atom_getfloat(argv+i));
+ }
+ }
+}
+
+static void from_ascii_code_free(t_from_ascii_code *x) {
+
+ freebytes(x->text,x->text_size*sizeof(*(x->text)));
+}
+
+static void *from_ascii_code_new(t_symbol *s, int ac, t_atom *av)
+{
+ t_from_ascii_code *x = (t_from_ascii_code *)pd_new(from_ascii_code_class);
+
+ // set eof if eof is set
+ if ( ac && ((av)->a_type == A_FLOAT)) {
+ x->eof = (int) atom_getfloat(av);
+ x->eof_is_set = 1;
+ } else {
+ x->eof_is_set = 0;
+ }
+
+ // create string
+ x->text_size = 100;
+ x->text = getbytes(x->text_size*sizeof(*x->text));
+
+ x->size = 0;
+
+ x->outlet_left = outlet_new(&x->x_ob, &s_list);
+ //x->outlet_right = outlet_new(&x->x_ob, &s_float);
+
+ return (x);
+}
+
+void from_ascii_code_setup(void)
+{
+ // create binbuf (no need to ever free)
+ from_ascii_code_binbuf = binbuf_new();
+
+
+
+ from_ascii_code_class = class_new(gensym("from_ascii_code"),
+ (t_newmethod)from_ascii_code_new, (t_method)from_ascii_code_free,
+ sizeof(t_from_ascii_code), 0, A_GIMME, 0);
+
+ class_addbang(from_ascii_code_class, from_ascii_code_bang);
+ class_addfloat(from_ascii_code_class, from_ascii_code_float);
+ class_addlist(from_ascii_code_class, from_ascii_code_list);
+
+ }
diff --git a/src/to_ascii_code.c b/src/to_ascii_code.c
new file mode 100644
index 0000000..8aa3155
--- /dev/null
+++ b/src/to_ascii_code.c
@@ -0,0 +1,97 @@
+#include "m_pd.h"
+
+// Common string to all objects
+static char* to_ascii_code_text;
+// Common binbuf to all objects
+static t_binbuf* to_ascii_code_binbuf;
+
+typedef struct _to_ascii_code
+{
+
+ t_object x_ob;
+ int eof_is_set;
+ int eof;
+ t_outlet* outlet_left;
+ //t_outlet* outlet_right;
+} t_to_ascii_code;
+
+static t_class *to_ascii_code_class;
+
+static void to_ascii_code_bang(t_to_ascii_code *x) {
+ // Do nothing
+}
+
+
+static void to_ascii_code_anything(t_to_ascii_code *x, t_symbol *s, int ac, t_atom *av) {
+
+ binbuf_clear(to_ascii_code_binbuf);
+ // Add selector if it is not standard
+ if ( s != &s_list && s != &s_float && s != &s_symbol && s != &s_) {
+ t_atom a;
+ SETSYMBOL(&a, s);
+ binbuf_add(to_ascii_code_binbuf,1,&a);
+ }
+ // Add all the atoms to the binbuf
+ binbuf_add(to_ascii_code_binbuf, ac, av);
+
+
+
+ // Get the contents as a text
+ int size=0;
+ binbuf_gettext(to_ascii_code_binbuf, &to_ascii_code_text, &size); //void binbuf_gettext(t_binbuf *x, char **bufp, int *lengthp);
+
+ // Convert to a list of floats
+
+ t_atom *list_floats = getbytes((size+1)*sizeof(*list_floats)); // Add some space for the eof character
+ int i;
+ for ( i=0; i < size; i++ ) {
+ SETFLOAT(list_floats+i,(t_float)to_ascii_code_text[i]);
+ }
+ if ( x->eof_is_set ) { // Append eof if set
+ SETFLOAT(list_floats+size, x->eof);
+ //outlet_float(x->outlet_right,size+1);
+ outlet_list(x->outlet_left,&s_list,size+1,list_floats);
+ } else {
+ //outlet_float(x->outlet_right,size);
+ outlet_list(x->outlet_left,&s_list,size,list_floats);
+ }
+ freebytes(list_floats, (size+1)*sizeof(*list_floats));
+
+}
+
+
+static void *to_ascii_code_new(t_symbol *s, int ac, t_atom *av)
+{
+ t_to_ascii_code *x = (t_to_ascii_code *)pd_new(to_ascii_code_class);
+
+ // set eof if eof is set
+ if ( ac && ((av)->a_type == A_FLOAT)) {
+ x->eof = (int) atom_getfloat(av);
+ x->eof_is_set = 1;
+ } else {
+ x->eof_is_set = 0;
+ }
+
+ x->outlet_left = outlet_new(&x->x_ob, &s_list);
+ //x->outlet_right = outlet_new(&x->x_ob, &s_float);
+
+ return (x);
+}
+
+void to_ascii_code_setup(void)
+{
+ // create binbuf (no need to ever free)
+ to_ascii_code_binbuf = binbuf_new();
+
+ // create text (no need to ever free)
+ to_ascii_code_text = getbytes(MAXPDSTRING*sizeof(*to_ascii_code_text));
+
+ to_ascii_code_class = class_new(gensym("to_ascii_code"),
+ (t_newmethod)to_ascii_code_new, 0,
+ sizeof(t_to_ascii_code), 0, A_GIMME, 0);
+
+ class_addbang(to_ascii_code_class, to_ascii_code_bang);
+ class_addanything(to_ascii_code_class, to_ascii_code_anything);
+
+
+ }