t_symbol *gensym(char *s) { // printf("gensym: %s\n", s); #ifdef ROCKBOX if(s == NULL) return dogensym("/", 0); else #endif return(dogensym(s, 0)); }
EXTERN t_pdinstance *pdinstance_new(void) { t_pdinstance *x = (t_pdinstance *)getbytes(sizeof(t_pdinstance)); t_class *c; int i; pd_this = x; s_inter_newpdinstance(); pdinstance_init(x); sys_lock(); pd_globallock(); pd_instances = (t_pdinstance **)resizebytes(pd_instances, pd_ninstances * sizeof(*pd_instances), (pd_ninstances+1) * sizeof(*pd_instances)); pd_instances[pd_ninstances] = x; for (c = class_list; c; c = c->c_next) { c->c_methods = (t_methodentry **)t_resizebytes(c->c_methods, pd_ninstances * sizeof(*c->c_methods), (pd_ninstances + 1) * sizeof(*c->c_methods)); c->c_methods[pd_ninstances] = t_getbytes(0); for (i = 0; i < c->c_nmethod; i++) class_addmethodtolist(c, &c->c_methods[pd_ninstances], i, c->c_methods[0][i].me_fun, dogensym(c->c_methods[0][i].me_name->s_name, 0, x), c->c_methods[0][i].me_arg, x); } pd_ninstances++; pdinstance_renumber(); pd_bind(&glob_pdobject, gensym("pd")); text_template_init(); garray_init(); pd_globalunlock(); sys_unlock(); return (x); }
static void class_addmethodtolist(t_class *c, t_methodentry **methodlist, int nmethod, t_gotfn fn, t_symbol *sel, t_atomtype *args, t_pdinstance *pdinstance) { int i; t_methodentry *m; for (i = 0; i < nmethod; i++) if ((*methodlist)[i].me_name == sel) { char nbuf[80]; snprintf(nbuf, 80, "%s_aliased", sel->s_name); nbuf[79] = 0; (*methodlist)[i].me_name = dogensym(nbuf, 0, pdinstance); if (c == pd_objectmaker) verbose(1, "warning: class '%s' overwritten; old one renamed '%s'", sel->s_name, nbuf); else verbose(1, "warning: old method '%s' for class '%s' renamed '%s'", sel->s_name, c->c_name->s_name, nbuf); } (*methodlist) = t_resizebytes((*methodlist), nmethod * sizeof(**methodlist), (nmethod + 1) * sizeof(**methodlist)); m = (*methodlist) + nmethod; m->me_name = sel; m->me_fun = (t_gotfn)fn; i = 0; while ((m->me_arg[i] = args[i])) i++; }
void mess_init(void) { t_symbol **sp; int i; if (pd_objectmaker) return; for (i = sizeof(symlist)/sizeof(*symlist), sp = symlist; i--; sp++) (void) dogensym((*sp)->s_name, *sp); pd_objectmaker = class_new(gensym("objectmaker"), 0, 0, sizeof(t_pd), CLASS_DEFAULT, A_NULL); pd_canvasmaker = class_new(gensym("classmaker"), 0, 0, sizeof(t_pd), CLASS_DEFAULT, A_NULL); pd_bind(&pd_canvasmaker, &s__N); class_addanything(pd_objectmaker, (t_method)new_anything); }
t_symbol *gensym(const char *s) { return(dogensym(s, 0)); }
t_symbol *gensym(const char *s) { return(dogensym(s, 0, pd_this)); }
static t_pdinstance *pdinstance_init(t_pdinstance *x) { int i; x->pd_systime = 0; x->pd_clock_setlist = 0; x->pd_canvaslist = 0; x->pd_symhash = getbytes(SYMTABHASHSIZE * sizeof(*x->pd_symhash)); for (i = 0; i < SYMTABHASHSIZE; i++) x->pd_symhash[i] = 0; #ifdef PDINSTANCE dogensym("pointer", &x->pd_s_pointer, x); dogensym("float", &x->pd_s_float, x); dogensym("symbol", &x->pd_s_symbol, x); dogensym("bang", &x->pd_s_bang, x); dogensym("list", &x->pd_s_list, x); dogensym("anything", &x->pd_s_anything, x); dogensym("signal", &x->pd_s_signal, x); dogensym("#N", &x->pd_s__N, x); dogensym("#X", &x->pd_s__X, x); dogensym("x", &x->pd_s_x, x); dogensym("y", &x->pd_s_y, x); dogensym("", &x->pd_s_, x); pd_this = x; #else dogensym("pointer", &s_pointer, x); dogensym("float", &s_float, x); dogensym("symbol", &s_symbol, x); dogensym("bang", &s_bang, x); dogensym("list", &s_list, x); dogensym("anything", &s_anything, x); dogensym("signal", &s_signal, x); dogensym("#N", &s__N, x); dogensym("#X", &s__X, x); dogensym("x", &s_x, x); dogensym("y", &s_y, x); dogensym("", &s_, x); #endif x_midi_newpdinstance(); g_canvas_newpdinstance(); d_ugen_newpdinstance(); s_stuff_newpdinstance(); return (x); }
void class_addmethod(t_class *c, t_method fn, t_symbol *sel, t_atomtype arg1, ...) { va_list ap; t_methodentry *m; t_atomtype argtype = arg1; int nargs, i; va_start(ap, arg1); /* "signal" method specifies that we take audio signals but that we don't want automatic float to signal conversion. This is obsolete; you should now use the CLASS_MAINSIGNALIN macro. */ if (sel == &s_signal) { if (c->c_floatsignalin) post("warning: signal method overrides class_mainsignalin"); c->c_floatsignalin = -1; } /* check for special cases. "Pointer" is missing here so that pd_objectmaker's pointer method can be typechecked differently. */ if (sel == &s_bang) { if (argtype) goto phooey; class_addbang(c, fn); } else if (sel == &s_float) { if (argtype != A_FLOAT || va_arg(ap, t_atomtype)) goto phooey; class_doaddfloat(c, fn); } else if (sel == &s_symbol) { if (argtype != A_SYMBOL || va_arg(ap, t_atomtype)) goto phooey; class_addsymbol(c, fn); } else if (sel == &s_list) { if (argtype != A_GIMME) goto phooey; class_addlist(c, fn); } else if (sel == &s_anything) { if (argtype != A_GIMME) goto phooey; class_addanything(c, fn); } else { t_atomtype argvec[MAXPDARG+1]; nargs = 0; while (argtype != A_NULL && nargs < MAXPDARG) { argvec[nargs++] = argtype; argtype = va_arg(ap, t_atomtype); } if (argtype != A_NULL) error("%s_%s: only 5 arguments are typecheckable; use A_GIMME", c->c_name->s_name, sel->s_name); argvec[nargs] = 0; #ifdef PDINSTANCE for (i = 0; i < pd_ninstances; i++) { class_addmethodtolist(c, &c->c_methods[i], c->c_nmethod, (t_gotfn)fn, dogensym(sel->s_name, 0, pd_instances[i]), argvec, pd_instances[i]); } #else class_addmethodtolist(c, &c->c_methods, c->c_nmethod, (t_gotfn)fn, sel, argvec, &pd_maininstance); #endif c->c_nmethod++; } goto done; phooey: bug("class_addmethod: %s_%s: bad argument types\n", c->c_name->s_name, sel->s_name); done: va_end(ap); return; }
EXTERN void pdinstance_free(t_pdinstance *x) { t_symbol *s; t_canvas *canvas; int i, instanceno = x->pd_instanceno; t_class *c; pd_setinstance(x); sys_lock(); pd_globallock(); canvas_suspend_dsp(); while (x->pd_canvaslist) pd_free((t_pd *)x->pd_canvaslist); for (c = class_list; c; c = c->c_next) { c->c_methods = (t_methodentry **)t_resizebytes(c->c_methods, pd_ninstances * sizeof(*c->c_methods), (pd_ninstances + 1) * sizeof(*c->c_methods)); c->c_methods[pd_ninstances] = t_getbytes(0); for (i = 0; i < c->c_nmethod; i++) class_addmethodtolist(c, &c->c_methods[pd_ninstances], i, c->c_methods[0][i].me_fun, dogensym(c->c_methods[0][i].me_name->s_name, 0, x), c->c_methods[0][i].me_arg, x); } for (i =0; i < SYMTABHASHSIZE; i++) { while ((s = x->pd_symhash[i])) { x->pd_symhash[i] = s->s_next; if(s != &x->pd_s_pointer && s != &x->pd_s_float && s != &x->pd_s_symbol && s != &x->pd_s_bang && s != &x->pd_s_list && s != &x->pd_s_anything && s != &x->pd_s_signal && s != &x->pd_s__N && s != &x->pd_s__X && s != &x->pd_s_x && s != &x->pd_s_y && s != &x->pd_s_) freebytes(s, sizeof(*s)); } } freebytes(x->pd_symhash, SYMTABHASHSIZE * sizeof (*x->pd_symhash)); x_midi_freepdinstance(); g_canvas_freepdinstance(); d_ugen_freepdinstance(); s_stuff_freepdinstance(); s_inter_freepdinstance(); for (i = instanceno; i < pd_ninstances-1; i++) pd_instances[i] = pd_instances[i+1]; pd_instances = (t_pdinstance **)resizebytes(pd_instances, pd_ninstances * sizeof(*pd_instances), (pd_ninstances-1) * sizeof(*pd_instances)); pd_ninstances--; pdinstance_renumber(); pd_globalunlock(); sys_unlock(); pd_setinstance(&pd_maininstance); }