symbols versus strings ? writing route

Winfried Ritsch ritsch at iem.mhsg.ac.at
Sun Mar 22 19:12:42 CET 1998


I hope I am not too annoyingly, ..., but writing route I encountered
some problems:

feature of my route:

		  - routing first number of lists: output rest of list 
		  - routing numbers, output bang on matched numbers
		  - routing strings (which are in fact symbols), 
		    with bang and list output 
		  - mixing routing strings and numbers 
		    (which does not work in max)

solution:
		  
		  - adding methods for each string 
					 (class_addmethod(route_class,route_symbol,
								es->e_atom.a_w.w_symbol,A_GIMME,0);

		  - adding class_addanything(...) for not parsed strings,messages
		  
problem:

if a a string is for example "int", a used symbol, than route_symbol(...)
seg_faults, because pd_float is used for calling route_symbol(..) with
wrong arguments, because  the route_symbol(...) is registered as
c_floatmethod.

So the string "int" or "float" matches all  numbers. Lists, which in
fact are lists beginning with numbers not strings, are handled
correctly. Lists with beginning strings are handled as methods --- is
this correct ?

So the my idea of route (to be compatible in future with real route)
could be that "float", "int" routes all integers and floats, which are
not in a list, 

(route should be fast, since, in my experience with max, it is often
used for sending synthesis parameters and has to handle high
data-rates)

mfg winfried.

PS.:my route as source:
---- snip ---
/* -------------------------- route ------------------------------ */
static t_class *route_class;

typedef struct _routeelement
{
  t_atom e_atom;
  t_outlet *e_outlet;
} t_routeelement;


typedef struct _route
{
    t_object x_obj;
    t_int x_nelement;
    t_routeelement *x_vec;
    t_int x_nsymbols;
    t_routeelement *x_vecsymbols;
    t_outlet *x_rejectout;
} t_route;



static void route_list(t_route *x, t_symbol *sel, int argc, t_atom *argv)
{
  t_routeelement *e;
  int nelement, n;
  union word a_w;

  if (!argc) return;

  a_w = argv->a_w;

  for (nelement = x->x_nelement, e = x->x_vec; nelement--; e++){

	 /* dont know how excatly to compare atomes since
		 strncmp is slow for a 8Byte long, 
		 and i am not sure all types ar the same length (w_int, w_float,...)
		 so I have to test on atom type */

	 switch(argv->a_type){

	 case A_FLOAT:
		if(e->e_atom.a_type == A_FLOAT && e->e_atom.a_w.w_float == a_w.w_float)
		  {
			 if(argc <= 1)	outlet_bang(e->e_outlet);
			 else	outlet_list(e->e_outlet, 0, argc-1, argv+1);
			 return;
		  }
		break;

	 case A_INT :
		if(e->e_atom.a_type == A_INT && e->e_atom.a_w.w_int == a_w.w_int)
		  {
			 if(argc <= 1)	outlet_bang(e->e_outlet);
			 else outlet_list(e->e_outlet, 0, argc-1, argv+1);
			 return;
		  }
		break;
	 }
  };
  outlet_list(x->x_rejectout, sel, argc, argv);
  return;
}


static void route_symbol(t_route *x, t_symbol *sel, int argc, t_atom *argv)
{
  t_routeelement *e;
  int nelement;

  for (nelement = x->x_nsymbols, e = x->x_vecsymbols; nelement--; e++)
	 if(/* e->e_atom.a_type == A_SYMBOL
		 &&*/ e->e_atom.a_w.w_symbol == sel){
 
		if(argc<=0) outlet_bang(e->e_outlet);
		else outlet_list(e->e_outlet, 0, argc, argv);
		return;
	 }
		
  /* never reach this, but... */
  outlet_anything(x->x_rejectout, sel, argc, argv);
  return;
}

static void route_anything(t_route *x, t_symbol *sel, int argc, t_atom *argv)
{
  outlet_anything(x->x_rejectout, sel, argc, argv);
  return;
}


static void route_free(t_route *x)
{
    freebytes(x->x_vec, x->x_nelement * sizeof(*x->x_vec));
}

static void *route_new(t_symbol *s, int argc, t_atom *argv)
{
  int n;
  t_routeelement *ee, *es;
  t_route *x = (t_route *)pd_new(route_class);

  x->x_nelement =  x->x_nsymbols = 0;    /* count from top */
  x->x_vec = (t_routeelement *)getbytes(argc * sizeof(*x->x_vec));
  x->x_rejectout = outlet_new(&x->x_obj, &s_list);

  for (n = argc, ee = x->x_vec, es=x->x_vec+argc; n--;){

	 if(argv[n].a_type == A_SYMBOL){

		es--;x->x_nsymbols++;    /* count from top */

		es->e_outlet = outlet_new(&x->x_obj, &s_list);
		es->e_atom.a_type = argv[n].a_type;
		es->e_atom.a_w = argv[n].a_w;

		post("new_symbol: new symbol at %lx name %s",
			  argv[n].a_w.w_symbol,argv[n].a_w.w_symbol->s_name);

		class_addmethod(route_class,route_symbol,
								es->e_atom.a_w.w_symbol,A_GIMME,0);

	 }
	 else{ /* element */
		  
		ee->e_outlet = outlet_new(&x->x_obj, &s_list);
		ee->e_atom.a_type = argv[n].a_type;
		ee->e_atom.a_w = argv[n].a_w;

		ee++;x->x_nelement++;/* count from bottom */
    }

  };

  x->x_vecsymbols = es;

  return (x);
}

void route_setup(void)
{
    route_class = class_new(gensym("route"), route_new, route_free,
    	sizeof(t_route), 0, A_GIMME, 0);

	 class_addlist(route_class, route_list);

	 /* symbols which are not matched and so no messages */
	 class_addanything(route_class, route_anything);
}
---- snip ---



More information about the Pd-list mailing list