[PD-cvs] packages/patches add_string_support.patch,NONE,1.1

Martin Peach mrpeach at users.sourceforge.net
Mon Feb 12 04:50:46 CET 2007


Update of /cvsroot/pure-data/packages/patches
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13884

Added Files:
	add_string_support.patch 
Log Message:
Adds string type (array of bytes) support


--- NEW FILE: add_string_support.patch ---
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





More information about the Pd-cvs mailing list