19 #define MAX_ARGCOUNT 100
20 #define MAX_MESS_SIZE 2048
24 void *outlets[MAX_ARGCOUNT];
25 void *outlet_overflow;
26 t_atom arguments[MAX_ARGCOUNT];
29 long attr_stripnonmatches;
33 void *pass_new(t_symbol *s,
long argc, t_atom *argv);
34 void pass_assist(t_pass *x,
void *b,
long msg,
long arg,
char *dst);
35 void pass_int(t_pass *x,
long n);
36 void pass_float(t_pass *x,
double f);
37 void pass_symbol(t_pass *x, t_symbol *msg,
long argc, t_atom *argv);
38 void pass_list(t_pass *x, t_symbol *msg,
long argc, t_atom *argv);
47 int JAMOMA_EXPORT_MAXOBJ
main(
void)
53 common_symbols_init();
56 c = class_new(
"j.pass",(method)pass_new, (method)0L,
sizeof(t_pass), (method)0L, A_GIMME, 0);
59 class_addmethod(c, (method)pass_int,
"int", A_DEFLONG, 0L);
60 class_addmethod(c, (method)pass_float,
"float", A_DEFFLOAT, 0L);
61 class_addmethod(c, (method)pass_list,
"list", A_GIMME, 0L);
62 class_addmethod(c, (method)pass_symbol,
"anything", A_GIMME, 0L);
63 class_addmethod(c, (method)pass_assist,
"assist", A_CANT, 0L);
64 class_addmethod(c, (method)object_obex_dumpout,
"dumpout", A_CANT,0);
67 attr = attr_offset_new(
"strip", _sym_long, attrflags,
68 (method)0, (method)0, calcoffset(t_pass, attr_strip));
69 class_addattr(c, attr);
72 attr = attr_offset_new(
"stripnonmatches", _sym_long, attrflags,
73 (method)0, (method)0, calcoffset(t_pass, attr_stripnonmatches));
74 class_addattr(c, attr);
77 class_register(CLASS_BOX, c);
86 void *pass_new(t_symbol *s,
long argc, t_atom *argv)
89 char argument[MAX_MESS_SIZE];
90 t_pass *x = (t_pass *)object_alloc(pass_class);
91 long attrstart = attr_args_offset(argc, argv);
94 x->outlet_overflow = outlet_new(x, 0);
95 object_obex_store((
void *)x, _sym_dumpout, (
object *)x->outlet_overflow);
97 x->num_args = attrstart;
99 for (i=x->num_args-1; i >= 0; i--) {
100 x->outlets[i] = outlet_new(x, 0);
101 switch(argv[i].a_type) {
103 atom_setlong(&(x->arguments[i]), atom_getlong(argv+i));
106 atom_setfloat(&(x->arguments[i]), atom_getfloat(argv+i));
109 strcpy(argument, atom_getsym(argv+i)->s_name);
110 if (argument[0] ==
'/')
111 atom_setsym(&(x->arguments[i]), gensym(argument+1));
115 atom_setsym(&(x->arguments[i]), gensym(argument));
121 x->attr_stripnonmatches = 0;
122 attr_args_process(x, argc, argv);
132 void pass_assist(t_pass *x,
void *b,
long msg,
long arg,
char *dst)
135 strcpy(dst,
"Input");
137 if (arg < x->num_args) {
139 char tempstring[200];
140 switch(x->arguments[arg].a_type) {
142 snprintf(tempstring, 200,
"%ld", atom_getlong(&x->arguments[arg]));
143 strcpy(dst, tempstring);
146 snprintf(tempstring, 200,
"%f", atom_getfloat(&x->arguments[arg]));
147 strcpy(dst, tempstring);
150 argname = atom_getsym(&x->arguments[arg]);
151 strcpy(dst, argname->s_name);
156 strcpy(dst,
"dumpout / overflow from non-matching input");
162 void pass_int(t_pass *x,
long n)
166 for (i=0; i< x->num_args; i++) {
167 if (x->arguments[i].a_type == A_LONG) {
168 if (n == atom_getlong(&x->arguments[i])) {
169 outlet_int(x->outlets[i], n);
174 outlet_int(x->outlet_overflow, n);
179 void pass_float(t_pass *x,
double f)
183 for (i=0; i< x->num_args; i++) {
184 if (x->arguments[i].a_type == A_FLOAT) {
185 if (f == atom_getfloat(&x->arguments[i])) {
186 outlet_float(x->outlets[i], f);
191 outlet_float(x->outlet_overflow, f);
196 void pass_symbol(t_pass *x, t_symbol *msg,
long argc, t_atom *argv)
200 char *input = msg->s_name;
205 message = gensym(input);
208 for (i=0; i< x->num_args; i++) {
209 if (message == atom_getsym(&x->arguments[i])) {
210 if (x->attr_strip != 0)
211 outlet_anything(x->outlets[i], message, argc , argv);
213 outlet_anything(x->outlets[i], msg, argc , argv);
217 if (x->attr_stripnonmatches !=0)
218 outlet_anything(x->outlet_overflow, message, argc , argv);
220 outlet_anything(x->outlet_overflow, msg, argc , argv);
225 void pass_list(t_pass *x, t_symbol *msg,
long argc, t_atom *argv)
231 if (x->attr_strip != 0) {
232 char *input = msg->s_name;
235 message = gensym(input);
239 switch(argv[0].a_type) {
241 for (i=0; i< x->num_args; i++) {
242 if (x->arguments[i].a_type == A_LONG) {
243 if (atom_getlong(argv) == atom_getlong(&x->arguments[i])) {
244 outlet_list(x->outlets[i], 0L, argc , argv);
249 outlet_list(x->outlet_overflow, 0L, argc , argv);
252 for (i=0; i< x->num_args; i++) {
253 if (x->arguments[i].a_type == A_FLOAT) {
254 if (atom_getfloat(argv) == atom_getfloat(&x->arguments[i])) {
255 outlet_list(x->outlets[i], 0L, argc , argv);
260 outlet_list(x->outlet_overflow, 0L, argc , argv);
263 for (i=0; i< x->num_args; i++) {
264 if (atom_getsym(argv) == atom_getsym(&x->arguments[i])) {
265 outlet_anything(x->outlets[i], message, argc , argv);
269 outlet_list(x->outlet_overflow, 0L, argc , argv);
272 outlet_list(x->outlet_overflow, 0L, argc , argv);
int JAMOMA_EXPORT_MAXOBJ main(void)
Set up this class as a Max external the first time an object of this kind is instantiated.