[PD-cvs] externals/miXed/cyclone/hammer Table.c,1.2,1.3

Krzysztof Czaja krzyszcz at users.sourceforge.net
Wed Apr 21 16:47:36 CEST 2004


Update of /cvsroot/pure-data/externals/miXed/cyclone/hammer
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8661/cyclone/hammer

Modified Files:
	Table.c 
Log Message:


Index: Table.c
===================================================================
RCS file: /cvsroot/pure-data/externals/miXed/cyclone/hammer/Table.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** Table.c	20 Apr 2004 13:55:27 -0000	1.2
--- Table.c	21 Apr 2004 14:47:26 -0000	1.3
***************
*** 49,52 ****
--- 49,55 ----
      int             c_tableini[TABLE_INISIZE];
      int             c_cacheisfresh;
+     int             c_cachesum;
+     int             c_cachemin;
+     int             c_cachemax;
      int            *c_cache;
      int             c_cacheini[TABLE_INISIZE];
***************
*** 78,81 ****
--- 81,85 ----
  static void tablecommon_modified(t_tablecommon *cc, int relocated)
  {
+     cc->c_cacheisfresh = 0;
      if (cc->c_increation)
  	return;
***************
*** 95,115 ****
  static int tablecommon_getindex(t_tablecommon *cc, int ndx)
  {
!     int mx = cc->c_length - 1;
      /* CHECKED ndx silently clipped */
!     return (ndx < 0 ? 0 : (ndx > mx ? mx : ndx));
  }
  
  static int tablecommon_getvalue(t_tablecommon *cc, int ndx)
  {
!     int mx = cc->c_length - 1;
      /* CHECKED ndx silently clipped */
!     return (cc->c_table[ndx < 0 ? 0 : (ndx > mx ? mx : ndx)]);
  }
  
  static void tablecommon_setvalue(t_tablecommon *cc, int ndx, int v)
  {
!     int mx = cc->c_length - 1;
      /* CHECKED ndx silently clipped, value not clipped */
!     cc->c_table[ndx < 0 ? 0 : (ndx > mx ? mx : ndx)] = v;
      tablecommon_modified(cc, 0);
  }
--- 99,119 ----
  static int tablecommon_getindex(t_tablecommon *cc, int ndx)
  {
!     int nmx = cc->c_length - 1;
      /* CHECKED ndx silently clipped */
!     return (ndx < 0 ? 0 : (ndx > nmx ? nmx : ndx));
  }
  
  static int tablecommon_getvalue(t_tablecommon *cc, int ndx)
  {
!     int nmx = cc->c_length - 1;
      /* CHECKED ndx silently clipped */
!     return (cc->c_table[ndx < 0 ? 0 : (ndx > nmx ? nmx : ndx)]);
  }
  
  static void tablecommon_setvalue(t_tablecommon *cc, int ndx, int v)
  {
!     int nmx = cc->c_length - 1;
      /* CHECKED ndx silently clipped, value not clipped */
!     cc->c_table[ndx < 0 ? 0 : (ndx > nmx ? nmx : ndx)] = v;
      tablecommon_modified(cc, 0);
  }
***************
*** 139,146 ****
      if (ac > 1 && av->a_type == A_FLOAT)
      {
! 	/* CHECKME resizing */
  	int last = tablecommon_getindex(cc, ndx + ac - 1);
  	int *ptr = cc->c_table + ndx;
! 	for (av++; ndx <= last; ndx++, av++)
  	     *ptr++ = (av->a_type == A_FLOAT ? (int)av->a_w.w_float : 0);
  	tablecommon_modified(cc, 0);
--- 143,150 ----
      if (ac > 1 && av->a_type == A_FLOAT)
      {
! 	/* CHECKED no resizing */
  	int last = tablecommon_getindex(cc, ndx + ac - 1);
  	int *ptr = cc->c_table + ndx;
! 	for (; ndx <= last; ndx++, av++)
  	     *ptr++ = (av->a_type == A_FLOAT ? (int)av->a_w.w_float : 0);
  	tablecommon_modified(cc, 0);
***************
*** 157,175 ****
      if (relocate = (length > cc->c_size))
      {
! 	cc->c_table = grow_nodata(&length, &cc->c_size, cc->c_table,
! 				  TABLE_INISIZE, cc->c_tableini,
! 				  sizeof(*cc->c_table));
! 	/* FIXME cache */
      }
      cc->c_length = length;
!     tablecommon_setall(cc, 0);  /* CHECKME */
!     /* CHECKME head */
      tablecommon_modified(cc, relocate);
  }
  
  static int tablecommon_quantile(t_tablecommon *cc, float f)
  {
!     /* FIXME */
!     return (0);
  }
  
--- 161,223 ----
      if (relocate = (length > cc->c_size))
      {
! 	int l = length;
! 	/* CHECKED existing values are preserved */
! 	cc->c_table = grow_withdata(&length, &cc->c_length,
! 				    &cc->c_size, cc->c_table,
! 				    TABLE_INISIZE, cc->c_tableini,
! 				    sizeof(*cc->c_table));
! 	if (length == l)
! 	    cc->c_table = grow_nodata(&length, &cc->c_size, cc->c_cache,
! 				      TABLE_INISIZE, cc->c_cacheini,
! 				      sizeof(*cc->c_cache));
! 	if (length != l)
! 	{
! 	    if (cc->c_table != cc->c_tableini)
! 		freebytes(cc->c_table, cc->c_size * sizeof(*cc->c_table));
! 	    if (cc->c_cache != cc->c_cacheini)
! 		freebytes(cc->c_cache, cc->c_size * sizeof(*cc->c_cache));
! 	    cc->c_size = length = TABLE_INISIZE;
! 	    cc->c_table = cc->c_tableini;
! 	    cc->c_cache = cc->c_cacheini;
! 	}
      }
      cc->c_length = length;
!     /* CHECKED values at common indices are preserved */
!     /* CHECKED rewinding neither head, nor loadndx, but a separate
!        condition of eot is preserved only for the head. */
      tablecommon_modified(cc, relocate);
  }
  
+ static void tablecommon_cacheupdate(t_tablecommon *cc)
+ {
+     int ndx = cc->c_length, sum = 0, mn, mx;
+     int *tptr = cc->c_table, *cptr = cc->c_cache;
+     mn = mx = *tptr;
+     while (ndx--)
+     {
+ 	int v = *tptr++;
+ 	*cptr++ = (sum += v);
+ 	if (mn > v)
+ 	    mn = v;
+ 	else if (mx < v)
+ 	    mx = v;
+     }
+     cc->c_cachesum = sum;
+     cc->c_cachemin = mn;
+     cc->c_cachemax = mx;
+     cc->c_cacheisfresh = 1;
+ }
+ 
  static int tablecommon_quantile(t_tablecommon *cc, float f)
  {
!     /* CHECKME */
!     float fv;
!     int ndx, *ptr, nmx = cc->c_length - 1;
!     if (!cc->c_cacheisfresh) tablecommon_cacheupdate(cc);
!     fv = f * cc->c_cachesum;
!     for (ndx = 0, ptr = cc->c_cache; ndx < nmx; ndx++, ptr++)
! 	if (*ptr >= fv)
! 	    break;
!     return (ndx);
  }
  
***************
*** 252,255 ****
--- 300,304 ----
      cc->c_table = cc->c_tableini;
      cc->c_cache = cc->c_cacheini;
+     cc->c_cacheisfresh = 0;
      return (cc);
  }
