[comp.sources.d] Extra function for `sc' spreadsheet

pjbk@cs.hw.ac.uk (Peter King) (06/08/89)

A minor modification that I have made to the sc spreadsheet, which
sometimes seems useful (the modification, not `sc'!).  A new function
has been added (@count(range)) which returns the number of numeric
cells in the region.  Perhaps other will find it useful too.

One ought to be able to feed this directly to 'patch'.

diff -c /usr/src/local/sc/gram.y ./gram.y
*** /usr/src/local/sc/gram.y	Thu Sep 15 13:37:05 1988
--- ./gram.y	Thu Jun  8 12:56:57 1989
***************
*** 72,77
  %token K_PROD
  %token K_AVG
  %token K_STDDEV
  %token K_ACOS
  %token K_ASIN
  %token K_ATAN

--- 72,78 -----
  %token K_PROD
  %token K_AVG
  %token K_STDDEV
+ %token K_COUNT
  %token K_ACOS
  %token K_ASIN
  %token K_ATAN
***************
*** 243,248
  				{ $$ = new_range (REDUCE | 'a', $4); }
  	|       '@' K_STDDEV '(' var_or_range ')' 
  				{ $$ = new_range (REDUCE | 's', $4); }
  	|       '@' K_MAX '(' var_or_range ')' 
  				{ $$ = new_range (REDUCE | MAX, $4); }
  	|	'@' K_MAX '(' e ',' expr_list ')'

--- 244,251 -----
  				{ $$ = new_range (REDUCE | 'a', $4); }
  	|       '@' K_STDDEV '(' var_or_range ')' 
  				{ $$ = new_range (REDUCE | 's', $4); }
+ 	|       '@' K_COUNT '(' var_or_range ')' 
+ 				{ $$ = new_range (REDUCE | 'c', $4); }
  	|       '@' K_MAX '(' var_or_range ')' 
  				{ $$ = new_range (REDUCE | MAX, $4); }
  	|	'@' K_MAX '(' e ',' expr_list ')'
diff -c /usr/src/local/sc/help.c ./help.c
*** /usr/src/local/sc/help.c	Thu Sep 15 13:37:05 1988
--- ./help.c	Thu Jun  8 14:24:58 1989
***************
*** 232,237
  "     @sum(r)           Sum all valid cells in the range.",
  "     @prod(r)          Multiply together all valid cells in the range.",
  "     @avg(r)           Average all valid cells in range.",
  "     @max(r)           Return the maximum value in the range.",
  "     @min(r)           Return the minimum value in the range.",
  "                       See also the numeric versions of max and min.",

--- 232,238 -----
  "     @sum(r)           Sum all valid cells in the range.",
  "     @prod(r)          Multiply together all valid cells in the range.",
  "     @avg(r)           Average all valid cells in range.",
+ "     @count(r)         Count all valid cells in range.",
  "     @max(r)           Return the maximum value in the range.",
  "     @min(r)           Return the minimum value in the range.",
  "                       See also the numeric versions of max and min.",
diff -c /usr/src/local/sc/interp.c ./interp.c
*** /usr/src/local/sc/interp.c	Thu Sep 15 13:37:06 1988
--- ./interp.c	Thu Jun  8 13:22:11 1989
***************
*** 240,245
  }
  
  double
  dosum(minr, minc, maxr, maxc)
  int minr, minc, maxr, maxc;
  {

--- 240,261 -----
  }
  
  double
