[PD-cvs] pd/src builtins.c,1.1.2.39,1.1.2.40

Mathieu Bouchard matju at users.sourceforge.net
Fri Jul 20 08:33:24 CEST 2007


Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3461

Modified Files:
      Tag: desiredata
	builtins.c 
Log Message:
[route] supports mixed floats and symbols


Index: builtins.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/builtins.c,v
retrieving revision 1.1.2.39
retrieving revision 1.1.2.40
diff -C2 -d -r1.1.2.39 -r1.1.2.40
*** builtins.c	20 Jul 2007 04:11:53 -0000	1.1.2.39
--- builtins.c	20 Jul 2007 06:33:21 -0000	1.1.2.40
***************
*** 1375,1383 ****
  static t_class *route_class;
  struct t_routeelement {
!     t_word e_w;
      t_outlet *out;
  };
  struct t_route : t_object {
-     t_atomtype type;
      t_int n;
      t_routeelement *vec;
--- 1375,1382 ----
  static t_class *route_class;
  struct t_routeelement {
!     t_atom a;
      t_outlet *out;
  };
  struct t_route : t_object {
      t_int n;
      t_routeelement *vec;
***************
*** 1385,1402 ****
  };
  static void route_anything(t_route *x, t_symbol *sel, int argc, t_atom *argv) {
!     if (x->type == A_SYMBOL) {
!         t_routeelement *e = x->vec;
!         for (int n = x->n; n--; e++) if (e->e_w.w_symbol == sel) {
!             if (argc > 0 && argv[0].a_type == A_SYMBOL)
!                 outlet_anything(e->out, argv[0].a_symbol, argc-1, argv+1);
!             else { /* tb {: avoid 1 element lists */
! 		if (argc > 1) outlet_list(e->out, 0, argc, argv);
! 		else if (argc == 0) outlet_bang(e->out);
! 		else if (argv[0].a_type == A_FLOAT)   outlet_float(   e->out, argv[0].a_float);
! 		else if (argv[0].a_type == A_SYMBOL)  outlet_symbol(  e->out, argv[0].a_symbol);
! 		else if (argv[0].a_type == A_POINTER)  outlet_pointer(e->out, argv[0].a_pointer);
! 	    } /* tb } */
!             return;
!         }
      }
      outlet_anything(x->rejectout, sel, argc, argv);
--- 1384,1399 ----
  };
  static void route_anything(t_route *x, t_symbol *sel, int argc, t_atom *argv) {
!     t_routeelement *e = x->vec;
!     for (int n = x->n; n--; e++) if (e->a.a_type == A_SYMBOL) if (e->a.a_symbol == sel) {
!         if (argc > 0 && argv[0].a_type == A_SYMBOL)
!             outlet_anything(e->out, argv[0].a_symbol, argc-1, argv+1);
!         else { /* tb {: avoid 1 element lists */
! 	    if (argc > 1) outlet_list(e->out, 0, argc, argv);
! 	    else if (argc == 0) outlet_bang(e->out);
! 	    else if (argv[0].a_type == A_FLOAT)    outlet_float(  e->out, argv[0].a_float);
! 	    else if (argv[0].a_type == A_SYMBOL)   outlet_symbol( e->out, argv[0].a_symbol);
! 	    else if (argv[0].a_type == A_POINTER)  outlet_pointer(e->out, argv[0].a_pointer);
! 	} /* tb } */
!         return;
      }
      outlet_anything(x->rejectout, sel, argc, argv);
***************
*** 1405,1417 ****
  #define route_eachr(E,L) for (t_routeelement *E = L->vec;E;E=0) for (int ROUTEN = x->n; ROUTEN--; E++)
  static void route_list(t_route *x, t_symbol *sel, int argc, t_atom *argv) {
!     if (x->type == A_FLOAT) {
!         if (!argc) {outlet_bang(x->rejectout); return;}
          float f = atom_getfloat(argv);
! 	t_routeelement *e = x->vec;
!         for (int n = x->n; n--; e++) if (e->e_w.w_float == f) {
              if (argc > 1 && argv[1].a_type == A_SYMBOL)
                  outlet_anything(e->out, argv[1].a_symbol, argc-2, argv+2);
!             else /* outlet_list(e->out, 0, argc-1, argv+1); */ { /* tb {: avoid 1 element lists */
! 		argc -= 1, argv+=1;
  		if (argc > 1) outlet_list(e->out, 0, argc, argv);
  		else if (argc == 0) outlet_bang(e->out);
--- 1402,1412 ----
  #define route_eachr(E,L) for (t_routeelement *E = L->vec;E;E=0) for (int ROUTEN = x->n; ROUTEN--; E++)
  static void route_list(t_route *x, t_symbol *sel, int argc, t_atom *argv) {
!     if (argc && argv->a_type == A_FLOAT) {
          float f = atom_getfloat(argv);
!         route_eachr(e,x) if (e->a.a_float == f) {
              if (argc > 1 && argv[1].a_type == A_SYMBOL)
                  outlet_anything(e->out, argv[1].a_symbol, argc-2, argv+2);
!             else {
! 		argc--; argv++;
  		if (argc > 1) outlet_list(e->out, 0, argc, argv);
  		else if (argc == 0) outlet_bang(e->out);
***************
*** 1419,1443 ****
  		else if (argv[0].a_type == A_SYMBOL)  outlet_symbol( e->out, argv[0].a_symbol);
  		else if (argv[0].a_type == A_POINTER) outlet_pointer(e->out, argv[0].a_pointer);
! 	    } /* tb } */
              return;
          }
      } else { /* symbol arguments */
          if (argc > 1) { /* 2 or more args: treat as "list" */
! 	    route_eachr(e,x) {
!                 if (e->e_w.w_symbol == &s_list) {
!                     if (argv[0].a_type==A_SYMBOL) outlet_anything(e->out, argv[0].a_symbol, argc-1, argv+1);
!                     else outlet_list(e->out, 0, argc, argv);
!                     return;
!                 }
              }
!         } else if (argc == 0) {
! 	    route_eachr(e,x) {if (e->e_w.w_symbol == &s_bang  ) {outlet_bang(e->out); return;}}
!         } else if (argv[0].a_type == A_FLOAT) {
! 	    route_eachr(e,x) {if (e->e_w.w_symbol == &s_float ) {outlet_float(e->out, argv[0].a_float); return;}}
!         } else {
! 	    route_eachr(e,x) {if (e->e_w.w_symbol == &s_symbol) {outlet_symbol(e->out, argv[0].a_symbol); return;}}
          }
      }
!     outlet_list(x->rejectout, 0, argc, argv);
  }
  
--- 1414,1433 ----
  		else if (argv[0].a_type == A_SYMBOL)  outlet_symbol( e->out, argv[0].a_symbol);
  		else if (argv[0].a_type == A_POINTER) outlet_pointer(e->out, argv[0].a_pointer);
! 	    }
              return;
          }
      } else { /* symbol arguments */
          if (argc > 1) { /* 2 or more args: treat as "list" */
! 	    route_eachr(e,x) if (e->a.a_symbol == &s_list) {
!                 if (argv[0].a_type==A_SYMBOL) outlet_anything(e->out, argv[0].a_symbol, argc-1, argv+1);
!                 else outlet_list(e->out, 0, argc, argv);
!                 return;
              }
!         } else if (argc==0) {                route_eachr(e,x) {if (e->a.a_symbol==&s_bang  ) {outlet_bang(  e->out                  ); return;}}
!         } else if (argv[0].a_type==A_FLOAT) {route_eachr(e,x) {if (e->a.a_symbol==&s_float ) {outlet_float( e->out, argv[0].a_float ); return;}}
!         } else                              {route_eachr(e,x) {if (e->a.a_symbol==&s_symbol) {outlet_symbol(e->out, argv[0].a_symbol); return;}}
          }
      }
!     if (!argc) outlet_bang(x->rejectout); else outlet_list(x->rejectout, 0, argc, argv);
  }
  
***************
*** 1451,1455 ****
          argv = &a;
      }
-     x->type = argv[0].a_type;
      x->n = argc;
      x->vec = (t_routeelement *)getbytes(argc * sizeof(*x->vec));
--- 1441,1444 ----
***************
*** 1457,1462 ****
      for (int n = 0; n < argc; n++, e++) {
          e->out = outlet_new(x, &s_list);
!         if (x->type == A_FLOAT) e->e_w.w_float  = atom_getfloatarg( n, argc, argv);
!         else                    e->e_w.w_symbol = atom_getsymbolarg(n, argc, argv);
      }
      x->rejectout = outlet_new(x, &s_list);
--- 1446,1450 ----
      for (int n = 0; n < argc; n++, e++) {
          e->out = outlet_new(x, &s_list);
!         e->a = argv[n];
      }
      x->rejectout = outlet_new(x, &s_list);





More information about the Pd-cvs mailing list