***************
*** 277,282 ****
  	{
  	    hammerfile_free(cc->c_filehandle);
- 	    /* disable canvas dirty-flag handling, LATER rethink */
- 	    cc->c_increation = 1;
  	    tablecommon_free(cc);
  	    if (x->x_name) pd_unbind(&cc->c_pd, x->x_name);
--- 326,329 ----
***************
*** 494,497 ****
--- 541,546 ----
  }
  
+ /* CHECKED 'send <target> length' works, but not max, min, sum... */
+ /* CHECKED 'send <target> <ndx> <value>' writes the value (a bug?) */
  static void table_send(t_table *x, t_symbol *s, t_floatarg f)
  {
***************
*** 506,520 ****
  static void table_sum(t_table *x)
  {
!     /* FIXME */
  }
  
  static void table_min(t_table *x)
  {
!     /* FIXME */
  }
  
  static void table_max(t_table *x)
  {
!     /* FIXME */
  }
  
--- 555,575 ----
  static void table_sum(t_table *x)
  {
!     t_tablecommon *cc = x->x_common;
!     if (!cc->c_cacheisfresh) tablecommon_cacheupdate(cc);
!     outlet_float(((t_object *)x)->ob_outlet, (t_float)cc->c_cachesum);
  }
  
  static void table_min(t_table *x)
  {
!     t_tablecommon *cc = x->x_common;
!     if (!cc->c_cacheisfresh) tablecommon_cacheupdate(cc);
!     outlet_float(((t_object *)x)->ob_outlet, (t_float)cc->c_cachemin);
  }
  
  static void table_max(t_table *x)
  {
!     t_tablecommon *cc = x->x_common;
!     if (!cc->c_cacheisfresh) tablecommon_cacheupdate(cc);
!     outlet_float(((t_object *)x)->ob_outlet, (t_float)cc->c_cachemax);
  }
  
***************
*** 533,537 ****
  static void table_inv(t_table *x, t_floatarg f)
  {
!     /* FIXME */
  }
  
--- 588,597 ----
  static void table_inv(t_table *x, t_floatarg f)
  {
!     /* CHECKME none found, float */
!     int v = (int)f, ndx, *ptr, nmx = x->x_common->c_length - 1;
!     for (ndx = 0, ptr = x->x_common->c_table; ndx < nmx; ndx++, ptr++)
! 	if (*ptr >= v)
! 	    break;
!     outlet_float(((t_object *)x)->ob_outlet, (t_float)ndx);
  }
  
***************
*** 551,567 ****
  }
  
  static void table_dump(t_table *x)
  {
      t_tablecommon *cc = x->x_common;
      t_outlet *out = ((t_object *)x)->ob_outlet;
!     int ndx = cc->c_length;
!     int *ptr = cc->c_table;
!     /* CHECKME */
!     while (ndx--)
!     {
! 	outlet_float(out, (t_float)*ptr++);
! 	/* FIXME ptr may be invalid after outlet_float()... consider calling
! 	   tablecommon_getindex() rather than patching in selfmod tests */
!     }
  }
  
