diff --git a/pd/src/g_traversal.c b/pd/src/g_traversal.c index 4e6aeef8c82b91f318ad929174b609a6d487c5b1..49488dd169d8074a249aa7fbacf32935014769d8 100644 --- a/pd/src/g_traversal.c +++ b/pd/src/g_traversal.c @@ -414,14 +414,19 @@ static void *get_new(t_symbol *why, int argc, t_atom *argv) t_get *x = (t_get *)pd_new(get_class); int i; t_getvariable *sp; + int varcount; x->x_templatesym = canvas_makebindsym(atom_getsymbolarg(0, argc, argv)); if (argc) argc--, argv++; + varcount = argc ? argc : 1; /* have at least one outlet */ x->x_variables - = (t_getvariable *)getbytes(argc * sizeof (*x->x_variables)); - x->x_nout = argc; - for (i = 0, sp = x->x_variables; i < argc; i++, sp++) + = (t_getvariable *)getbytes(varcount * sizeof (*x->x_variables)); + x->x_nout = varcount; + for (i = 0, sp = x->x_variables; i < varcount; i++, sp++) { - sp->gv_sym = atom_getsymbolarg(i, argc, argv); + if (argc) + sp->gv_sym = atom_getsymbolarg(i, argc, argv); + else + sp->gv_sym = &s_; /* just set field to empty symbol if no args */ sp->gv_outlet = outlet_new(&x->x_obj, 0); /* LATER connect with the template and set the outlet's type correctly. We can't yet guarantee that the template is there @@ -430,6 +435,20 @@ static void *get_new(t_symbol *why, int argc, t_atom *argv) return (x); } +static void get_set(t_get *x, t_symbol *templatesym, t_symbol *field) +{ + if (x->x_nout != 1) + { + pd_error(x, "get: cannot set multiple fields."); + return; + } + else + { + x->x_templatesym = canvas_makebindsym(templatesym); + x->x_variables->gv_sym = field; + } +} + static void get_pointer(t_get *x, t_gpointer *gp) { int nitems = x->x_nout, i; @@ -480,6 +499,8 @@ static void get_setup(void) get_class = class_new(gensym("get"), (t_newmethod)get_new, (t_method)get_free, sizeof(t_get), 0, A_GIMME, 0); class_addpointer(get_class, get_pointer); + class_addmethod(get_class, (t_method)get_set, gensym("set"), + A_SYMBOL, A_SYMBOL, 0); } /* ---------------------- set ----------------------------- */ @@ -507,6 +528,7 @@ static void *set_new(t_symbol *why, int argc, t_atom *argv) t_set *x = (t_set *)pd_new(set_class); int i; t_setvariable *sp; + int varcount; if (argc && (argv[0].a_type == A_SYMBOL) && !strcmp(argv[0].a_w.w_symbol->s_name, "-symbol")) { @@ -517,23 +539,24 @@ static void *set_new(t_symbol *why, int argc, t_atom *argv) else x->x_issymbol = 0; x->x_templatesym = canvas_makebindsym(atom_getsymbolarg(0, argc, argv)); if (argc) argc--, argv++; + varcount = argc ? argc : 1; /* have at least one variable */ x->x_variables - = (t_setvariable *)getbytes(argc * sizeof (*x->x_variables)); - x->x_nin = argc; - if (argc) + = (t_setvariable *)getbytes(varcount * sizeof (*x->x_variables)); + x->x_nin = varcount; + for (i = 0, sp = x->x_variables; i < varcount; i++, sp++) { - for (i = 0, sp = x->x_variables; i < argc; i++, sp++) - { + if (argc) sp->gv_sym = atom_getsymbolarg(i, argc, argv); + else + sp->gv_sym = &s_; + if (x->x_issymbol) + sp->gv_w.w_symbol = &s_; + else sp->gv_w.w_float = 0; + if (i) + { if (x->x_issymbol) - sp->gv_w.w_symbol = &s_; - else sp->gv_w.w_float = 0; - if (i) - { - if (x->x_issymbol) - symbolinlet_new(&x->x_obj, &sp->gv_w.w_symbol); - else floatinlet_new(&x->x_obj, &sp->gv_w.w_float); - } + symbolinlet_new(&x->x_obj, &sp->gv_w.w_symbol); + else floatinlet_new(&x->x_obj, &sp->gv_w.w_float); } } pointerinlet_new(&x->x_obj, &x->x_gp); @@ -541,6 +564,24 @@ static void *set_new(t_symbol *why, int argc, t_atom *argv) return (x); } +static void set_set(t_set *x, t_symbol *templatesym, t_symbol *field) +{ + if (x->x_nin != 1) + { + pd_error(x, "set: cannot set multiple fields."); + return; + } + else + { + x->x_templatesym = canvas_makebindsym(templatesym); + x->x_variables->gv_sym = field; + if (x->x_issymbol) + x->x_variables->gv_w.w_symbol = &s_; + else + x->x_variables->gv_w.w_float = 0; + } +} + static void set_bang(t_set *x) { int nitems = x->x_nin, i; @@ -621,6 +662,8 @@ static void set_setup(void) class_addfloat(set_class, set_float); class_addsymbol(set_class, set_symbol); class_addbang(set_class, set_bang); + class_addmethod(set_class, (t_method)set_set, gensym("set"), + A_SYMBOL, A_SYMBOL, 0); } /* ---------------------- elem ----------------------------- */ @@ -648,6 +691,12 @@ static void *elem_new(t_symbol *templatesym, t_symbol *fieldsym) return (x); } +static void elem_set(t_elem *x, t_symbol *templatesym, t_symbol *fieldsym) +{ + x->x_templatesym = canvas_makebindsym(templatesym); + x->x_fieldsym = fieldsym; +} + static void elem_float(t_elem *x, t_float f) { int indx = f, nitems, onset; @@ -720,6 +769,8 @@ static void elem_setup(void) elem_class = class_new(gensym("element"), (t_newmethod)elem_new, (t_method)elem_free, sizeof(t_elem), 0, A_DEFSYM, A_DEFSYM, 0); class_addfloat(elem_class, elem_float); + class_addmethod(elem_class, (t_method)elem_set, gensym("set"), + A_SYMBOL, A_SYMBOL, 0); } /* ---------------------- getsize ----------------------------- */ @@ -742,6 +793,12 @@ static void *getsize_new(t_symbol *templatesym, t_symbol *fieldsym) return (x); } +static void getsize_set(t_getsize *x, t_symbol *templatesym, t_symbol *fieldsym) +{ + x->x_templatesym = canvas_makebindsym(templatesym); + x->x_fieldsym = fieldsym; +} + static void getsize_pointer(t_getsize *x, t_gpointer *gp) { int onset, type; @@ -790,6 +847,8 @@ static void getsize_setup(void) getsize_class = class_new(gensym("getsize"), (t_newmethod)getsize_new, 0, sizeof(t_getsize), 0, A_DEFSYM, A_DEFSYM, 0); class_addpointer(getsize_class, getsize_pointer); + class_addmethod(getsize_class, (t_method)getsize_set, gensym("set"), + A_SYMBOL, A_SYMBOL, 0); } /* ---------------------- setsize ----------------------------- */ @@ -816,6 +875,12 @@ static void *setsize_new(t_symbol *templatesym, t_symbol *fieldsym, return (x); } +static void setsize_set(t_setsize *x, t_symbol *templatesym, t_symbol *fieldsym) +{ + x->x_templatesym = canvas_makebindsym(templatesym); + x->x_fieldsym = fieldsym; +} + static void setsize_float(t_setsize *x, t_float f) { int nitems, onset, type; @@ -944,6 +1009,9 @@ static void setsize_setup(void) (t_method)setsize_free, sizeof(t_setsize), 0, A_DEFSYM, A_DEFSYM, A_DEFFLOAT, 0); class_addfloat(setsize_class, setsize_float); + class_addmethod(setsize_class, (t_method)setsize_set, gensym("set"), + A_SYMBOL, A_SYMBOL, 0); + } /* ---------------------- append ----------------------------- */ @@ -970,19 +1038,21 @@ static void *append_new(t_symbol *why, int argc, t_atom *argv) t_append *x = (t_append *)pd_new(append_class); int i; t_appendvariable *sp; + int varcount; x->x_templatesym = canvas_makebindsym(atom_getsymbolarg(0, argc, argv)); if (argc) argc--, argv++; + varcount = argc ? argc : 1; /* have at least one variable */ x->x_variables - = (t_appendvariable *)getbytes(argc * sizeof (*x->x_variables)); - x->x_nin = argc; - if (argc) + = (t_appendvariable *)getbytes(varcount * sizeof (*x->x_variables)); + x->x_nin = varcount; + for (i = 0, sp = x->x_variables; i < argc; i++, sp++) { - for (i = 0, sp = x->x_variables; i < argc; i++, sp++) - { + if (argc) sp->gv_sym = atom_getsymbolarg(i, argc, argv); - sp->gv_f = 0; - if (i) floatinlet_new(&x->x_obj, &sp->gv_f); - } + else + sp->gv_sym = &s_; + sp->gv_f = 0; + if (i) floatinlet_new(&x->x_obj, &sp->gv_f); } pointerinlet_new(&x->x_obj, &x->x_gp); outlet_new(&x->x_obj, &s_pointer); @@ -990,6 +1060,21 @@ static void *append_new(t_symbol *why, int argc, t_atom *argv) return (x); } +static void append_set(t_append *x, t_symbol *templatesym, t_symbol *field) +{ + if (x->x_nin != 1) + { + pd_error(x, "set: cannot set multiple fields."); + return; + } + else + { + x->x_templatesym = canvas_makebindsym(templatesym); + x->x_variables->gv_sym = field; + x->x_variables->gv_f = 0; + } +} + static void append_float(t_append *x, t_float f) { int nitems = x->x_nin, i; @@ -1070,6 +1155,8 @@ static void append_setup(void) append_class = class_new(gensym("append"), (t_newmethod)append_new, (t_method)append_free, sizeof(t_append), 0, A_GIMME, 0); class_addfloat(append_class, append_float); + class_addmethod(append_class, (t_method)append_set, gensym("set"), + A_SYMBOL, A_SYMBOL, 0); } /* ---------------------- sublist ----------------------------- */