[comp.sources.bugs] Patch 3 to Reldb - Relational database and graphing tools

gunnar@hafro.is (Gunnar Stefansson) (09/26/89)

This is patch number 3 to Reldb - the filters for relational database
operations and line plotting.

These patches constitute our additions to the line drawing program,
along with some minor mods to a few of the filters for database
operations.  Thanks to Al Gaspar <gaspar@STL-08SIMA.ARMY.MIL> for
pointing out some portability problems.  Some of these have now been
corrected and others at least documented along with a way to get around
them. A serious bug in the math program was also corrected.

Remember to apply patches 1 and 2 first. 

Cd to the top level directory where you are keeping the Reldb stuff and
pipe this through 'patch -p'.

The scat program along with the plot filters should be a very nice
combination by the time you have installed these three initial patches.

I would very much like to hear about any suggestions, problems, etc, but
I will not be able to answer mail during the first few weeks of October.

Enjoy
-----------------------------------------------------------------------------
Gunnar Stefansson                       Uucp: {mcvax,enea}!hafro!gunnar 
Marine Research Institute		Internet: gunnar@hafro.is
P.O. Box 1390,Reykjavik    		Tel: +354 1 20240 Fax: +354 1 623790

*** patchlevel.h	Tue Sep 26 12:01:13 1989
--- patchlevel.h	Tue Sep 26 12:13:57 1989
Prereq: 2
***************
*** 1 ****
! #define PATCHLEVEL 2
--- 1 ----
! #define PATCHLEVEL 3
*** scat.src/defs.h	Tue Sep 26 11:50:49 1989
--- scat.src/defs.h	Sat Aug 19 20:14:30 1989
***************
*** 2,4 ****
  
! #define MAXPTS	1500	/* max no of data points (lines in file) */
  #define MAXCOLS	25	/* max no of data columns */
--- 2,4 ----
  
! #define MAXPTS	2500	/* max no of data points (lines in file) */
  #define MAXCOLS	25	/* max no of data columns */
*** scat.src/plttics.c	Tue Sep 26 11:50:49 1989
--- scat.src/plttics.c	Mon Sep 25 09:48:58 1989
***************
*** 5,7 ****
  
! plot_tics(wxmin,wxmax,wymin,wymax,xmin,xmax,xdelta,ymin,ymax,ydelta)
  double	xmin,xmax;		/* min, max of all x-values */
--- 5,9 ----
  
! plot_ticks(wxmin,wxmax,wymin,wymax,xmin,xmax,xdelta,ymin,ymax,ydelta,
! 		numxlargeticks,numylargeticks,numxsmallticks,numysmallticks)
! int	numxlargeticks,numylargeticks,numxsmallticks,numysmallticks;
  double	xmin,xmax;		/* min, max of all x-values */
***************
*** 14,16 ****
  	char number[80];
- 	double numlargeticks;
  	double x, y;
--- 16,17 ----
***************
*** 23,26 ****
  
! 	labelplace("u");
  	x=xmin;				/* x axis */
  	sprintf(number,xformat,x);	/* char version of axis number */
--- 24,44 ----
  
! 	/* 
! 	  Figure out the number of tic marks on each axis
! 	*/
! 
! 	if(numxsmallticks==0)
! 		numxsmallticks=5;
! 	if(numxlargeticks==0)
! 		numxlargeticks=(int)(((xmax-xmin)/xdelta)/numxsmallticks);
! 	else
! 		xdelta=(xmax-xmin)/(numxlargeticks*numxsmallticks);
! 	if(numysmallticks==0)
! 		numysmallticks=5;
! 	if(numylargeticks==0)
! 		numylargeticks=(int)(((ymax-ymin)/ydelta)/numysmallticks);
! 	else
! 		ydelta=(ymax-ymin)/(numylargeticks*numysmallticks);
! 
  	x=xmin;				/* x axis */
+ 	labelplace("u");		/* labels under ticks */
  	sprintf(number,xformat,x);	/* char version of axis number */
***************
*** 35,39 ****
  