--- 611,628 ----
  }
  
+ /* FIXME arguments (from, to) */
+ /* CHECKED no remote dumping, symbol args bashed to 0 */
  static void table_dump(t_table *x)
  {
      t_tablecommon *cc = x->x_common;
      t_outlet *out = ((t_object *)x)->ob_outlet;
!     int ndx;
!     /* The usual way of traversing the table by incrementing a pointer is
!        not robust, because calling outlet_float() may invalidate the pointer.
!        The test below is simpler than generic selfmod detection ala coll,
!        but behaviour may be different.  LATER revisit, consider asserting
!        invariance of cc->c_table and cc->c_length, instead. */
!     for (ndx = 0; ndx < cc->c_length; ndx++)
! 	outlet_float(out, (t_float)cc->c_table[ndx]);
  }
  
***************
*** 592,599 ****
  }
  
  static void table_open(t_table *x)
  {
-     t_tablecommon *cc = x->x_common;
      /* FIXME */
  }
  
--- 653,684 ----
  }
  
+ static int tablecommon_editorappend(t_tablecommon *cc,
+ 				    int v, char *buf, int col)
+ {
+     char *bp = buf;
+     int cnt = 0;
+     if (col > 0)
+ 	*bp++ = ' ', cnt++;
+     cnt += sprintf(bp, "%d", v);
+     if (col + cnt > 80)
+ 	buf[0] = '\n', col = cnt;
+     else
+ 	col += cnt;
+     hammereditor_append(cc->c_filehandle, buf);
+     return (col);
+ }
+ 
  static void table_open(t_table *x)
  {
      /* FIXME */
+     t_tablecommon *cc = x->x_common;
+     char buf[MAXPDSTRING];
+     int *bp = cc->c_table;
+     int count = cc->c_length, col = 0;
+     /* LATER prepend "table: " */
+     hammereditor_open(cc->c_filehandle,
+ 		      x->x_name ? x->x_name->s_name : "Untitled");
+     while (count--)
+ 	col = tablecommon_editorappend(cc, *bp++, buf, col);
  }
  





More information about the Pd-cvs mailing list