From f6f29377728c80d1e1c72fdc3f9a113712d737f6 Mon Sep 17 00:00:00 2001 From: Thomas O Fredericks Date: Wed, 12 May 2010 19:17:15 +0000 Subject: Added to_ and from_ascii_code svn path=/trunk/externals/tof/; revision=13515 --- src/from_ascii_code.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/to_ascii_code.c | 97 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 src/from_ascii_code.c create mode 100644 src/to_ascii_code.c (limited to 'src') 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); + + + } -- cgit v1.2.1