[PD-cvs] externals/zexy/src sort.c,1.1,1.2

IOhannes m zmölnig zmoelnig at users.sourceforge.net
Mon Apr 4 14:23:51 CEST 2005


Update of /cvsroot/pure-data/externals/zexy/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21539

Modified Files:
	sort.c 
Log Message:
added a 2nd outlet to get the indices for sorting


Index: sort.c
===================================================================
RCS file: /cvsroot/pure-data/externals/zexy/src/sort.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** sort.c	22 Mar 2005 20:58:23 -0000	1.1
--- sort.c	4 Apr 2005 12:23:48 -0000	1.2
***************
*** 37,42 ****
--- 37,45 ----
    int bufsize;
    t_float *buffer;
+   t_int   *indices;
  
    int ascending;
+ 
+   t_outlet*indexOut, *sortedOut;
  } t_sort;
  
***************
*** 50,65 ****
  {
    int n = argc;
!   t_float *buf;
    t_atom *atombuf = argv;
  
    if (argc != x->bufsize) {
!     if (x->buffer) freebytes(x->buffer, x->bufsize * sizeof(t_float));
      x->bufsize = argc;
      x->buffer = getbytes(x->bufsize * sizeof(t_float));
    }
  
    buf = x->buffer;
!   while (n--)
      *buf++ = atom_getfloat(atombuf++);
  }
  
--- 53,73 ----
  {
    int n = argc;
!   t_float *buf, *idx;
    t_atom *atombuf = argv;
  
    if (argc != x->bufsize) {
!     if (x->buffer) freebytes(x->buffer,  x->bufsize * sizeof(t_float));
!     if (x->indices)freebytes(x->indices, x->bufsize * sizeof(t_int));
! 
      x->bufsize = argc;
      x->buffer = getbytes(x->bufsize * sizeof(t_float));
+     x->indices = getbytes(x->bufsize * sizeof(t_int));
    }
  
    buf = x->buffer;
!   while (n--){
      *buf++ = atom_getfloat(atombuf++);
+     x->indices[n] = n;
+   }
  }
  
***************
*** 69,72 ****
--- 77,81 ----
    t_atom *atombuf = (t_atom *)getbytes(sizeof(t_atom) * argc);
    t_float *buf;
+   t_int   *idx;
  
    int i, loops = 1;
***************
*** 74,77 ****
--- 83,87 ----
    sort_buffer(x, argc, argv);
    buf = x->buffer;
+   idx = x->indices;
  
    while (step > 1) {
***************
*** 85,91 ****
        for (n=0; n<(argc-step); n++) {
  	if (buf[n] > buf[n+step]) {
! 	  t_float dummy = buf[n];
  	  buf[n]        = buf[n+step];
! 	  buf[n+step]   = dummy;
  	}
        }
--- 95,104 ----
        for (n=0; n<(argc-step); n++) {
  	if (buf[n] > buf[n+step]) {
! 	  t_int   i_tmp = idx[n];
! 	  t_float f_tmp = buf[n];
  	  buf[n]        = buf[n+step];
! 	  buf[n+step]   = f_tmp;
! 	  idx[n]        = idx[n+step];
! 	  idx[n+step]   = i_tmp;
  	}
        }
***************
*** 94,102 ****
  
    if (x->ascending) 
      for (n = 0; n < argc; n++) SETFLOAT(&atombuf[n], buf[n]);
    else
      for (n = 0, i=argc-1; n < argc; n++, i--) SETFLOAT(&atombuf[n], buf[i]);
  
-   outlet_list(x->x_obj.ob_outlet, &s_list, n, atombuf);
  
    freebytes(atombuf, argc*sizeof(t_atom));
--- 107,122 ----
  
    if (x->ascending) 
+     for (n = 0; n < argc; n++) SETFLOAT(&atombuf[n], idx[n]);
+   else
+     for (n = 0, i=argc-1; n < argc; n++, i--) SETFLOAT(&atombuf[n], idx[i]);
+ 
+   outlet_list(x->indexOut , &s_list, n, atombuf);
+ 
+   if (x->ascending) 
      for (n = 0; n < argc; n++) SETFLOAT(&atombuf[n], buf[n]);
    else
      for (n = 0, i=argc-1; n < argc; n++, i--) SETFLOAT(&atombuf[n], buf[i]);
+   outlet_list(x->sortedOut, &s_list, n, atombuf);
  
  
    freebytes(atombuf, argc*sizeof(t_atom));
***************
*** 108,112 ****
    x->ascending = (f < 0.f)?0:1;
  
!   outlet_new(&x->x_obj, &s_list);
  
    x->bufsize = 0;
--- 128,133 ----
    x->ascending = (f < 0.f)?0:1;
  
!   x->sortedOut=outlet_new(&x->x_obj, &s_list);
!   x->indexOut=outlet_new(&x->x_obj, &s_list);
  
    x->bufsize = 0;





More information about the Pd-cvs mailing list