From ca33e6dbc5a2d575f5bb9a991e1393cb6a55dc1d Mon Sep 17 00:00:00 2001
From: Guillem <guillembartrina@gmail.com>
Date: Tue, 18 Aug 2020 12:09:52 +0200
Subject: [PATCH] now you can create local private abstractions. usage: [ab
 bash-<name>]

---
 pd/src/g_canvas.c | 35 +++++++++++++++++++++++++++++++++--
 1 file changed, 33 insertions(+), 2 deletions(-)

diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c
index 198f9cc44..bfa46548d 100644
--- a/pd/src/g_canvas.c
+++ b/pd/src/g_canvas.c
@@ -1970,8 +1970,11 @@ static int ab_check_cycle(t_ab_definition *current, t_ab_definition *parent, int
     }
     else
     {
-        int len = strlen(current->ad_name->s_name);
-        sprintf(path+pathlen, "[ab %s]<-", current->ad_name->s_name);
+        char *hash = strrchr(current->ad_name->s_name, '#');
+        if(!hash) hash = current->ad_name->s_name;
+        else hash += 1;
+        int len = strlen(hash);
+        sprintf(path+pathlen, "[ab %s]<-", hash);
         pathlen += (len+7);
         int i, cycle = 0;
         for(i = 0; !cycle && i < current->ad_numdep; i++)
@@ -2235,6 +2238,31 @@ static void canvas_abpush(t_canvas *x, t_symbol *s, int argc, t_atom *argv)
     pd_free(x);
 }
 
+static int ab_is_local(t_canvas *x, t_symbol *s)
+{
+    int num;
+    char *name = s->s_name, *end;
+    if((end = strchr(name, '-')))
+    {
+        *end = '\0';
+        num = atoi(name);
+        *end = '-';
+        return (num == canvas_getdollarzero(x));
+    }
+    return (0);
+}
+
+static t_symbol *ab_extend_name(t_canvas *x, t_symbol *s)
+{
+    char res[MAXPDSTRING], *beg = strchr(s->s_name, '-');
+    t_canvas *next = canvas_getrootfor(x);
+    if(next->gl_isab)
+        sprintf(res, "%s#$0-%s", next->gl_absource->ad_name->s_name, beg+1);
+    else
+        sprintf(res, "$0-%s", beg+1);
+    return gensym(res);
+}
+
 static int abframe = 0;
 static void canvas_abframe(t_canvas *x, t_float val)
 {
@@ -2263,6 +2291,9 @@ static void *ab_new(t_symbol *s, int argc, t_atom *argv)
         t_symbol *name = (argc ? argv[0].a_w.w_symbol : gensym("(ab)"));
         t_ab_definition *source;
 
+        if(ab_is_local(c, name))
+            name = ab_extend_name(c, name);
+
         if(!(source = canvas_find_ab(c, name)))
         {
             t_binbuf *b = binbuf_new();
-- 
GitLab