aboutsummaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorMartin Peach <mrpeach@users.sourceforge.net>2007-02-12 03:50:44 +0000
committerMartin Peach <mrpeach@users.sourceforge.net>2007-02-12 03:50:44 +0000
commitdabf0f33647dcb263607b0e73eff4939c6aaba59 (patch)
tree829313a86bbc7aaababf20f03de0a5e3bd8fe158 /packages
parent62a37c60ddce222ff2968b21e47a77c5a854c657 (diff)
Adds string type (array of bytes) support
svn path=/trunk/; revision=7418
Diffstat (limited to 'packages')
-rwxr-xr-xpackages/patches/add_string_support.patch444
1 files changed, 444 insertions, 0 deletions
diff --git a/packages/patches/add_string_support.patch b/packages/patches/add_string_support.patch
new file mode 100755
index 00000000..27be45be
--- /dev/null
+++ b/packages/patches/add_string_support.patch
@@ -0,0 +1,444 @@
+Index: pd/src/g_text.c
+===================================================================
+RCS file: /cvsroot/pure-data/pd/src/g_text.c,v
+retrieving revision 1.15
+diff -u -w -r1.15 g_text.c
+--- pd/src/g_text.c 4 Oct 2006 19:35:06 -0000 1.15
++++ pd/src/g_text.c 12 Feb 2007 03:45:43 -0000
+@@ -276,6 +276,11 @@
+ outlet_symbol(x->mr_outlet, s);
+ }
+
++static void messresponder_string(t_messresponder *x, t_string *st)
++{ /* MP 20070107 string type */
++ outlet_string(x->mr_outlet, st);
++}
++
+ static void messresponder_list(t_messresponder *x,
+ t_symbol *s, int argc, t_atom *argv)
+ {
+@@ -307,6 +312,13 @@
+ binbuf_eval(x->m_text.te_binbuf, &x->m_messresponder.mr_pd, 1, &at);
+ }
+
++static void message_string(t_message *x, t_string *st)
++{
++ t_atom at;
++ SETSTRING(&at, st);
++ binbuf_eval(x->m_text.te_binbuf, &x->m_messresponder.mr_pd, 1, &at);
++}
++
+ static void message_list(t_message *x, t_symbol *s, int argc, t_atom *argv)
+ {
+ binbuf_eval(x->m_text.te_binbuf, &x->m_messresponder.mr_pd, argc, argv);
+@@ -1333,6 +1345,7 @@
+ class_addbang(message_class, message_bang);
+ class_addfloat(message_class, message_float);
+ class_addsymbol(message_class, message_symbol);
++ class_addstring(message_class, message_string);
+ class_addlist(message_class, message_list);
+ class_addanything(message_class, message_list);
+
+Index: pd/src/m_atom.c
+===================================================================
+RCS file: /cvsroot/pure-data/pd/src/m_atom.c,v
+retrieving revision 1.4
+diff -u -w -r1.4 m_atom.c
+--- pd/src/m_atom.c 11 Aug 2006 20:09:07 -0000 1.4
++++ pd/src/m_atom.c 12 Feb 2007 03:45:43 -0000
+@@ -28,6 +28,14 @@
+ else return (&s_float);
+ }
+
++t_string *atom_getstring(t_atom *a) /* MP 20070108 */
++{
++ static unsigned char c = 0;/* a default string to avoid null pointers. This should be somewhere else...? */
++ static t_string st = {1L, &c};
++ if (a->a_type == A_STRING) return (a->a_w.w_string);
++ else return (&st);
++}
++
+ t_symbol *atom_gensym(t_atom *a) /* this works better for graph labels */
+ {
+ char buf[30];
+Index: pd/src/m_binbuf.c
+===================================================================
+RCS file: /cvsroot/pure-data/pd/src/m_binbuf.c,v
+retrieving revision 1.13
+diff -u -w -r1.13 m_binbuf.c
+--- pd/src/m_binbuf.c 4 Oct 2006 19:35:06 -0000 1.13
++++ pd/src/m_binbuf.c 12 Feb 2007 03:45:44 -0000
+@@ -672,6 +672,10 @@
+ case A_SYMBOL:
+ typedmess(target, stackwas->a_w.w_symbol, nargs-1, stackwas+1);
+ break;
++ case A_STRING: /* MP 20070106 string type */
++ if (nargs == 1) pd_string(target, stackwas->a_w.w_string);
++ else pd_list(target, 0, nargs, stackwas);
++ break;
+ case A_FLOAT:
+ if (nargs == 1) pd_float(target, stackwas->a_w.w_float);
+ else pd_list(target, 0, nargs, stackwas);
+Index: pd/src/m_class.c
+===================================================================
+RCS file: /cvsroot/pure-data/pd/src/m_class.c,v
+retrieving revision 1.7
+diff -u -w -r1.7 m_class.c
+--- pd/src/m_class.c 15 Aug 2006 04:54:15 -0000 1.7
++++ pd/src/m_class.c 12 Feb 2007 03:45:44 -0000
+@@ -20,6 +20,7 @@
+
+ static t_symbol *class_loadsym; /* name under which an extern is invoked */
+ static void pd_defaultfloat(t_pd *x, t_float f);
++static void pd_defaultstring(t_pd *x, t_string *st); /* MP20061226 string type */
+ static void pd_defaultlist(t_pd *x, t_symbol *s, int argc, t_atom *argv);
+ t_pd pd_objectmaker; /* factory for creating "object" boxes */
+ t_pd pd_canvasmaker; /* factory for creating canvases */
+@@ -38,6 +39,11 @@
+ else (*(*x)->c_anymethod)(x, &s_bang, 0, 0);
+ }
+
++static void pd_defaultstring(t_pd *x, t_string *st) /* MP 20061226 string type */
++{ /* for now just reject it, later convert to symbol/float/list */
++ pd_error(x, "%s: no method for string so far...", (*x)->c_name->s_name);
++}
++
+ static void pd_defaultpointer(t_pd *x, t_gpointer *gp)
+ {
+ if (*(*x)->c_listmethod != pd_defaultlist)
+@@ -205,6 +211,7 @@
+ c->c_pointermethod = pd_defaultpointer;
+ c->c_floatmethod = pd_defaultfloat;
+ c->c_symbolmethod = pd_defaultsymbol;
++ c->c_stringmethod = pd_defaultstring; /* MP 20061226 string type */
+ c->c_listmethod = pd_defaultlist;
+ c->c_anymethod = pd_defaultanything;
+ c->c_wb = (typeflag == CLASS_PATCHABLE ? &text_widgetbehavior : 0);
+@@ -288,6 +295,12 @@
+ if (argtype != A_SYMBOL || va_arg(ap, t_atomtype)) goto phooey;
+ class_addsymbol(c, fn);
+ }
++ else if (sel == &s_string) /* MP 20070106 string type */
++ {
++ post("class_addmethod: %p", fn);
++ if (argtype != A_STRING || va_arg(ap, t_atomtype)) goto phooey;
++ class_addstring(c, fn);
++ }
+ else if (sel == &s_list)
+ {
+ if (argtype != A_GIMME) goto phooey;
+@@ -346,6 +359,11 @@
+ c->c_symbolmethod = (t_symbolmethod)fn;
+ }
+
++void class_addstring(t_class *c, t_method fn) /* MP 20061226 string type */
++{
++ c->c_stringmethod = (t_stringmethod)fn;
++}
++
+ void class_addlist(t_class *c, t_method fn)
+ {
+ c->c_listmethod = (t_listmethod)fn;
+@@ -564,9 +582,10 @@
+ t_symbol s_x = {"x", 0, 0};
+ t_symbol s_y = {"y", 0, 0};
+ t_symbol s_ = {"", 0, 0};
++t_symbol s_string = {"string", 0, 0}; /* MP 20061223 string type */
+
+ static t_symbol *symlist[] = { &s_pointer, &s_float, &s_symbol, &s_bang,
+- &s_list, &s_anything, &s_signal, &s__N, &s__X, &s_x, &s_y, &s_};
++ &s_list, &s_anything, &s_signal, &s__N, &s__X, &s_x, &s_y, &s_, &s_string}; /* MP 20061223 added s_string */
+
+ void mess_init(void)
+ {
+@@ -654,6 +673,13 @@
+ (*c->c_symbolmethod)(x, &s_);
+ return;
+ }
++ if (s == &s_string) /* MP 20061226 string type */
++ {
++ /*post("pd_typedmess argc = %d\n", argc);*//* MP 20061226 debug */
++ if (argc == 1) (*c->c_stringmethod)(x, argv->a_w.w_string);
++ else goto badarg;
++ return;
++ }
+ for (i = c->c_nmethod, m = c->c_methods; i--; m++)
+ if (m->me_name == s)
+ {
+@@ -698,6 +724,19 @@
+ }
+ dp++;
+ break;
++ case A_STRING:/* MP 20070106 string type */
++ /*post("pd_typedmess A_STRING");*/
++ if (!argc) goto badarg;
++ if (argv->a_type == A_STRING)
++ {
++ /*post("argv->a_type == A_STRING, argc = %d, narg= %d", argc, narg);*/
++ *ap = (t_int)(argv->a_w.w_string);
++ }
++ argc--;
++ argv++;
++ narg++;
++ ap++;
++ break;
+ case A_SYMBOL:
+ if (!argc) goto badarg;
+ case A_DEFSYM:
+@@ -772,6 +811,10 @@
+ {
+ case 'f': SETFLOAT(at, va_arg(ap, double)); break;
+ case 's': SETSYMBOL(at, va_arg(ap, t_symbol *)); break;
++ case 't':
++ SETSTRING(at, va_arg(ap, t_string *));
++ /*post("pd_vmess: arg[0].a_w.w_string = %p", arg[0].a_w.w_string);*/
++ break; /* MP 20061226 string type */
+ case 'i': SETFLOAT(at, va_arg(ap, t_int)); break;
+ case 'p': SETPOINTER(at, va_arg(ap, t_gpointer *)); break;
+ default: goto done;
+Index: pd/src/m_imp.h
+===================================================================
+RCS file: /cvsroot/pure-data/pd/src/m_imp.h,v
+retrieving revision 1.4
+diff -u -w -r1.4 m_imp.h
+--- pd/src/m_imp.h 19 Aug 2005 23:28:03 -0000 1.4
++++ pd/src/m_imp.h 12 Feb 2007 03:45:44 -0000
+@@ -25,6 +25,7 @@
+ typedef void (*t_pointermethod)(t_pd *x, t_gpointer *gp);
+ typedef void (*t_floatmethod)(t_pd *x, t_float f);
+ typedef void (*t_symbolmethod)(t_pd *x, t_symbol *s);
++typedef void (*t_stringmethod)(t_pd *x, t_string *st); /* MP20061226 string type */
+ typedef void (*t_listmethod)(t_pd *x, t_symbol *s, int argc, t_atom *argv);
+ typedef void (*t_anymethod)(t_pd *x, t_symbol *s, int argc, t_atom *argv);
+
+@@ -41,6 +42,7 @@
+ t_pointermethod c_pointermethod;
+ t_floatmethod c_floatmethod;
+ t_symbolmethod c_symbolmethod;
++ t_stringmethod c_stringmethod; /* MP20061226 string type */
+ t_listmethod c_listmethod;
+ t_anymethod c_anymethod;
+ struct _widgetbehavior *c_wb; /* "gobjs" only */
+Index: pd/src/m_obj.c
+===================================================================
+RCS file: /cvsroot/pure-data/pd/src/m_obj.c,v
+retrieving revision 1.4
+diff -u -w -r1.4 m_obj.c
+--- pd/src/m_obj.c 18 May 2005 04:28:51 -0000 1.4
++++ pd/src/m_obj.c 12 Feb 2007 03:45:44 -0000
+@@ -15,6 +15,7 @@
+ t_gpointer *iu_pointerslot;
+ t_float *iu_floatslot;
+ t_symbol **iu_symslot;
++ t_string **iu_stringslot; /* MP 20061226 string type */
+ t_sample iu_floatsignalvalue;
+ };
+
+@@ -32,9 +33,10 @@
+ #define i_pointerslot i_un.iu_pointerslot
+ #define i_floatslot i_un.iu_floatslot
+ #define i_symslot i_un.iu_symslot
++#define i_stringslot i_un.iu_stringslot /* MP 20061226 string type */
+
+ static t_class *inlet_class, *pointerinlet_class, *floatinlet_class,
+- *symbolinlet_class;
++ *symbolinlet_class, *stringinlet_class; /* MP 20061226 added stringinlet_class */
+
+ #define ISINLET(pd) ((*(pd) == inlet_class) || \
+ (*(pd) == pointerinlet_class) || \
+@@ -111,6 +113,26 @@
+ else inlet_wrong(x, &s_symbol);
+ }
+
++static void inlet_string(t_inlet *x, t_string *st) /* MP20061226 string type */
++{
++ /*post("inlet_string (%p): st %p", &inlet_string, st);*/
++ if (x->i_symfrom == &s_string)
++ {
++ /*post("inlet_string calling pd_vmess");*/
++ pd_vmess(x->i_dest, x->i_symto, "t", st);
++ }
++ else if (!x->i_symfrom)
++ {
++ /*post("inlet_string calling pd_string");*/
++ pd_string(x->i_dest, st);
++ }
++ else
++ {
++ /*post("inlet_string calling inlet_wrong");*/
++ inlet_wrong(x, &s_string);
++ }
++}
++
+ static void inlet_list(t_inlet *x, t_symbol *s, int argc, t_atom *argv)
+ {
+ t_atom at;
+@@ -192,6 +214,23 @@
+ return (x);
+ }
+
++t_inlet *stringinlet_new(t_object *owner, t_string **stp) /* MP 20061226 string type */
++{
++ t_inlet *x = (t_inlet *)pd_new(stringinlet_class), *y, *y2;
++ x->i_owner = owner;
++ x->i_dest = 0;
++ x->i_symfrom = &s_string;
++ x->i_stringslot = stp;
++ x->i_next = 0;
++ if (y = owner->ob_inlet)
++ {
++ while (y2 = y->i_next) y = y2;
++ y->i_next = x;
++ }
++ else owner->ob_inlet = x;
++ return (x);
++}
++
+ static void symbolinlet_symbol(t_inlet *x, t_symbol *s)
+ {
+ *(x->i_symslot) = s;
+@@ -244,6 +283,7 @@
+ class_addpointer(inlet_class, inlet_pointer);
+ class_addfloat(inlet_class, inlet_float);
+ class_addsymbol(inlet_class, inlet_symbol);
++ class_addstring(inlet_class, inlet_string); /* MP 20061226 string type */
+ class_addlist(inlet_class, inlet_list);
+ class_addanything(inlet_class, inlet_anything);
+
+@@ -366,6 +406,18 @@
+ --stackcount;
+ }
+
++void outlet_string(t_outlet *x, t_string *st) /* MP 20061226 string type */
++{
++ /*post("outlet_string %p %lu", st, st->s_length);*/
++ t_outconnect *oc;
++ if(++stackcount >= STACKITER)
++ outlet_stackerror(x);
++ else
++ for (oc = x->o_connections; oc; oc = oc->oc_next)
++ pd_string(oc->oc_to, st);
++ --stackcount;
++}
++
+ void outlet_list(t_outlet *x, t_symbol *s, int argc, t_atom *argv)
+ {
+ t_outconnect *oc;
+Index: pd/src/m_pd.c
+===================================================================
+RCS file: /cvsroot/pure-data/pd/src/m_pd.c,v
+retrieving revision 1.4
+diff -u -w -r1.4 m_pd.c
+--- pd/src/m_pd.c 28 Nov 2004 21:20:42 -0000 1.4
++++ pd/src/m_pd.c 12 Feb 2007 03:45:44 -0000
+@@ -284,6 +284,12 @@
+ (*(*x)->c_symbolmethod)(x, s);
+ }
+
++void pd_string(t_pd *x, t_string *st) /* MP20061226 string type */
++{
++ /*post("pd_string: st %p length %lu (*x)->c_stringmethod %p", st, st->s_length, (*x)->c_stringmethod);*/
++ (*(*x)->c_stringmethod)(x, st);
++}
++
+ void pd_list(t_pd *x, t_symbol *s, int argc, t_atom *argv)
+ {
+ (*(*x)->c_listmethod)(x, &s_list, argc, argv);
+Index: pd/src/m_pd.h
+===================================================================
+RCS file: /cvsroot/pure-data/pd/src/m_pd.h,v
+retrieving revision 1.17
+diff -u -w -r1.17 m_pd.h
+--- pd/src/m_pd.h 22 Oct 2006 21:46:11 -0000 1.17
++++ pd/src/m_pd.h 12 Feb 2007 03:45:44 -0000
+@@ -102,6 +102,16 @@
+ t_gstub *gp_stub; /* stub which points to glist/array */
+ } t_gpointer;
+
++#define PD_STRINGS 1 /* MP20070211 Use this to test for string capability */
++/* MP20061223 string type: */
++typedef struct _string /* pointer to a string */
++{
++ unsigned long s_length; /* length of string in bytes */
++ unsigned char *s_data; /* pointer to 1st byte of string */
++} t_string;
++/* ...MP20061223 string type */
++
++
+ typedef union word
+ {
+ t_float w_float;
+@@ -110,6 +120,7 @@
+ t_array *w_array;
+ struct _glist *w_list;
+ int w_index;
++ t_string *w_string; /* MP20061223 string type */
+ } t_word;
+
+ typedef enum
+@@ -125,7 +136,8 @@
+ A_DOLLAR,
+ A_DOLLSYM,
+ A_GIMME,
+- A_CANT
++ A_CANT,
++ A_STRING /* MP20061223 string type */
+ } t_atomtype;
+
+ #define A_DEFSYMBOL A_DEFSYM /* better name for this */
+@@ -212,6 +224,7 @@
+ EXTERN t_symbol s_pointer;
+ EXTERN t_symbol s_float;
+ EXTERN t_symbol s_symbol;
++EXTERN t_symbol s_string;
+ EXTERN t_symbol s_bang;
+ EXTERN t_symbol s_list;
+ EXTERN t_symbol s_anything;
+@@ -255,6 +268,7 @@
+ #define SETFLOAT(atom, f) ((atom)->a_type = A_FLOAT, (atom)->a_w.w_float = (f))
+ #define SETSYMBOL(atom, s) ((atom)->a_type = A_SYMBOL, \
+ (atom)->a_w.w_symbol = (s))
++#define SETSTRING(atom, st) ((atom)->a_type = A_STRING, (atom)->a_w.w_string = (st)) /* MP 20061226 string type */
+ #define SETDOLLAR(atom, n) ((atom)->a_type = A_DOLLAR, \
+ (atom)->a_w.w_index = (n))
+ #define SETDOLLSYM(atom, s) ((atom)->a_type = A_DOLLSYM, \
+@@ -263,6 +277,7 @@
+ EXTERN t_float atom_getfloat(t_atom *a);
+ EXTERN t_int atom_getint(t_atom *a);
+ EXTERN t_symbol *atom_getsymbol(t_atom *a);
++EXTERN t_string *atom_getstring(t_atom *a);/* MP 20070108 sring type */
+ EXTERN t_symbol *atom_gensym(t_atom *a);
+ EXTERN t_float atom_getfloatarg(int which, int argc, t_atom *argv);
+ EXTERN t_int atom_getintarg(int which, int argc, t_atom *argv);
+@@ -326,6 +341,7 @@
+ EXTERN void pd_pointer(t_pd *x, t_gpointer *gp);
+ EXTERN void pd_float(t_pd *x, t_float f);
+ EXTERN void pd_symbol(t_pd *x, t_symbol *s);
++EXTERN void pd_string(t_pd *x, t_string *st); /* MP 20061226 string type */
+ EXTERN void pd_list(t_pd *x, t_symbol *s, int argc, t_atom *argv);
+ EXTERN void pd_anything(t_pd *x, t_symbol *s, int argc, t_atom *argv);
+ #define pd_class(x) (*(x))
+@@ -350,6 +366,7 @@
+ EXTERN void outlet_pointer(t_outlet *x, t_gpointer *gp);
+ EXTERN void outlet_float(t_outlet *x, t_float f);
+ EXTERN void outlet_symbol(t_outlet *x, t_symbol *s);
++EXTERN void outlet_string(t_outlet *x, t_string *st); /* MP 20061226 string type */
+ EXTERN void outlet_list(t_outlet *x, t_symbol *s, int argc, t_atom *argv);
+ EXTERN void outlet_anything(t_outlet *x, t_symbol *s, int argc, t_atom *argv);
+ EXTERN t_symbol *outlet_getsymbol(t_outlet *x);
+@@ -404,6 +421,7 @@
+ EXTERN void class_addpointer(t_class *c, t_method fn);
+ EXTERN void class_doaddfloat(t_class *c, t_method fn);
+ EXTERN void class_addsymbol(t_class *c, t_method fn);
++EXTERN void class_addstring(t_class *c, t_method fn);/* MP 20061226 string type */
+ EXTERN void class_addlist(t_class *c, t_method fn);
+ EXTERN void class_addanything(t_class *c, t_method fn);
+ EXTERN void class_sethelpsymbol(t_class *c, t_symbol *s);
+@@ -432,6 +450,7 @@
+ #define class_addpointer(x, y) class_addpointer((x), (t_method)(y))
+ #define class_addfloat(x, y) class_doaddfloat((x), (t_method)(y))
+ #define class_addsymbol(x, y) class_addsymbol((x), (t_method)(y))
++#define class_addstring(x, y) class_addstring((x), (t_method)(y)) /* MP20061226 string type */
+ #define class_addlist(x, y) class_addlist((x), (t_method)(y))
+ #define class_addanything(x, y) class_addanything((x), (t_method)(y))
+ #endif