[PD-cvs] pd/src kernel.c, 1.1.2.25, 1.1.2.26 m_pd.h, 1.4.4.11.2.33.2.31, 1.4.4.11.2.33.2.32
Mathieu Bouchard
matju at users.sourceforge.net
Thu Jan 4 18:15:24 CET 2007
Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13194
Modified Files:
Tag: desiredata
kernel.c m_pd.h
Log Message:
added class_addcreator2, class_new2
Index: m_pd.h
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_pd.h,v
retrieving revision 1.4.4.11.2.33.2.31
retrieving revision 1.4.4.11.2.33.2.32
diff -C2 -d -r1.4.4.11.2.33.2.31 -r1.4.4.11.2.33.2.32
*** m_pd.h 3 Jan 2007 19:45:24 -0000 1.4.4.11.2.33.2.31
--- m_pd.h 4 Jan 2007 17:15:22 -0000 1.4.4.11.2.33.2.32
***************
*** 483,490 ****
EXTERN t_class *class_find (t_symbol *s);
! EXTERN t_class *class_new(t_symbol *name, t_newmethod newmethod,
t_method freemethod, size_t size, int flags, t_atomtypearg arg1, ...);
! EXTERN void class_addcreator(t_newmethod newmethod, t_symbol *sel, t_atomtypearg arg1, ...);
! EXTERN void class_addmethod(t_class *c, t_method fn, t_symbol *sel, t_atomtypearg arg1, ...);
EXTERN void class_addmethod2(t_class *c, t_method fn, t_symbol *sel, const char *sig);
EXTERN void class_addbang( t_class *c, t_method fn);
--- 483,493 ----
EXTERN t_class *class_find (t_symbol *s);
! EXTERN t_class *class_new( t_symbol *name, t_newmethod newmethod,
t_method freemethod, size_t size, int flags, t_atomtypearg arg1, ...);
! EXTERN t_class *class_new2(t_symbol *name, t_newmethod newmethod,
! t_method freemethod, size_t size, int flags, const char *sig);
! EXTERN void class_addcreator( t_newmethod newmethod, t_symbol *sel, t_atomtypearg arg1, ...);
! EXTERN void class_addcreator2(t_newmethod newmethod, t_symbol *sel, const char *sig);
! EXTERN void class_addmethod( t_class *c, t_method fn, t_symbol *sel, t_atomtypearg arg1, ...);
EXTERN void class_addmethod2(t_class *c, t_method fn, t_symbol *sel, const char *sig);
EXTERN void class_addbang( t_class *c, t_method fn);
Index: kernel.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/kernel.c,v
retrieving revision 1.1.2.25
retrieving revision 1.1.2.26
diff -C2 -d -r1.1.2.25 -r1.1.2.26
*** kernel.c 3 Jan 2007 19:45:24 -0000 1.1.2.25
--- kernel.c 4 Jan 2007 17:15:22 -0000 1.1.2.26
***************
*** 1030,1054 ****
}
! /* for now we assume that all "gobjs" are text unless explicitly
! overridden later by calling class_setbehavior(). I'm not sure
! how to deal with Pds that aren't gobjs; shouldn't there be a
! way to check that at run time? Perhaps the presence of a "newmethod"
! should be our cue, or perhaps the "tiny" flag. */
!
! /* another matter. This routine does two unrelated things: it creates
! a Pd class, but also adds a "new" method to create an instance of it.
! These are combined for historical reasons and for brevity in writing
! objects. To avoid adding a "new" method send a null function pointer.
! To add additional ones, use class_addcreator below. Some "classes", like
! "select", are actually two classes of the same name, one for the single-
! argument form, one for the multiple one; see select_setup() to find out
! how this is handled. */
! t_class *class_new(t_symbol *s, t_newmethod newmethod, t_method freemethod,
! size_t size, int flags, t_atomtypearg type1, ...) {
! va_list ap;
! t_atomtype vec[MAXPDARG+1], *vp = vec;
! int count = 0;
! t_class *c;
#ifdef QUALIFIED_NAME
t_symbol *S=gensym(s->name);
--- 1030,1044 ----
}
! t_symbol *qualified_name(t_symbol *s) {
! char namespacename[MAXPDSTRING];
! sprintf(namespacename, "%s%s%s", pd_library_name, QUALIFIED_NAME, s->name);
! return gensym(namespacename);
! }
! /* Note that some classes such as "select", are actually two classes of the same name,
! one for the single-argument form, one for the multiple one; see select_setup() to
! find out how this is handled. */
! t_class *class_new2(t_symbol *s, t_newmethod newmethod, t_method freemethod,
! size_t size, int flags, const char *sig) {
#ifdef QUALIFIED_NAME
t_symbol *S=gensym(s->name);
***************
*** 1056,1106 ****
int typeflag = flags & CLASS_TYPEMASK;
if (!typeflag) typeflag = CLASS_PATCHABLE;
- *vp = (t_atomtype)type1;
-
- va_start(ap, type1);
- while (*vp) {
- if (count == MAXPDARG) {
- error("class %s: sorry: only %d creation args allowed", s->name, MAXPDARG);
- break;
- }
- vp++;
- count++;
- *vp = (t_atomtype)va_arg(ap,int);
- }
- va_end(ap);
-
#ifdef QUALIFIED_NAME
! if (pd_library_name) {
! char namespacename[MAXPDSTRING];
! sprintf(namespacename, "%s%s%s", pd_library_name, QUALIFIED_NAME, s->name);
! s=gensym(namespacename);
! }
#endif
-
if (pd_objectmaker._class && newmethod) {
/* add a "new" method by the name specified by the object */
! class_addmethod(pd_objectmaker._class, (t_method)newmethod, s, vec[0], vec[1], vec[2], vec[3], vec[4], vec[5]);
if (class_loadsym) {
/* if we're loading an extern it might have been invoked by a
longer file name; in this case, make this an admissible name too. */
! char *loadstring = class_loadsym->name,
! l1 = strlen(s->name), l2 = strlen(loadstring);
if (l2 > l1 && !strcmp(s->name, loadstring + (l2 - l1)))
! class_addmethod(pd_objectmaker._class, (t_method)newmethod, class_loadsym,
! vec[0], vec[1], vec[2], vec[3], vec[4], vec[5]);
}
}
! c = (t_class *)t_getbytes(sizeof(*c));
c->name = c->helpname = s;
c->size = size;
c->methods = (t_methodentry *)t_getbytes(0);
c->nmethod = 0;
! c->freemethod = (t_method)freemethod;
! c->bangmethod = pd_defaultbang;
c->pointermethod = pd_defaultpointer;
! c->floatmethod = pd_defaultfloat;
! c->symbolmethod = pd_defaultsymbol;
! c->listmethod = pd_defaultlist;
! c->anymethod = pd_defaultanything;
c->firstin = ((flags & CLASS_NOINLET) == 0);
c->firsttip = gensym("?");
--- 1046,1075 ----
int typeflag = flags & CLASS_TYPEMASK;
if (!typeflag) typeflag = CLASS_PATCHABLE;
#ifdef QUALIFIED_NAME
! if (pd_library_name) s = qualified_name(s);
#endif
if (pd_objectmaker._class && newmethod) {
/* add a "new" method by the name specified by the object */
! class_addmethod2(pd_objectmaker._class, (t_method)newmethod, s, sig);
if (class_loadsym) {
/* if we're loading an extern it might have been invoked by a
longer file name; in this case, make this an admissible name too. */
! char *loadstring = class_loadsym->name, l1 = strlen(s->name), l2 = strlen(loadstring);
if (l2 > l1 && !strcmp(s->name, loadstring + (l2 - l1)))
! class_addmethod2(pd_objectmaker._class, (t_method)newmethod, class_loadsym, sig);
}
}
! t_class *c = (t_class *)t_getbytes(sizeof(*c));
c->name = c->helpname = s;
c->size = size;
c->methods = (t_methodentry *)t_getbytes(0);
c->nmethod = 0;
! c->freemethod = (t_method)freemethod;
! c->bangmethod = pd_defaultbang;
c->pointermethod = pd_defaultpointer;
! c->floatmethod = pd_defaultfloat;
! c->symbolmethod = pd_defaultsymbol;
! c->listmethod = pd_defaultlist;
! c->anymethod = pd_defaultanything;
c->firstin = ((flags & CLASS_NOINLET) == 0);
c->firsttip = gensym("?");
***************
*** 1116,1122 ****
c->helpname = S;
// like a class_addcreator
! if (pd_library_name && newmethod) {
! class_addmethod(pd_objectmaker._class, (t_method)newmethod, S, vec[0], vec[1], vec[2], vec[3], vec[4], vec[5]);
! }
#endif
hash_set(class_table, c->name, c);
--- 1085,1090 ----
c->helpname = S;
// like a class_addcreator
! if (pd_library_name && newmethod)
! class_addmethod2(pd_objectmaker._class, (t_method)newmethod, S, sig);
#endif
hash_set(class_table, c->name, c);
***************
*** 1128,1156 ****
can belong to, but this won't be used until the newmethod is actually
called back (and the new method explicitly takes care of this.) */
! void class_addcreator(t_newmethod newmethod, t_symbol *s, t_atomtypearg type1, ...) {
! va_list ap;
! t_atomtype vec[MAXPDARG+1], *vp = vec;
! int count = 0;
! *vp = (t_atomtype)type1;
! va_start(ap, type1);
! while (*vp) {
! if (count == MAXPDARG) {
! error("class %s: sorry: only %d creation args allowed", s->name, MAXPDARG);
! break;
! }
! vp++;
! count++;
! *vp = (t_atomtype)va_arg(ap,int);
! }
! va_end(ap);
! class_addmethod(pd_objectmaker._class, (t_method)newmethod, s, vec[0], vec[1], vec[2], vec[3], vec[4], vec[5]);
!
#ifdef QUALIFIED_NAME
! if (pd_library_name) {
! char namespacename[MAXPDSTRING];
! sprintf(namespacename, "%s%s%s", pd_library_name, QUALIFIED_NAME, s->name);
! s=gensym(namespacename);
! }
! class_addmethod(pd_objectmaker._class, (t_method)newmethod, s, vec[0], vec[1], vec[2], vec[3], vec[4], vec[5]);
#endif
hash_set(class_table,s,0);
--- 1096,1104 ----
can belong to, but this won't be used until the newmethod is actually
called back (and the new method explicitly takes care of this.) */
! void class_addcreator2(t_newmethod newmethod, t_symbol *s, const char *sig) {
! class_addmethod2(pd_objectmaker._class, (t_method)newmethod, s, sig);
#ifdef QUALIFIED_NAME
! if (pd_library_name) s = qualified_name(s);
! class_addmethod2(pd_objectmaker._class, (t_method)newmethod, s, sig);
#endif
hash_set(class_table,s,0);
***************
*** 1170,1178 ****
/* 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!='f' || *fmt) goto phooey; class_doaddfloat(c,fn);}
! else if (sel == &s_symbol) {if (argtype!='s' || *fmt) goto phooey; class_addsymbol(c, fn);}
! else if (sel == &s_list) {if (argtype!='*') goto phooey; class_addlist(c, fn);}
! else if (sel == &s_anything) {if (argtype != A_GIMME) goto phooey; class_addanything(c, fn);}
else {
c->methods = (t_methodentry *)t_resizebytes(c->methods,
--- 1118,1127 ----
/* check for special cases. "Pointer" is missing here so that
pd_objectmaker's pointer method can be typechecked differently. */
! /* is anyone actually using those five cases? */
! if (sel==&s_bang) {if (argtype) goto phooey; class_addbang( c,fn);}
! else if (sel==&s_float) {if (argtype!='f'||*fmt) goto phooey; class_doaddfloat( c,fn);}
! else if (sel==&s_symbol) {if (argtype!='s'||*fmt) goto phooey; class_addsymbol( c,fn);}
! else if (sel==&s_list) {if (argtype!='*') goto phooey; class_addlist( c,fn);}
! else if (sel==&s_anything) {if (argtype!='*') goto phooey; class_addanything(c,fn);}
else {
c->methods = (t_methodentry *)t_resizebytes(c->methods,
***************
*** 1202,1207 ****
argtype = *fmt++;
}
! if (argtype != A_NULL)
! error("%s_%s: only 5 arguments are typecheckable; use A_GIMME", c->name->name, sel->name);
m->me_arg[nargs] = A_NULL;
}
--- 1151,1155 ----
argtype = *fmt++;
}
! if (argtype) error("%s_%s: only 5 arguments are typecheckable; use A_GIMME aka '*'", c->name->name, sel->name);
m->me_arg[nargs] = A_NULL;
}
***************
*** 1211,1229 ****
}
void class_addmethod(t_class *c, t_method fn, t_symbol *sel, t_atomtypearg arg1, ...) {
! char fmt[42],*f=fmt;
! int t;
! va_list ap;
! va_start(ap,arg1);
! t=arg1;
! for(;;) {
! if (!t) break;
if (t>A_CANT) {error("class_addmethod: ARRGH! t=%d",t); return;}
*f++ = " fsp;,FS$@*!"[t];
t=(t_atomtype)va_arg(ap,int);
}
! *f = 0;
! va_end(ap);
! class_addmethod2(c,fn,sel,fmt);
}
--- 1159,1189 ----
}
+ t_class *class_new(t_symbol *s, t_newmethod newmethod, t_method freemethod,
+ size_t size, int flags, t_atomtypearg arg1, ...) {
+ char fmt[42],*f=fmt; va_list ap; va_start(ap,arg1); int t=arg1;
+ while(t) {
+ if (t>A_CANT) {error("class_new: ARRGH! t=%d",t); return 0;}
+ *f++ = " fsp;,FS$@*!"[t];
+ t=(t_atomtype)va_arg(ap,int);
+ }
+ *f=0; va_end(ap); return class_new2(s,newmethod,freemethod,size,flags,fmt);
+ }
+ void class_addcreator(t_newmethod newmethod, t_symbol *s, t_atomtypearg arg1, ...) {
+ char fmt[42],*f=fmt; va_list ap; va_start(ap,arg1); int t=arg1;
+ while(t) {
+ if (t>A_CANT) {error("class_addcreator: ARRGH! t=%d",t); return;}
+ *f++ = " fsp;,FS$@*!"[t];
+ t=(t_atomtype)va_arg(ap,int);
+ }
+ *f=0; va_end(ap); class_addcreator2(newmethod,s,fmt);
+ }
void class_addmethod(t_class *c, t_method fn, t_symbol *sel, t_atomtypearg arg1, ...) {
! char fmt[42],*f=fmt; va_list ap; va_start(ap,arg1); int t=arg1;
! while(t) {
if (t>A_CANT) {error("class_addmethod: ARRGH! t=%d",t); return;}
*f++ = " fsp;,FS$@*!"[t];
t=(t_atomtype)va_arg(ap,int);
}
! *f=0; va_end(ap); class_addmethod2(c,fn,sel,fmt);
}
More information about the Pd-cvs
mailing list