! 	numlargeticks=(((xmax-xmin)/xdelta)/5);
! 	for(i=(int)numlargeticks;i--;){	/* large tick loop */
! 		for(j=5;j--;){		/* small tick loop */
  			transf_data(wxmin,wymin,wxmax,wymax,x,ymin,&outx,&outy);
--- 53,56 ----
  
! 	for(i=numxlargeticks;i--;){	/* large tick loop */
! 		for(j=numxsmallticks;j--;){		/* small tick loop */
  			transf_data(wxmin,wymin,wxmax,wymax,x,ymin,&outx,&outy);
***************
*** 54,57 ****
  
- 	labelplace("l");
  	y=ymin;					/* y axis */
  	sprintf(number,yformat,y);		/* string rep of # */
--- 71,74 ----
  
  	y=ymin;					/* y axis */
+ 	labelplace("l");			/* Labels left of ticks */
  	sprintf(number,yformat,y);		/* string rep of # */
***************
*** 64,68 ****
  	label(number);
! 	numlargeticks=(((ymax-ymin)/ydelta)/5);
! 	for (i=(int)numlargeticks;i--;){
! 		for(j=5;j--;){
  			transf_data(wxmin,wymin,wxmax,wymax,xmin,y,&outx,&outy);
--- 81,85 ----
  	label(number);
! 
! 	for (i=numylargeticks;i--;){
! 		for(j=numysmallticks;j--;){
  			transf_data(wxmin,wymin,wxmax,wymax,xmin,y,&outx,&outy);
*** scat.src/pttxt.c	Tue Sep 26 11:50:49 1989
--- scat.src/pttxt.c	Tue Apr 11 17:57:21 1989
***************
*** 14,16 ****
  	int outx, outy;
! 
  	if(debuglevel)fprintf(stderr,"In plot_texts\n");
--- 14,16 ----
  	int outx, outy;
! 	
  	if(debuglevel)fprintf(stderr,"In plot_texts\n");
*** scat.src/readdat.c	Tue Sep 26 11:50:50 1989
--- scat.src/readdat.c	Mon Sep 25 09:42:26 1989
***************
*** 1,2 ****
--- 1,3 ----
  #include <memory.h>
+ #include <stdio.h>
  #include <string.h>
***************
*** 45,47 ****
  
! 	if (debuglevel) fprintf(stderr,"In read_data\n");
  	do{
--- 46,48 ----
  
! 	if (debuglevel>=2) fprintf(stderr,"In read_data\n");
  	do{
***************
*** 49,50 ****
--- 50,57 ----
  		col++;
+ 		if(col>=MAXCOLS){
+ 			fprintf(stderr,
+ 				"Too many columns in data(%d), max is %d",
+ 				col,MAXCOLS);
+ 			exit(1);
+ 		}
  		while((c=getchar())!='\t'&&c!=' '&&c!='\n'&&c!=EOF)
***************
*** 65,67 ****
  
! 	if (debuglevel) {
  		fprintf(stderr,"drawline after pcol\n");
--- 72,74 ----
  
! 	if (debuglevel>=2) {
  		fprintf(stderr,"drawline after pcol\n");
***************
*** 83,85 ****
  				}
! 	if (debuglevel) {
  		fprintf(stderr,"drawline after lcol\n");
--- 90,92 ----
  				}
! 	if (debuglevel>=2) {
  		fprintf(stderr,"drawline after lcol\n");
***************
*** 100,102 ****
  
! 	if (debuglevel) {
  		fprintf(stderr,"drawline after fix\n");
--- 107,109 ----
  
! 	if (debuglevel>=2) {
  		fprintf(stderr,"drawline after fix\n");
***************
*** 107,109 ****
  		*numcols=tmpcols-lcol;
! 		if (debuglevel) fprintf(stderr,"numcols= %d\n",*numcols);
  
--- 114,116 ----
  		*numcols=tmpcols-lcol;
! 		if (debuglevel>=2) fprintf(stderr,"numcols= %d\n",*numcols);
  
***************
*** 119,120 ****
--- 126,133 ----
  
+ 	if(*numpts>=MAXPTS){
+ 		fprintf(stderr,
+ 			"Too many lines in data(%d), max is %d",
+ 			*numpts,MAXPTS);
+ 		exit(1);
+ 		}
  	    do {
*** scat.src/scat.c	Tue Sep 26 11:50:50 1989
--- scat.src/scat.c	Mon Sep 25 22:25:09 1989
***************
*** 15,17 ****
  
! char           *optstr = "Eeicl:P:H:X:Y:F:w:x:y:d:l:L:";	/* list of options */
  char           *header = "";	/* figure caption */
--- 15,17 ----
  
! char           *optstr = "Eeicl:P:H:X:Y:F:w:x:y:d:l:L:T:t:";	/* list of options */
  char           *header = "";	/* figure caption */
***************
*** 42,43 ****
--- 42,45 ----
  	"-F \"x/y format\"	Format for numbers on x/y axis ",
+ 	"-T \"x/y number\"	Number of large tick marks on x/y axis ",
+ 	"-t \"x/y number\"	Number of small tick marks on x/y axis ",
  	"-c       	Use colors                             ",
***************
*** 67,68 ****
--- 69,71 ----
  						 * missing */
+ 
  double          spaceconst = SPACECONST;
***************
*** 92,93 ****
--- 95,104 ----
  
+ 	int		numxlargeticks=0;/* number of large ticks on x axis*/
+ 	int		numylargeticks=0;/* number of large ticks on y axis*/
+ 	int		numxsmallticks=0;/* number of small ticks on x axis*/
+ 	int		numysmallticks=0;/* number of small ticks on y axis*/
+ 
+ 
+ 
+ 
  	while ((c = getopt(argc, argv, optstr)) != EOF) {
***************
*** 134,135 ****
--- 145,192 ----
  			break;
+ 		case 'T':
+ 			if(debuglevel)
+ 				fprintf(stderr,"Got arg -T with ->%s<-\n",optarg);
+ 			c = optarg[0];
+ 			if (c == 'x' || c == 'X' ) {
+ 				if(sscanf(++optarg,"%d",&numxlargeticks)!=1)
+ 				{
+ 				  fprintf(stderr,"Incorrect use of -T option\n");
+ 				  fprintf(stderr,"Sample use: -Tx10\n");
+ 				  fprintf(stderr,"Use scat -h to get list of options\n");
+ 				  exit(1);
+ 				}
+ 				if(debuglevel)
+ 				  fprintf(stderr,"Read this as %d for x\n",numxlargeticks);
+ 			} else {
+ 				if(sscanf(++optarg,"%d",&numylargeticks)!=1)
+ 				{
+ 				  fprintf(stderr,"Incorrect use of -T option\n");
+ 				  fprintf(stderr,"Sample use: -Ty10\n");
+ 				  fprintf(stderr,"Use scat -h to get list of options\n");
+ 				  exit(1);
+ 				}
+ 				if(debuglevel)
+ 				  fprintf(stderr,"Read this as %d for y\n",numylargeticks);
+ 			}
+ 			break;
+ 		case 't':
+ 			c = optarg[0];
+ 			if (c == 'x' || c == 'X') {
+ 				if(sscanf(++optarg,"%d",&numxsmallticks)!=1)
+ 				{
+ 				  fprintf(stderr,"Incorrect use of -t option\n");
+ 				  fprintf(stderr,"Sample use: -tx10\n");
+ 				  fprintf(stderr,"Use scat -h to get list of options\n");
+ 				  exit(1);
+ 				}
+ 			} else {
+ 				if(sscanf(++optarg,"%d",&numysmallticks)!=1)
+ 				{
+ 				  fprintf(stderr,"Incorrect use of -t option\n");
+ 				  fprintf(stderr,"Sample use: -ty10\n");
+ 				  fprintf(stderr,"Use scat -h to get list of options\n");
+ 				  exit(1);
+ 				}
+ 			}
+ 			break;
  		case 'w':
***************
*** 162,163 ****
--- 219,222 ----
  		fprintf(stderr, "pcol= %d, lcol=%d\n", pcol, lcol);
+ 		fprintf(stderr, "xtics= (%d,%d), ytics=(%d,%d)\n",
+ 			numxlargeticks, numxsmallticks,numylargeticks, numysmallticks);
  	}
***************
*** 220,221 ****
--- 279,285 ----
  	}
+ 
+ 	/*
+ 	  Open the plotting device and possibly erase
+ 	*/
+ 
  	if (debuglevel)
***************
*** 235,236 ****
--- 299,308 ----
  
+ 	/*
+ 	  Convert all input data to the new coordinates.
+ 	  Note that there are two transformations,
+ 	  both to get into the (0,0) to (spaceconst,spaceconst) area
+ 	  (which defines the paper or screen), and then another to
+ 	  get into whatever is specified by the -w option.
+ 	*/
+ 
  	if (debuglevel)
***************
*** 243,244 ****
--- 315,325 ----
  
+ 	/*
+ 	  Now we get to drawing the figure.
+ 	  Lots of ifs and buts here.
+ 	  We need to check whether colors are used.
+ 	  Also whether a label or line should be drawn.
+ 	  If we have a missing value (<tab><tab> in input)
+ 	  then we don't draw a line to the point.
+ 	*/
+ 
  	if (debuglevel)
***************
*** 276,278 ****
  		fprintf(stderr, "Plotting tic-marks\n");
! 	plot_tics(wxmin, wxmax, wymin, wymax, xmin, xmax, xdelta, ymin, ymax, ydelta);
  
--- 357,361 ----
  		fprintf(stderr, "Plotting tic-marks\n");
! 	plot_ticks(wxmin, wxmax, wymin, wymax, xmin, xmax, xdelta, 
! 		ymin, ymax, ydelta,
! 		numxlargeticks,numylargeticks,numxsmallticks,numysmallticks);
  
*** scat.src/trans.c	Tue Sep 26 11:50:50 1989
--- scat.src/trans.c	Mon Sep 25 09:41:30 1989
***************
*** 15,17 ****
    *outy=(int)((wy2-wy1)*(iny-wymin)/(wymax-wymin)+wy1);
!   if(debuglevel){
      fprintf(stderr,"inx= %lf iny= %lf\n",inx,iny);
--- 15,17 ----
    *outy=(int)((wy2-wy1)*(iny-wymin)/(wymax-wymin)+wy1);
!   if(debuglevel>=5){
      fprintf(stderr,"inx= %lf iny= %lf\n",inx,iny);
*** reldb.src/addup.c	Tue Sep 26 11:50:42 1989
--- reldb.src/addup.c	Sat Sep 23 12:38:04 1989
***************
*** 31,33 ****
  #include <stdio.h>
! #include <strings.h>
  
--- 31,37 ----
  #include <stdio.h>
! #ifdef SYSV
! #    include <string.h>
! #else
! #    include <strings.h>
! #endif
  
***************
*** 191,193 ****
  }	/* addup */
! 
  output(oldline,sum)
--- 195,197 ----
  }	/* addup */
! 	
  output(oldline,sum)
*** reldb.src/dbe.add.sh	Tue Sep 26 11:50:44 1989
--- reldb.src/dbe.add.sh	Tue Sep  5 12:37:17 1989
***************
*** 1,2 ****
! :
  #
--- 1,2 ----
! #!/bin/sh
  #
***************
*** 15,16 ****
--- 15,37 ----
  #
+ 
+ if [ ! -f "$1" ]
+ then
+ 	echo "Usage: $0 filename"
+ 	exit 1
+ fi
+ 
+ #
+ # Stole the following from Elm - probably from Larry Wall originally
+ #
+ if [ "`echo -n`" = "-n" ]
+ then
+   erase="tput clear"
+   nflag=""
+   cflag="\\c" 
+ else
+   erase=clear
+   nflag="-n"
+   cflag=""
+ fi
+ 
  read x < $1
***************
*** 19,21 ****
  	record=""
! 	tput clear
  	for fld in $x
--- 40,42 ----
  	record=""
! 	$erase
  	for fld in $x
***************
*** 22,24 ****
  	do
! 		echo "$fld : \c"
  		read temp
--- 43,45 ----
  	do
! 		echo $nflag "$fld : $cflag"
  		read temp
*** reldb.src/joinle.c	Tue Sep 26 11:50:45 1989
--- reldb.src/joinle.c	Tue Apr 11 17:56:58 1989
***************
*** 26,28 ****
  	char *curfile;
! 
  	int minlen=999999;
--- 26,28 ----
  	char *curfile;
! 	
  	int minlen=999999;
*** reldb.src/math.sh	Tue Sep 26 11:50:45 1989
--- reldb.src/math.sh	Tue Sep 12 14:34:44 1989
***************
*** 35,37 ****
  			mean=sum[i]/freq[i]
! 			if(mean=int(mean))
  				printf("%d\t",sum[i]/freq[i]);
--- 35,37 ----
  			mean=sum[i]/freq[i]
! 			if(mean==int(mean))
  				printf("%d\t",sum[i]/freq[i]);
*** reldb.src/matrix.c	Tue Sep 26 11:50:46 1989
--- reldb.src/matrix.c	Tue Apr 11 17:57:00 1989
***************
*** 19,21 ****
  	char *format="\t%f";	/* Output table default format */
! 
  	static float freq[MAXX][MAXY];	/* the frequencies */
--- 19,21 ----
  	char *format="\t%f";	/* Output table default format */
! 	
  	static float freq[MAXX][MAXY];	/* the frequencies */
***************
*** 26,28 ****
  	int minx,maxx,miny,maxy;/* computed bounds on input data */
! 
  	while(--argc){
--- 26,28 ----
  	int minx,maxx,miny,maxy;/* computed bounds on input data */
! 	
  	while(--argc){
*** reldb.src/plokk.c	Tue Sep 26 11:50:47 1989
--- reldb.src/plokk.c	Tue Apr 11 17:57:03 1989
***************
*** 18,20 ****
  	int n;			/* first value in a data line */
! 
  	int select[5000];	/* 1=values to select 0=skip*/
--- 18,20 ----
  	int n;			/* first value in a data line */
! 	
  	int select[5000];	/* 1=values to select 0=skip*/
*** reldb.src/project.c	Tue Sep 26 11:50:47 1989
--- reldb.src/project.c	Sat Sep 23 12:45:20 1989
***************
*** 3,5 ****
  
! 	Author; johanna@hafro.is (1987?)
  */
--- 3,26 ----
  
! 	Original author: johanna@hafro.is (1987?)
! ================================================================
! Note:
! 
! This program is in severe need of rehabilitation -- first of all there
! are no comments, so it's quite hard to figure out what's going on, and
! secondly a number of things are hardwired.
! 
! A known problem here is with compilation, due to the way matrices are
! defined in:
!        char tabv[1000][100];
!        int posv[1000];
! On at least one machine, the program runs if you change these
! definitions to:
!        char tabv[500][50];
!        int posv[500];
! Not that this kind of thing occurs several times in the program.
! If you do clean up the program, please let me know so that I can send
! the mods to other people.
! 
! 		gunnar@hafro.is	(September, 1989)
! ================================================================
  */
*** reldb.src/regress.c	Tue Sep 26 11:50:40 1989
--- reldb.src/regress.c	Tue Apr 11 17:57:06 1989
***************
*** 4,6 ****
  	Input : A reldb file of the form :
! 
  		xname	yname
--- 4,6 ----
  	Input : A reldb file of the form :
! 	
  		xname	yname
***************
*** 12,14 ****
  	Usage : regress < datafile
! 
  	Output : to std. out, all sorts of regression statistics.
--- 12,14 ----
  	Usage : regress < datafile
! 	
  	Output : to std. out, all sorts of regression statistics.
*** reldb.src/subtotal.c	Tue Sep 26 11:50:41 1989
--- reldb.src/subtotal.c	Sat Sep 23 12:38:58 1989
***************
*** 16,18 ****
  	Revisions due to incorrect string handling:
! 		gunnar@hafro.is (April, 1989)
  */
--- 16,18 ----
  	Revisions due to incorrect string handling:
! 		gunnar@hafro.is (April, 1989) and again, Sept, 1989.
  */
***************
*** 21,24 ****
  #include <sys/wait.h>
- #endif
  #include <strings.h>
  #define MAXCMD 1000
--- 21,27 ----
  #include <sys/wait.h>
  #include <strings.h>
+ #else
+ #include <string.h>
+ #endif
+ 
  #define MAXCMD 1000
*** reldb.src/testdb.sh	Tue Sep 26 11:50:42 1989
--- reldb.src/testdb.sh	Tue Sep  5 12:40:28 1989
***************
*** 19,20 ****
--- 19,21 ----
  then
+ 	echo Making directory `pwd`/testdb
  	mkdir testdb
***************
*** 26,28 ****
  cp $RELDBDIR/* .
! echo "Running 'make' - this willl result in a number of .tmp-files"
  make
--- 27,29 ----
  cp $RELDBDIR/* .
! echo "Running 'make' - this will result in a number of .tmp-files:"
  make
*** testdb/subtotal.res	Tue Sep 26 11:50:58 1989
--- testdb/subtotal.res	Sun Apr 16 20:17:21 1989
***************
*** 25,27 ****
  2	9
! 
  Input data (subtotal.data):
--- 25,27 ----
  2	9
! 
  Input data (subtotal.data):
-- 
-----------------------------------------------------------------------------
Gunnar Stefansson                       Uucp: {mcvax,enea}!hafro!gunnar 
Marine Research Institute		Internet: gunnar@hafro.is
P.O. Box 1390,Reykjavik    		Tel: +354 1 20240 Fax: +354 1 623790