+ docount(minr, minc, maxr, maxc)
+ int minr, minc, maxr, maxc;
+ {
+     int v;
+     register r,c;
+     register struct ent *p;
+ 
+     v = 0;
+     for (r = minr; r<=maxr; r++)
+ 	for (c = minc; c<=maxc; c++)
+ 	    if ((p = tbl[r][c]) && p->flags&is_valid)
+ 		v ++;
+     return v;
+ }
+ 
+ double
  dosum(minr, minc, maxr, maxc)
  int minr, minc, maxr, maxc;
  {
***************
*** 587,592
  	case REDUCE | '+':
   	case REDUCE | '*':
   	case REDUCE | 'a':
   	case REDUCE | 's':
  	case REDUCE | MAX:
  	case REDUCE | MIN:

--- 603,609 -----
  	case REDUCE | '+':
   	case REDUCE | '*':
   	case REDUCE | 'a':
+  	case REDUCE | 'c':
   	case REDUCE | 's':
  	case REDUCE | MAX:
  	case REDUCE | MIN:
***************
*** 603,608
  	            case REDUCE | '+': return dosum(minr, minc, maxr, maxc);
   	            case REDUCE | '*': return doprod(minr, minc, maxr, maxc);
   	            case REDUCE | 'a': return doavg(minr, minc, maxr, maxc);
   	            case REDUCE | 's': return dostddev(minr, minc, maxr, maxc);
   	            case REDUCE | MAX: return domax(minr, minc, maxr, maxc);
   	            case REDUCE | MIN: return domin(minr, minc, maxr, maxc);

--- 620,626 -----
  	            case REDUCE | '+': return dosum(minr, minc, maxr, maxc);
   	            case REDUCE | '*': return doprod(minr, minc, maxr, maxc);
   	            case REDUCE | 'a': return doavg(minr, minc, maxr, maxc);
+  	            case REDUCE | 'c': return docount(minr, minc, maxr, maxc);
   	            case REDUCE | 's': return dostddev(minr, minc, maxr, maxc);
   	            case REDUCE | MAX: return domax(minr, minc, maxr, maxc);
   	            case REDUCE | MIN: return domin(minr, minc, maxr, maxc);
***************
*** 1632,1637
  	case REDUCE | '+': range_arg( "@sum(", e); break;
  	case REDUCE | '*': range_arg( "@prod(", e); break;
  	case REDUCE | 'a': range_arg( "@avg(", e); break;
  	case REDUCE | 's': range_arg( "@stddev(", e); break;
  	case REDUCE | MAX: range_arg( "@max(", e); break;
  	case REDUCE | MIN: range_arg( "@min(", e); break;

--- 1650,1656 -----
  	case REDUCE | '+': range_arg( "@sum(", e); break;
  	case REDUCE | '*': range_arg( "@prod(", e); break;
  	case REDUCE | 'a': range_arg( "@avg(", e); break;
+ 	case REDUCE | 'c': range_arg( "@count(", e); break;
  	case REDUCE | 's': range_arg( "@stddev(", e); break;
  	case REDUCE | MAX: range_arg( "@max(", e); break;
  	case REDUCE | MIN: range_arg( "@min(", e); break;
diff -c /usr/src/local/sc/sc.doc ./sc.doc
*** /usr/src/local/sc/sc.doc	Thu Sep 15 13:37:08 1988
--- ./sc.doc	Thu Jun  8 14:23:03 1989
***************
*** 1225,1230
  Average all valid (nonblank) entries in the specified region.
  .\" ----------
  .TP 18
  .BR @max (r)
  Return the maximum value in the specified region.  See also the multi argument
  version of

--- 1225,1234 -----
  Average all valid (nonblank) entries in the specified region.
  .\" ----------
  .TP 18
+ .BR @count (r)
+ Count all valid (nonblank) entries in the specified region.
+ .\" ----------
+ .TP 18
  .BR @max (r)
  Return the maximum value in the specified region.  See also the multi argument
  version of
-- 
Peter King, Computer Science Department	JANET:	pjbk@uk.ac.hw.cs
  Heriot-Watt University		ARPA:	pjbk@cs.hw.ac.uk
  79 Grassmarket, Edinburgh EH1 2HJ	or	pjbk%cs.hw.ac.uk@ucl-cs
Phone: (+44) 31 225 6465 Ext. 555	UUCP:	..!ukc!cs.hw.ac.uk!pjbk