diff --git a/pd/src/m_class.c b/pd/src/m_class.c index 0000d5f98ea62ddfacd415bcb8e1f6aa6a23fbb7..cb66d85f6f303620d952767724f30e38cbf64f39 100644 --- a/pd/src/m_class.c +++ b/pd/src/m_class.c @@ -704,7 +704,7 @@ void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv) int narg = 0; t_pd *bonzo; - //fprintf(stderr,"\nstart %s %d\n", s->s_name, c->c_nmethod); + //fprintf(stderr,"\nstart %s %d\n", s->s_name, c->c_nmethod); /* check for messages that are handled by fixed slots in the class structure. We don't catch "pointer" though so that sending "pointer" @@ -743,111 +743,116 @@ void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv) return; } for (i = c->c_nmethod, m = c->c_methods; i--; m++) - //if (m->me_name == s) - if (m && m->me_name == s) { - //fprintf(stderr,"me_name %s\n", m->me_name); - wp = m->me_arg; - if (*wp == A_GIMME) - { - if (x == &pd_objectmaker) - newest = (*((t_newgimme)(m->me_fun)))(s, argc, argv); - else (*((t_messgimme)(m->me_fun)))(x, s, argc, argv); - return; - } - if (argc > MAXPDARG) argc = MAXPDARG; - if (x != &pd_objectmaker) *(ap++) = (t_int)x, narg++; - while (wanttype = *wp++) + //if (m->me_name == s) + if (m && m->me_name == s) { - switch (wanttype) + //fprintf(stderr,"me_name %s\n", m->me_name); + wp = m->me_arg; + if (*wp == A_GIMME) { - case A_POINTER: - if (!argc) goto badarg; - else - { - if (argv->a_type == A_POINTER) - *ap = (t_int)(argv->a_w.w_gpointer); - else goto badarg; - argc--; - argv++; - } - narg++; - ap++; - break; - case A_FLOAT: - if (!argc) goto badarg; - case A_DEFFLOAT: - if (!argc) *dp = 0; - else - { - if (argv->a_type == A_FLOAT) - *dp = argv->a_w.w_float; - else goto badarg; - argc--; - argv++; - } - dp++; - break; - case A_BLOB:/* MP 20070106 blob type */ - /*post("pd_typedmess A_BLOB");*/ - if (!argc) goto badarg; - if (argv->a_type == A_BLOB) - { - /*post("argv->a_type == A_BLOB, argc = %d, narg= %d", argc, narg);*/ - *ap = (t_int)(argv->a_w.w_blob); - } - argc--; - argv++; - narg++; - ap++; - break; - case A_SYMBOL: - if (!argc) goto badarg; - case A_DEFSYM: - if (!argc) *ap = (t_int)(&s_); - else + if (x == &pd_objectmaker) + newest = (*((t_newgimme)(m->me_fun)))(s, argc, argv); + else (*((t_messgimme)(m->me_fun)))(x, s, argc, argv); + return; + } + if (argc > MAXPDARG) argc = MAXPDARG; + if (x != &pd_objectmaker) *(ap++) = (t_int)x, narg++; + while (wanttype = *wp++) + { + switch (wanttype) { - if (argv->a_type == A_SYMBOL) - *ap = (t_int)(argv->a_w.w_symbol); - /* if it's an unfilled "dollar" argument it appears - as zero here; cheat and bash it to the null - symbol. Unfortunately, this lets real zeros - pass as symbols too, which seems wrong... */ - else if (x == &pd_objectmaker && argv->a_type == A_FLOAT - && argv->a_w.w_float == 0) - *ap = (t_int)(&s_); - else goto badarg; + case A_POINTER: + if (!argc) goto badarg; + else + { + if (argv->a_type == A_POINTER) + *ap = (t_int)(argv->a_w.w_gpointer); + else goto badarg; + argc--; + argv++; + } + narg++; + ap++; + break; + case A_FLOAT: + if (!argc) goto badarg; + case A_DEFFLOAT: + if (!argc) *dp = 0; + else + { + if (argv->a_type == A_FLOAT) + *dp = argv->a_w.w_float; + else goto badarg; + argc--; + argv++; + } + dp++; + break; + case A_BLOB:/* MP 20070106 blob type */ + /*post("pd_typedmess A_BLOB");*/ + if (!argc) goto badarg; + if (argv->a_type == A_BLOB) + { + /*post("argv->a_type == A_BLOB, argc = %d, narg= %d", + // argc, narg);*/ + *ap = (t_int)(argv->a_w.w_blob); + } argc--; argv++; + narg++; + ap++; + break; + case A_SYMBOL: + if (!argc) goto badarg; + case A_DEFSYM: + if (!argc) *ap = (t_int)(&s_); + else + { + if (argv->a_type == A_SYMBOL) + *ap = (t_int)(argv->a_w.w_symbol); + /* if it's an unfilled "dollar" argument it + appears as zero here; cheat and bash it + to the null symbol. Unfortunately, this + lets real zeros pass as symbols too, which + seems wrong... */ + else if (x == &pd_objectmaker && + argv->a_type == A_FLOAT + && argv->a_w.w_float == 0) + *ap = (t_int)(&s_); + else goto badarg; + argc--; + argv++; + } + narg++; + ap++; } - narg++; - ap++; } + switch (narg) + { + case 0 : bonzo = (*(t_fun0)(m->me_fun)) + (ad[0], ad[1], ad[2], ad[3], ad[4]); break; + case 1 : bonzo = (*(t_fun1)(m->me_fun)) + (ai[0], ad[0], ad[1], ad[2], ad[3], ad[4]); break; + case 2 : bonzo = (*(t_fun2)(m->me_fun)) + (ai[0], ai[1], ad[0], ad[1], ad[2], ad[3], ad[4]); break; + case 3 : bonzo = (*(t_fun3)(m->me_fun)) + (ai[0], ai[1], ai[2], ad[0], ad[1], ad[2], ad[3], ad[4]); break; + case 4 : bonzo = (*(t_fun4)(m->me_fun)) + (ai[0], ai[1], ai[2], ai[3], + ad[0], ad[1], ad[2], ad[3], ad[4]); break; + case 5 : bonzo = (*(t_fun5)(m->me_fun)) + (ai[0], ai[1], ai[2], ai[3], ai[4], + ad[0], ad[1], ad[2], ad[3], ad[4]); break; + case 6 : bonzo = (*(t_fun6)(m->me_fun)) + (ai[0], ai[1], ai[2], ai[3], ai[4], ai[5], + ad[0], ad[1], ad[2], ad[3], ad[4]); break; + default: bonzo = 0; + } + if (x == &pd_objectmaker) + newest = bonzo; + return; } - switch (narg) - { - case 0 : bonzo = (*(t_fun0)(m->me_fun)) - (ad[0], ad[1], ad[2], ad[3], ad[4]); break; - case 1 : bonzo = (*(t_fun1)(m->me_fun)) - (ai[0], ad[0], ad[1], ad[2], ad[3], ad[4]); break; - case 2 : bonzo = (*(t_fun2)(m->me_fun)) - (ai[0], ai[1], ad[0], ad[1], ad[2], ad[3], ad[4]); break; - case 3 : bonzo = (*(t_fun3)(m->me_fun)) - (ai[0], ai[1], ai[2], ad[0], ad[1], ad[2], ad[3], ad[4]); break; - case 4 : bonzo = (*(t_fun4)(m->me_fun)) - (ai[0], ai[1], ai[2], ai[3], - ad[0], ad[1], ad[2], ad[3], ad[4]); break; - case 5 : bonzo = (*(t_fun5)(m->me_fun)) - (ai[0], ai[1], ai[2], ai[3], ai[4], - ad[0], ad[1], ad[2], ad[3], ad[4]); break; - case 6 : bonzo = (*(t_fun6)(m->me_fun)) - (ai[0], ai[1], ai[2], ai[3], ai[4], ai[5], - ad[0], ad[1], ad[2], ad[3], ad[4]); break; - default: bonzo = 0; - } - if (x == &pd_objectmaker) - newest = bonzo; - return; } (*c->c_anymethod)(x, s, argc, argv); return; diff --git a/pd/src/m_conf.c b/pd/src/m_conf.c index 389cdf7dfb5838beff3b371e294cf8332b3a32c6..3f87ce07f80f04f1965882323995141eec79aa8c 100644 --- a/pd/src/m_conf.c +++ b/pd/src/m_conf.c @@ -88,7 +88,7 @@ void conf_init(void) x_qlist_setup(); x_gui_setup(); x_list_setup(); - x_preset_setup(); + x_preset_setup(); d_arithmetic_setup(); d_array_setup(); d_ctl_setup(); diff --git a/pd/src/m_memory.c b/pd/src/m_memory.c index fda7f1b0ecc4a3ab297876366f8fb9372f6295ef..39d77babc4e1ff44b82051a49bee923f0a575031 100644 --- a/pd/src/m_memory.c +++ b/pd/src/m_memory.c @@ -28,7 +28,7 @@ void *getbytes(size_t nbytes) fprintf(stderr, "new %lx %d\n", (int)ret, nbytes); #endif /* LOUD */ #ifdef DEBUGMEM - + totalmem += nbytes; #endif if (!ret) @@ -80,7 +80,7 @@ void freebytes(void *fatso, size_t nbytes) totalmem -= nbytes; #endif free(fatso); - fatso = NULL; + fatso = NULL; } #ifdef DEBUGMEM diff --git a/pd/src/m_obj.c b/pd/src/m_obj.c index d50f01253cc20f965af16cf80f97b0157de74f9a..5516663ae49ae302bf3734391de49a2deddcc7aa 100644 --- a/pd/src/m_obj.c +++ b/pd/src/m_obj.c @@ -337,15 +337,17 @@ struct _outconnect { struct _outconnect *oc_next; t_pd *oc_to; - int oc_vis; // whether the connection should be visible + int oc_vis; // whether the connection should be visible }; -int outconnect_visible(t_outconnect *oc) { - return oc->oc_vis; +int outconnect_visible(t_outconnect *oc) +{ + return oc->oc_vis; } -void outconnect_setvisible(t_outconnect *oc, int vis) { - oc->oc_vis = vis; +void outconnect_setvisible(t_outconnect *oc, int vis) +{ + oc->oc_vis = vis; } struct _outlet @@ -482,16 +484,16 @@ void outlet_free(t_outlet *x) t_outconnect *obj_connect(t_object *source, int outno, t_object *sink, int inno) { - //fprintf(stderr,"obj_connect\n"); + //fprintf(stderr,"obj_connect\n"); t_inlet *i; t_outlet *o; t_pd *to; t_outconnect *oc, *oc2; - /* ignore attempts to connect to the same object - this occurs sometimes using undo/redo */ - if (source == sink) - return (0); + /* ignore attempts to connect to the same object + this occurs sometimes using undo/redo */ + if (source == sink) + return (0); for (o = source->ob_outlet; o && outno; o = o->o_next, outno--) ; if (!o) return (0); @@ -573,9 +575,9 @@ int obj_noutlets(t_object *x) { int n = 0; t_outlet *o; - if (x && x->ob_outlet) - for (o = x->ob_outlet, n = 0; o; o = o->o_next) n++; - return (n); + if (x && x->ob_outlet) + for (o = x->ob_outlet, n = 0; o; o = o->o_next) n++; + return (n); } int obj_ninlets(t_object *x) diff --git a/pd/src/m_pd.c b/pd/src/m_pd.c index 1a6b493edf8901a8d1699fb8ca654baaf3e6aac6..2b6a54f582b37078acdf557523018c331e32eee8 100644 --- a/pd/src/m_pd.c +++ b/pd/src/m_pd.c @@ -20,12 +20,12 @@ extern t_redundant_mem *rm_end; t_pd *pd_new(t_class *c) { t_pd *x = NULL; - t_pd *y = NULL; + t_pd *y = NULL; if (!c) bug ("pd_new: apparently called before setup routine"); - x = (t_pd *)t_getbytes(c->c_size); + x = (t_pd *)t_getbytes(c->c_size); *x = c; if (c->c_patchable) { @@ -68,7 +68,7 @@ typedef struct _bindelem { t_pd *e_who; struct _bindelem *e_next; - int e_delayed_free; + int e_delayed_free; } t_bindelem; typedef struct _bindlist @@ -81,28 +81,28 @@ static int change_bindlist_via_graph = 0; static void bindlist_cleanup(t_bindlist *x) { - //fprintf(stderr,"bindlist_cleanup\n"); - t_bindelem *e, *e2; + //fprintf(stderr,"bindlist_cleanup\n"); + t_bindelem *e, *e2; if (x->b_list->e_delayed_free == 1) { - e = x->b_list; + e = x->b_list; x->b_list = e->e_next; freebytes(e, sizeof(t_bindelem)); - //fprintf(stderr,"success B1a\n"); + //fprintf(stderr,"success B1a\n"); } for (e = x->b_list; e2 = e->e_next; e = e2) if (e2->e_delayed_free == 1) { e->e_next = e2->e_next; freebytes(e2, sizeof(t_bindelem)); - //fprintf(stderr,"success B1b\n"); + //fprintf(stderr,"success B1b\n"); break; } if (!x->b_list->e_next) { freebytes(x->b_list, sizeof(t_bindelem)); pd_free(&x->b_pd); - //fprintf(stderr,"success B2\n"); + //fprintf(stderr,"success B2\n"); } } @@ -110,48 +110,48 @@ static void bindlist_bang(t_bindlist *x) { t_bindelem *e; int save = change_bindlist_via_graph; - change_bindlist_via_graph = 1; + change_bindlist_via_graph = 1; for (e = x->b_list; e; e = e->e_next) if (e->e_who != NULL) pd_bang(e->e_who); - if (change_bindlist_via_graph > 1) - bindlist_cleanup(x); - change_bindlist_via_graph = save; + if (change_bindlist_via_graph > 1) + bindlist_cleanup(x); + change_bindlist_via_graph = save; } static void bindlist_float(t_bindlist *x, t_float f) { t_bindelem *e; int save = change_bindlist_via_graph; - change_bindlist_via_graph = 1; + change_bindlist_via_graph = 1; for (e = x->b_list; e; e = e->e_next) if (e->e_who != NULL) pd_float(e->e_who, f); - if (change_bindlist_via_graph > 1) - bindlist_cleanup(x); - change_bindlist_via_graph = save; + if (change_bindlist_via_graph > 1) + bindlist_cleanup(x); + change_bindlist_via_graph = save; } static void bindlist_symbol(t_bindlist *x, t_symbol *s) { t_bindelem *e; int save = change_bindlist_via_graph; - change_bindlist_via_graph = 1; + change_bindlist_via_graph = 1; for (e = x->b_list; e; e = e->e_next) if (e->e_who != NULL) pd_symbol(e->e_who, s); - if (change_bindlist_via_graph > 1) - bindlist_cleanup(x); - change_bindlist_via_graph = save; + if (change_bindlist_via_graph > 1) + bindlist_cleanup(x); + change_bindlist_via_graph = save; } static void bindlist_pointer(t_bindlist *x, t_gpointer *gp) { t_bindelem *e; int save = change_bindlist_via_graph; - change_bindlist_via_graph = 1; + change_bindlist_via_graph = 1; for (e = x->b_list; e; e = e->e_next) if (e->e_who != NULL) pd_pointer(e->e_who, gp); - if (change_bindlist_via_graph > 1) - bindlist_cleanup(x); - change_bindlist_via_graph = save; + if (change_bindlist_via_graph > 1) + bindlist_cleanup(x); + change_bindlist_via_graph = save; } static void bindlist_list(t_bindlist *x, t_symbol *s, @@ -159,12 +159,12 @@ static void bindlist_list(t_bindlist *x, t_symbol *s, { t_bindelem *e; int save = change_bindlist_via_graph; - change_bindlist_via_graph = 1; + change_bindlist_via_graph = 1; for (e = x->b_list; e; e = e->e_next) if (e->e_who != NULL) pd_list(e->e_who, s, argc, argv); - if (change_bindlist_via_graph > 1) - bindlist_cleanup(x); - change_bindlist_via_graph = save; + if (change_bindlist_via_graph > 1) + bindlist_cleanup(x); + change_bindlist_via_graph = save; } static void bindlist_anything(t_bindlist *x, t_symbol *s, @@ -172,12 +172,12 @@ static void bindlist_anything(t_bindlist *x, t_symbol *s, { t_bindelem *e; int save = change_bindlist_via_graph; - change_bindlist_via_graph = 1; + change_bindlist_via_graph = 1; for (e = x->b_list; e; e = e->e_next) if (e->e_who != NULL) pd_typedmess(e->e_who, s, argc, argv); - if (change_bindlist_via_graph > 1) - bindlist_cleanup(x); - change_bindlist_via_graph = save; + if (change_bindlist_via_graph > 1) + bindlist_cleanup(x); + change_bindlist_via_graph = save; } void m_pd_setup(void) @@ -194,107 +194,118 @@ void m_pd_setup(void) void pd_bind(t_pd *x, t_symbol *s) { - //fprintf(stderr,"pd_bind %s\n", s->s_name); + //fprintf(stderr,"pd_bind %s\n", s->s_name); if (s->s_thing) { if (*s->s_thing == bindlist_class) { - //fprintf(stderr,"pd_bind option 1A %lx\n", (t_int)x); + //fprintf(stderr,"pd_bind option 1A %lx\n", (t_int)x); t_bindlist *b = (t_bindlist *)s->s_thing; t_bindelem *e = (t_bindelem *)getbytes(sizeof(t_bindelem)); e->e_next = b->b_list; e->e_who = x; - e->e_delayed_free = 0; + e->e_delayed_free = 0; b->b_list = e; } else { - //fprintf(stderr,"pd_bind option 1B %lx\n", (t_int)x); + //fprintf(stderr,"pd_bind option 1B %lx\n", (t_int)x); t_bindlist *b = (t_bindlist *)pd_new(bindlist_class); t_bindelem *e1 = (t_bindelem *)getbytes(sizeof(t_bindelem)); t_bindelem *e2 = (t_bindelem *)getbytes(sizeof(t_bindelem)); b->b_list = e1; e1->e_who = x; e1->e_next = e2; - e1->e_delayed_free = 0; + e1->e_delayed_free = 0; e2->e_who = s->s_thing; e2->e_next = 0; - e2->e_delayed_free = 0; + e2->e_delayed_free = 0; s->s_thing = &b->b_pd; } } else { - //fprintf(stderr,"pd_bind option 2 %lx\n", (t_int)x); - s->s_thing = x; - } + //fprintf(stderr,"pd_bind option 2 %lx\n", (t_int)x); + s->s_thing = x; + } } void pd_unbind(t_pd *x, t_symbol *s) { - //fprintf(stderr,"pd_unbind %s\n", s->s_name); + //fprintf(stderr,"pd_unbind %s\n", s->s_name); if (s->s_thing == x) { - //fprintf(stderr,"pd_unbind option A %lx\n", (t_int)x); - s->s_thing = 0; - } + //fprintf(stderr,"pd_unbind option A %lx\n", (t_int)x); + s->s_thing = 0; + } else if (s->s_thing && *s->s_thing == bindlist_class) { - /* bindlists always have at least two elements... if the number - goes down to one, get rid of the bindlist and bind the symbol - straight to the remaining element. */ + /* bindlists always have at least two elements... if the number + goes down to one, get rid of the bindlist and bind the symbol + straight to the remaining element. */ - /* in pd-l2ork, we however also check whether changes to the bindlist - occur via graph (through code execution, e.g. dynamic change of receives) - and if so, we do not deallocate memory until the entire bindlist_<datatype> - function is complete with its execution, after which we call - bindlist_cleanup(). we control the execution via static int variable - change_bindlist_via_graph */ + /* in pd-l2ork, we however also check whether changes to the bindlist + occur via graph (through code execution, e.g. dynamic change of + receives) and if so, we do not deallocate memory until the entire + bindlist_<datatype> function is complete with its execution, after + which we call bindlist_cleanup(). we control the execution via + static int variable change_bindlist_via_graph */ - //fprintf(stderr,"pd_unbind option B %lx\n", (t_int)x); + //fprintf(stderr,"pd_unbind option B %lx\n", (t_int)x); t_bindlist *b = (t_bindlist *)s->s_thing; t_bindelem *e, *e2; if ((e = b->b_list)->e_who == x) { - if (change_bindlist_via_graph) { - change_bindlist_via_graph++; - e->e_delayed_free = 1; - } else { - b->b_list = e->e_next; - freebytes(e, sizeof(t_bindelem)); - } - //fprintf(stderr,"success B1a\n"); + if (change_bindlist_via_graph) + { + change_bindlist_via_graph++; + e->e_delayed_free = 1; + } + else + { + b->b_list = e->e_next; + freebytes(e, sizeof(t_bindelem)); + } + //fprintf(stderr,"success B1a\n"); } else for (e = b->b_list; e2 = e->e_next; e = e2) - if (e2->e_who == x) { - if (change_bindlist_via_graph) { - change_bindlist_via_graph++; - e2->e_delayed_free = 1; - } else { - e->e_next = e2->e_next; - freebytes(e2, sizeof(t_bindelem)); - } - //fprintf(stderr,"success B1b\n"); - break; + if (e2->e_who == x) + { + if (change_bindlist_via_graph) + { + change_bindlist_via_graph++; + e2->e_delayed_free = 1; + } + else + { + e->e_next = e2->e_next; + freebytes(e2, sizeof(t_bindelem)); + } + //fprintf(stderr,"success B1b\n"); + break; + } } - int count_valid = 0; - t_bindelem *e1 = NULL; + int count_valid = 0; + t_bindelem *e1 = NULL; for (e = b->b_list; e; e = e->e_next) { - if (e->e_who != NULL && !e->e_delayed_free) { - count_valid++; - e1 = e; - } + if (e->e_who != NULL && !e->e_delayed_free) + { + count_valid++; + e1 = e; + } - } - if (count_valid == 1) { + } + if (count_valid == 1) + { s->s_thing = e1->e_who; - if (!change_bindlist_via_graph) { - freebytes(b->b_list, sizeof(t_bindelem)); - pd_free(&b->b_pd); - } - //fprintf(stderr,"success B2\n"); + if (!change_bindlist_via_graph) + { + freebytes(b->b_list, sizeof(t_bindelem)); + pd_free(&b->b_pd); + } + //fprintf(stderr,"success B2\n"); } } else pd_error(x, "%s: couldn't unbind", s->s_name); @@ -314,19 +325,19 @@ t_pd *pd_findbyclass(t_symbol *s, t_class *c) t_bindelem *e, *e2; int warned = 0; for (e = b->b_list; e; e = e->e_next) - { + { //if (e->e_who != NULL && *e->e_who == c) if (e->e_delayed_free != 1 && *e->e_who == c) - { - if (x && !warned) - { - zz(); - post("warning: %s: multiply defined", s->s_name); - warned = 1; - } - x = e->e_who; - } - } + { + if (x && !warned) + { + zz(); + post("warning: %s: multiply defined", s->s_name); + warned = 1; + } + x = e->e_who; + } + } } return x; } @@ -370,10 +381,11 @@ extern int abort_when_pasting_from_external_buffer; void pd_popsym(t_pd *x) { - if (!gstack_head || s__X.s_thing != x) { - abort_when_pasting_from_external_buffer = 1; - bug("gstack_pop"); - } + if (!gstack_head || s__X.s_thing != x) + { + abort_when_pasting_from_external_buffer = 1; + bug("gstack_pop"); + } else { t_gstack *headwas = gstack_head;