From 0bb5c3bdbf0773038c86295b0d31c0971aeb5ccf Mon Sep 17 00:00:00 2001
From: Jonathan Wilkes <jon.w.wilkes@gmail.com>
Date: Thu, 20 Aug 2015 21:37:50 -0400
Subject: [PATCH] ported [setsize] from Pd-Vanilla 0.46

---
 pd/src/g_traversal.c | 61 +++++++++++++++++++++++++-------------------
 1 file changed, 35 insertions(+), 26 deletions(-)

diff --git a/pd/src/g_traversal.c b/pd/src/g_traversal.c
index 78d642d05..4617eecf1 100644
--- a/pd/src/g_traversal.c
+++ b/pd/src/g_traversal.c
@@ -896,7 +896,7 @@ static void *setsize_new(t_symbol *templatesym, t_symbol *fieldsym,
     t_floatarg newsize)
 {
     t_setsize *x = (t_setsize *)pd_new(setsize_class);
-    x->x_templatesym = canvas_makebindsym(templatesym);
+    x->x_templatesym = template_getbindsym(templatesym);
     x->x_fieldsym = fieldsym;
     gpointer_init(&x->x_gp);
     
@@ -906,18 +906,18 @@ static void *setsize_new(t_symbol *templatesym, t_symbol *fieldsym,
 
 static void setsize_set(t_setsize *x, t_symbol *templatesym, t_symbol *fieldsym)
 {
-    x->x_templatesym = canvas_makebindsym(templatesym);
+    x->x_templatesym = template_getbindsym(templatesym);
     x->x_fieldsym = fieldsym;
 }
 
 static void setsize_float(t_setsize *x, t_float f)
 {
     int nitems, onset, type;
-    t_symbol *templatesym = x->x_templatesym, *fieldsym = x->x_fieldsym,
-        *elemtemplatesym;
-    t_template *template = template_findbyname(templatesym);
+    t_symbol *templatesym, *fieldsym = x->x_fieldsym, *elemtemplatesym;
+    t_template *template;
     t_template *elemtemplate;
     t_word *w;
+    t_atom *at;
     t_array *array;
     int elemsize;
     int newsize = f;
@@ -928,25 +928,26 @@ static void setsize_float(t_setsize *x, t_float f)
         pd_error(x, "setsize: empty pointer");
         return;
     }
-    if (gpointer_gettemplatesym(&x->x_gp) != x->x_templatesym)
+    if (*x->x_templatesym->s_name)
     {
-        pd_error(x, "setsize %s: got wrong template (%s)",
-            x->x_templatesym->s_name,
-                gpointer_gettemplatesym(&x->x_gp)->s_name);
-        return;
+        if ((templatesym = x->x_templatesym) !=
+            gpointer_gettemplatesym(gp))
+        {
+            pd_error(x, "elem %s: got wrong template (%s)",
+                templatesym->s_name, gpointer_gettemplatesym(gp)->s_name);
+            return;
+        }
     }
-    if (gs->gs_which == GP_ARRAY) w = gp->gp_un.gp_w;
-    else w = ((t_scalar *)(gp->gp_un.gp_gobj))->sc_vec;
-
-    if (!template)
+    else templatesym = gpointer_gettemplatesym(gp);
+    if (!(template = template_findbyname(templatesym)))
     {
-        pd_error(x,"setsize: couldn't find template %s", templatesym->s_name);
+        pd_error(x, "elem: couldn't find template %s", templatesym->s_name);
         return;
     }
     if (!template_find_field(template, fieldsym,
         &onset, &type, &elemtemplatesym))
     {
-        pd_error(x,"setsize: couldn't find array field %s", fieldsym->s_name);
+        pd_error(x, "setsize: couldn't find array field %s", fieldsym->s_name);
         return;
     }
     if (type != DT_ARRAY)
@@ -954,6 +955,8 @@ static void setsize_float(t_setsize *x, t_float f)
         pd_error(x,"setsize: field %s not of type array", fieldsym->s_name);
         return;
     }
+    if (gs->gs_which == GP_ARRAY) w = gp->gp_un.gp_w;
+    else w = ((t_scalar *)(gp->gp_un.gp_gobj))->sc_vec;
 
     if (!(elemtemplate = template_findbyname(elemtemplatesym)))
     {
@@ -992,21 +995,27 @@ static void setsize_float(t_setsize *x, t_float f)
             gobj_vis(owner_array->a_gp.gp_un.gp_gobj,
                 owner_array->a_gp.gp_stub->gs_un.gs_glist, 0);  
     }
-        /* now do the resizing and, if growing, initialize new scalars */
+        /* if shrinking, free the scalars that will disappear */
+    if (newsize < nitems)
+    {
+        char *elem;
+        int count;
+        for (elem = ((char *)array->a_vec) + newsize * elemsize,
+            count = nitems = newsize; count--; elem += elemsize)
+                word_free((t_word *)elem, elemtemplate);
+    } 
+        /* resize the array */
     array->a_vec = (char *)resizebytes(array->a_vec,
         elemsize * nitems, elemsize * newsize);
     array->a_n = newsize;
+        /* if growing, initialize new scalars */
     if (newsize > nitems)
     {
-        char *newelem = ((char *)array->a_vec) + nitems * elemsize;
-        int nnew = newsize - nitems;
-        
-        while (nnew--)
-        {
-            word_init((t_word *)newelem, elemtemplate, gp);
-            newelem += elemsize;
-            /* post("new %lx %lx, ntypes %d", newelem, *(int *)newelem, ntypes); */
-        }
+        char *elem;
+        int count;
+        for (elem = ((char *)array->a_vec) + nitems * elemsize,
+            count = newsize - nitems; count--; elem += elemsize)
+                word_init((t_word *)elem, elemtemplate, gp);
     }
 
     /* redraw again. */
-- 
GitLab