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

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

This is patch 2 to Reldb.

These patches include some corrections to problems that occurred during
distribution (in particular, a newline was missing in one of the
doc-files, causing strange things). Also included are changes
to the plot(1)-filters, xplot, hpglplot and plot itself. Xplot in now
much better than before, and several new extensions have been added to
the standard plot(5)-commands.

Remember to apply patch 1 before this.

cd to where you keep the Reldb programs and run this through 'patch -p'.

Please let me know asap of any problems.

*** patchlevel.h	Tue Sep 26 11:26:00 1989
--- patchlevel.h	Tue Sep 26 11:40:23 1989
Prereq: 1
***************
*** 1 ****
! #define PATCHLEVEL 1
--- 1 ----
! #define PATCHLEVEL 2
*** doc/scat.1	Tue Sep 26 11:25:08 1989
--- doc/scat.1	Mon Sep 25 22:31:12 1989
***************
*** 59,60 ****
--- 59,76 ----
  [
+ .B \-T
+ "x number"
+ ]
+ [
+ .B \-T
+ "y number"
+ ]
+ [
+ .B \-t
+ "x number"
+ ]
+ [
+ .B \-t
+ "y number"
+ ]
+ [
  .B \-d
***************
*** 187,188 ****
--- 203,217 ----
  .I name.
+ .TP
+ .BI \-T\ xnumber
+ Number of large tick marks on x-axis.
+ .TP
+ .BI \-T\ ynumber
+ Number of large tick marks on y-axis.
+ .TP
+ .BI \-t\ xnumber
+ Number of small tick marks between large tick marks on x-axis.
+ .TP
+ .BI \-t\ xnumber
+ Number of small tick marks between large tick marks on y-axis.
+ .B
  .TP
*** doc/subtotal.1	Tue Sep 26 11:25:09 1989
--- doc/subtotal.1	Mon Sep 25 21:01:49 1989
***************
*** 56,117 ****
  .I addcol
! to do the work. This is inefficient but the inefficiency is rarely noticable.\Rogue\Monster\
! else
!   echo "will not over write ./doc/subtotal.1"
! fi
! if `test ! -s ./doc/union.1`
! then
! echo "writting ./doc/union.1"
! cat > ./doc/union.1 << '\Rogue\Monster\'
! .\" Man page for union(1)
! .TH UNION 1 "1. April 1989"
! .SH NAME
! union - appends one table to another
! .SH SYNOPSIS
! .B union
! .I file1\ file2
! [
! .I >\ outputfile
! ]
! .SH DESCRIPTION
! .LP
! The 
! .I union
! command simply concatenates two files, appending the second to the
! first, but using only the header of the first file.
! .LP
! With the two files,
! .I data1:
! .nf
! first   second  third
! -----   ------  -----
! 1       3       0
! 1       2       3
! .fi
! and 
! .I data2:
! .nf
! first   second  third
! -----   ------  -----
! 2       3       4
! 3       4       5
! 4       5       6
! .fi
! the 
! command
! .BI union\ data1\ data2
! yields:
! .nf
! first   second  third
! -----   ------  -----
! 1       3       0
! 1       2       3
! 2       3       4
! 3       4       5
! 4       5       6
! .fi
! on the standard output.
! .LP
! Note that the two input files must have the same columns, 
! in the same order.
! .SH "SEE ALSO"
! .BR reldb(1)\ cat(1).
--- 56,57 ----
  .I addcol
! to do the work. This is inefficient but the inefficiency is rarely noticable.
*** /dev/null	Tue Sep 26 10:45:31 1989
--- doc/union.1	Wed Apr 19 10:58:05 1989
***************
*** 0 ****
--- 1,53 ----
+ .\" Man page for union(1)
+ .TH UNION 1 "1. April 1989"
+ .SH NAME
+ union - appends one table to another
+ .SH SYNOPSIS
+ .B union
+ .I file1\ file2
+ [
+ .I >\ outputfile
+ ]
+ .SH DESCRIPTION
+ .LP
+ The 
+ .I union
+ command simply concatenates two files, appending the second to the
+ first, but using only the header of the first file.
+ .LP
+ With the two files,
+ .I data1:
+ .nf
+ first   second  third
+ -----   ------  -----
+ 1       3       0
+ 1       2       3
+ .fi
+ and 
+ .I data2:
+ .nf
+ first   second  third
+ -----   ------  -----
+ 2       3       4
+ 3       4       5
+ 4       5       6
+ .fi
+ the 
+ command
+ .BI union\ data1\ data2
+ yields:
+ .nf
+ first   second  third
+ -----   ------  -----
+ 1       3       0
+ 1       2       3
+ 2       3       4
+ 3       4       5
+ 4       5       6
+ .fi
+ on the standard output.
+ .LP
+ Note that the two input files must have the same columns, 
+ in the same order.
+ .SH "SEE ALSO"
+ .BR reldb(1)\ cat(1).
  
*** plot1.src/README	Tue Sep 26 11:25:12 1989
--- plot1.src/README	Thu Sep 21 21:27:48 1989
***************
*** 21,25 ****
  Graplot will take plot(5)-data and write output for the grap-program.
! This is extremely handy for putting into a troff-style paper.
  
! I (gunnar@hafro) apologize for not having gotten formal permission from
  previous authors (notable Jim Constantine and Scott Sutherland)
--- 21,25 ----
  Graplot will take plot(5)-data and write output for the grap-program.
! This is extremely handy for putting graphics into a troff-style paper.
  
! I (gunnar@hafro.is) apologize for not having gotten formal permission from
  previous authors (notable Jim Constantine and Scott Sutherland)
*** plot1.src/hpglplot.c	Tue Sep 26 11:25:12 1989
--- plot1.src/hpglplot.c	Mon Sep 25 21:33:03 1989
***************
*** 1,2 ****
--- 1,20 ----
+ /* This is hpgl.c -- a collection of plot(3) routines   */
+ /* which are called upon by the plotfilter.c-program	*/
+ /* 							*/
+ /* These routines output HPGL plotting commands		*/
+ /* Some routines have been added to the standard 	*/
+ /* plot(3)-library -- see below				*/
+ /* 							*/
+ /* Contributors:					*/
+ /* 							*/
+ /* Modified July 1989 by Jon von Tetzchner Stephenson	*/
+ /* Several mods added by asta@hafro.is, early 1989	*/
+ /* See also comments in xplot.c 			*/
+ /* HP-GL plot(5) library				*/
+ /* - does NOT do line locking				*/
+ /* - aspect ratio is not maintained			*/
+ /* Originally by: Jim Constantine	     		*/
+ /* Copyright 1985 Sun Microsystems Inc.			*/
  
+ 
  #include <sgtty.h>
***************
*** 5,19 ****
  
! /* HP-GL plot(5) library				*/
! /* - does NOT do line locking				*/
! /* - aspect ratio is not maintained			*/
! /* Jim Constantine	               	 		*/
! /* Copyright 1985 Sun Microsystems Inc.			*/
! /* Extensions by asta@hafro.is (March, 1989) 		*/
! /* Prepared for redistribution by gunnar@hafro.is	*/
! /* Notable features, which are really bugs: This 
!    program assumes it is writing to a device. That 
!    causes problems when writing to e.g. hpgl2ps filters.
!    Use of some special HPGL escape sequences may also cause
!    problems						*/
  
  openpl()
--- 23,29 ----
  
! int loX=-999999,loY=-999999,hiX=999999,hiY=999999;
! int OUT=0;
! int saveX=-100,saveY=-100;
  
+ 
  openpl()
***************
*** 32,35 ****
  
!     /*printf("IN;\033.P1:");		/* out - gs */
!     printf("IN;");
      fflush(stdout);
--- 42,44 ----
  
!     printf("IN;\033.P1:");
      fflush(stdout);
***************
*** 42,44 ****
  {
!     printf("PU %d,%d;\n", x, y);
  }
--- 51,57 ----
  {
!         OUT=check(&x,&y);
! 	saveX=x;
! 	saveY=y;
!         if(! OUT)
! 	  printf("PU %d,%d;\n", x, y); 
  }
***************
*** 47,49 ****
  {
!     printf("PU %d,%d PD %d,%d;\n", x1, y1, x2, y2);
  }
--- 60,68 ----
  {
!   int out1,out2;
!     out1=check(&x1,&y1);
!     out2=check(&x2,&y2);
!     if (! (out1 && out2))
!       printf("PU %d,%d PD %d,%d;\n", x1, y1, x2, y2);
!     saveX=x2;
!     saveY=y2;
  }
***************
*** 53,54 ****
--- 72,74 ----
  {
+     printf("PU %d,%d;\n", saveX, saveY);
      printf("LB%s\03;\n", s);
***************
*** 58,60 ****
  {
!     printf("PG;AF;\n");		/* feed page if paper has been writen on */
  }
--- 78,80 ----
  {
!     printf("PG;AF;\n");		/* feed page if paper has been written on */
  }
***************
*** 63,65 ****
  {
!     printf("PU %d,%d PD PU;\n", x, y);
  }
--- 83,87 ----
  {
!     OUT=check(&x,&y);
!     if (! OUT)
!       printf("PU %d,%d PD PU;\n", x, y);
  }
***************
*** 68,70 ****
  {
!     printf("PD %d,%d;\n", x, y);
  }
--- 90,101 ----
  {
!     int outside;
!     outside=check(&x,&y);
!     if (! (outside && OUT))
!       { 	
! 	OUT=outside;
! 	printf("PU %d,%d;\n", saveX, saveY);
! 	printf("PD %d,%d;\n", x, y);
!       }
!     saveX=x;
!     saveY=y;
  }
***************
*** 122,124 ****
  labelrotation(s)
!     char *s;
  {
--- 153,155 ----
  labelrotation(s)
!    char *s;
  {
***************
*** 171,173 ****
  selectcolor(s)
!     char *s;
  {
--- 202,204 ----
  selectcolor(s)
!     int s;
  {
***************
*** 174,178 ****
  
!     switch(s[1]) {
  
!     case '1': /* select pen 1 */
  	printf("SP 1;\n");
--- 205,209 ----
  
!     switch(s) {
  
!     case 1: /* select pen 1 */
  	printf("SP 1;\n");
***************
*** 180,182 ****
  
!     case '2': /* select pen 2 */
  	printf("SP 2;\n");
--- 211,213 ----
  
!     case 2: /* select pen 2 */
  	printf("SP 2;\n");
***************
*** 184,186 ****
  
!     case '3': /* select pen 3 */
  	printf("SP 3;\n");
--- 215,217 ----
  
!     case 3: /* select pen 3 */
  	printf("SP 3;\n");
***************
*** 188,190 ****
  
!     case '4': /* select pen 4 */
  	printf("SP 4;\n");
--- 219,221 ----
  
!     case 4: /* select pen 4 */
  	printf("SP 4;\n");
***************
*** 192,194 ****
  
!     case '5': /* select pen 5 */
  	printf("SP 5;\n");
--- 223,225 ----
  
!     case 5: /* select pen 5 */
  	printf("SP 5;\n");
***************
*** 196,198 ****
  
!     case '6': /* select pen 6 */
  	printf("SP 6;\n");
--- 227,229 ----
  
!     case 6: /* select pen 6 */
  	printf("SP 6;\n");
***************
*** 200,202 ****
  
!     case '7': /* select pen 7 */
  	printf("SP 7;\n");
--- 231,233 ----
  
!     case 7: /* select pen 7 */
  	printf("SP 7;\n");
***************
*** 204,206 ****
  
!     case '8': /* select pen 8 */
  	printf("SP 8;\n");
--- 235,237 ----
  
!     case 8: /* select pen 8 */
  	printf("SP 8;\n");
***************
*** 219 ****
--- 250,314 ----
  
+ 
+ /***********************************************************************
+  *                       check by jvts                                 *
+  ***********************************************************************/
+ 
+ check(x,y)
+      int *x,*y;
+ {
+   int outside=0;
+   if (*x>hiX) {*x=hiX;outside=1;}
+   else if (*x<loX) {*x=loX;outside=1;}
+   if (*y>hiY) {*y=hiY;outside=1;}
+   else if (*y<loY) {*y=loY;outside=1;}
+   return outside;
+ }
+ 
+ 
+ /************************************************************************
+  *        homemade:     window by jon v. tetzchner stephenson           *
+  ************************************************************************/
+ window(x0,y0,x1,y1)
+      int x0,y0,x1,y1;
+ {
+ 
+   loX=x0;
+   loY=y0;
+   hiX=x1;
+   hiY=y1;
+ 
+   /*printf("IW %d %d %d %d",x0,y0,x1,y1);*/
+ }
+ 
+ /************************************************************************
+  *                    linewid                                           *
+  ************************************************************************/
+ 
+ linewid(wi)
+      int wi;
+ {
+   if (wi==1) printf("LT;\n");
+   else if (wi==2 || wi==3 || wi==4)  printf("LT 3;\n");
+   else if (wi==5) printf("LT 1;\n");
+   else if (wi==6) printf("LT;\n");
+   else
+     {
+            	printf("LT;\n");
+     }
+ }
+ 
+ 
+ 
+ /************************************************************************
+  *        box by jvts                                                   *
+  ************************************************************************/
+ 
+ box(x1,y1,x2,y2)
+      int x1,y1,x2,y2;
+ {
+   move(x1,y1);
+   cont(x2,y1);
+   cont(x2,y2);
+   cont(x1,y2);
+   cont(x1,y1);
+ }
*** plot1.src/plotfilter.c	Tue Sep 26 11:25:13 1989
--- plot1.src/plotfilter.c	Mon Sep 11 08:54:39 1989
***************
*** 49,50 ****
--- 49,58 ----
  
+ 	    case 'b': 			
+ 		x1 = getint();
+ 		y1 = getint();
+ 		x2 = getint();
+ 		y2 = getint();
+ 		box(x1,y1,x2,y2);
+ 		break; 
+ 
  	    case 't': 			/* text */
***************
*** 66,67 ****
--- 74,84 ----
  
+ 	    case 'w': 			/* window */
+ 		x1 = getint();
+ 		y1 = getint();
+ 		x2 = getint();
+ 		y2 = getint();
+ 		window(x1,y1,x2,y2);
+ 		break;
+ 
+ 
  	    case 'a': 			/* arc */
***************
*** 99,102 ****
  	    case 'z': 			/* homemade colorfunction*/
! 		string(buf);
! 		selectcolor(buf);
  		break;
--- 116,119 ----
  	    case 'z': 			/* homemade colorfunction*/
! 		x1=getint();
! 		selectcolor(x1);
  		break;
***************
*** 103,104 ****
--- 120,126 ----
  
+ 	      case 'v':                 /* linewid */
+ 		x1=getint();
+ 		linewid(x1);
+ 		break;
+ 		
  	    default: 
***************
*** 139 ****
--- 161,163 ----
  }
+ 
+ 
*** plot1.src/xplot.c	Tue Sep 26 11:25:13 1989
--- plot1.src/xplot.c	Thu Sep 14 15:40:01 1989
***************
*** 1 ****
--- 1,4 ----
+ /* Modified July 1989 by Jon von Tetzchner Stephenson, hafransoknarstofnun Islands */
+ 
+ 
  /************************************************************************
***************
*** 4,6 ****
   *   Asta G. March 1989                                                 *
!  *   Adapted from a code for suntools by:                               *
   *									*
--- 7,9 ----
   *   Asta G. March 1989                                                 *
!  *   Adapted from a code by:                                            *
   *									*
***************
*** 9,11 ****
   *									*
!  *   This was adapted from a code by:					*
   *   	Jim Constantine, Janurary 1986					*
--- 12,14 ----
   *									*
!  *   Adapted from a code by:						*
   *   	Jim Constantine, Janurary 1986					*
***************
*** 20,21 ****
--- 23,25 ----
  #include <strings.h>
+ #include <X11/Xos.h>
  
***************
*** 25,26 ****
--- 29,46 ----
  
+ #define NUMLINES 5                       /* for linemod */
+ #define DOTTED_LIST_LENGTH 2
+ #define DOT_DASHED_LIST_LENGTH 4
+ #define SHORT_DASHED_LIST_LENGTH 2
+ #define LONG_DASHED_LIST_LENGTH 2
+ 
+ 
+ /* When the window command is not called, these values are used .   */
+ /* I hope they are large(small) enaugh.                             */
+ 
+ int loX=-999999,loY=-999999,hiX=999999,hiY=999999,oldX,oldY;
+ 
+ int OUT=0;                  /* was last drawing outside of window ? */
+ 
+ int gcnum=4;                      /* to chose linemod (4=linesolid) */
+ 
  /* plot stuff */
***************
*** 31,33 ****
  char		*label_pl;
! int		xheight, yheight, width;
  int winX, winY, winW, winH;
--- 51,53 ----
  char		*label_pl;
! int		xheight, yheight, width,xxwidth,xxheight;
  int winX, winY, winW, winH;
***************
*** 65,67 ****
  Window      win;            /* Window ID */
! GC          gc;             /* GC to draw with */
  char        *fontName;      /* Name of the font to use */
--- 85,87 ----
  Window      win;            /* Window ID */
! GC          gc[NUMLINES];   /* GCs to draw with */
  char        *fontName;      /* Name of the font to use */
***************
*** 75,78 ****
  char       *geomSpec;       /* Window geometry string */
! XSetWindowAttributes xswa;  /* Temporary Set Window Attribute struct
  Window win;
   
--- 95,164 ----
  char       *geomSpec;       /* Window geometry string */
! XSetWindowAttributes xswa;  /* Temporary Set Window Attribute struct */
  Window win;
+ int COLOR=0;                /* Are we using a color displaay ?? */
+ 
+ #define MAX_COLORS 9        /* I use 9 colors, no problem to use more */
+ int colors[MAX_COLORS];     /* definitions of colors */
+ int VERTICAL=0;
+ 
+ 
+ /*************************************************************************
+  * get_colors is a routine that is called from openpl. It checks if the  *
+  * display uses color and if so sets the COLOR variable to 1 (TRUE)      *
+  *************************************************************************/
+ 
+ get_colors()               
+ {
+   int depth;
+   Visual *visual;
+   static char *name[]={"Black","Blue","Red","Green","Yellow","Cyan","Pink","Orange","Gold"};
+   XColor exact_def;
+   Colormap cmap;
+   int ncolors=MAX_COLORS;
+ 
+   int i;
+   
+   /*  printf("in get colors\n"); */
+   
+   depth=DisplayPlanes(dpy,DefaultScreen(dpy));
+   visual=DefaultVisual(dpy,DefaultScreen(dpy));
+   cmap=DefaultColormap(dpy,DefaultScreen(dpy));
+ 
+   if (depth==1)
+     {
+       /* printf("monocrome\n"); */
+       bd=BlackPixel(dpy,DefaultScreen(dpy));
+       bg=WhitePixel(dpy,DefaultScreen(dpy));
+       fg=BlackPixel(dpy,DefaultScreen(dpy));
+     }
+   else
+     {
+       for (i=0;i<MAX_COLORS; i++)
+ 	{
+ 	  /* printf("allocating %s \n",name[i]); */
+ 	  if (! XParseColor(dpy,cmap,name[i],&exact_def))
+ 	    {
+ 	      fprintf(stderr,"XXplot: color name %s not in database\n",name[i]);
+ 	      exit(0);
+ 	    }
+ 	  /* printf("The RGB values from the database are %d %d %d\n",
+ 		 exact_def.red,exact_def.green,exact_def.blue);        */
+ 	  if (! XAllocColor(dpy,cmap,&exact_def))
+ 	    {
+ 	      fprintf(stderr,"XXplot: all colorcells allocated and read/write\n");
+ 	      exit(0);
+ 	    }
+ 	  /* printf("The RGB values actually allocated are %d %d %d\n",
+ 		 exact_def.red,exact_def.green,exact_def.blue);         */
+ 	  colors[i]=exact_def.pixel;
+ 	}
+       /* printf("allocated %d read/write colorcells\n",ncolors); */
+        
+       bg = WhitePixel(dpy, DefaultScreen(dpy));
+       bd = BlackPixel(dpy, DefaultScreen(dpy)); 
+       fg=colors[0];
+       COLOR=1;
+     }
+ }
+ 
   
***************
*** 81,84 ****
  /************************************************************************/
! openpl() {
! 
   /* Process arguments: */
--- 167,172 ----
  /************************************************************************/
! openpl() 
! {
!   int done1=0;
!   char *fontname2="6x13";
   /* Process arguments: */
***************
*** 105,113 ****
      if ((fontName = XGetDefault(dpy, argv_copy[0], ARG_FONT)) == NULL) {
!         fontName = FONT;
!     }
      if ((fontstruct = XLoadQueryFont(dpy, fontName)) == NULL) {
!         fprintf(stderr, "%s: display %s doesn't know font %s\n",
!                 argv_copy[0], DisplayString(dpy), fontName);
!         exit(1);
!     }
      fth = fontstruct->max_bounds.ascent + fontstruct->max_bounds.descent;
--- 193,206 ----
      if ((fontName = XGetDefault(dpy, argv_copy[0], ARG_FONT)) == NULL) {
!         fontName = FONT; 
!     } 
! 
      if ((fontstruct = XLoadQueryFont(dpy, fontName)) == NULL) {
!         if ((fontstruct = XLoadQueryFont(dpy,fontname2))==NULL)
! 	  {
! 	    fprintf(stderr, "%s: display %s doesn't know font %s\n",
!                 argv_copy[0], DisplayString(dpy), fontname2);
! 	    exit(1);
! 	  }
!       }
! 
      fth = fontstruct->max_bounds.ascent + fontstruct->max_bounds.descent;
***************
*** 116,118 ****
  
! 	    /*
       * Select colors for the border,  the window background,  and the
--- 209,211 ----
  
! /*
       * Select colors for the border,  the window background,  and the
***************
*** 120,124 ****
       */
!     bd = BlackPixel(dpy, DefaultScreen(dpy));
!     bg = WhitePixel(dpy, DefaultScreen(dpy));
!     fg = BlackPixel(dpy, DefaultScreen(dpy)); 
  
--- 213,216 ----
       */
!    
!  get_colors();
  
***************
*** 144,146 ****
       }
!         
       win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy),
--- 236,241 ----
       }
!     
!     xxwidth=xsh.width;
!     xxheight=xsh.height;
! 
       win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy),
***************
*** 171,184 ****
  
!      /*
!      * Create the GC for plotting.  See Section 5.3.
!      */
! 
!      gcv.font = fontstruct->fid;
!      gcv.foreground = fg;
!      gcv.background = bg;
! /*     gcv.function=GXand;
!      gcv.plane_mask=BlackPixel(dpy,DefaultScreen(dpy)) ^
!                     WhitePixel(dpy,DefaultScreen(dpy));    */
!      gc = XCreateGC(dpy, win, (GCFont | GCForeground | GCBackground ), &gcv);
! 
      /*
--- 266,269 ----
  
!     set_dashes();
!    
      /*
***************
*** 187,189 ****
       */
!     XSelectInput(dpy, win, ExposureMask);
       
--- 272,274 ----
       */
!     XSelectInput(dpy, win, ExposureMask| StructureNotifyMask);
       
***************
*** 193,197 ****
      XMapWindow(dpy, win);     
!     XNextEvent(dpy, &event);
!    
  }
  /************************************************************************/
--- 278,358 ----
      XMapWindow(dpy, win);     
! 
!   while(! done1)
!     {
! 
!       XNextEvent(dpy,&event);
!       switch(event.type)
! 	{
! 	case Expose:   
! 	
! 	 	       while (XCheckTypedEvent(dpy,Expose,&event))  ;
! 	       	     	
! 			    
! 			    done1=1;
! 			 
! 		       break;
! 
! 	case ConfigureNotify:
! 	
! 	               xxwidth=event.xconfigure.width;
! 		       xxheight=event.xconfigure.height;
! 		       break;
! 
! 
!      	default:      /* all events selected by StructureNotifyMask except ConfigureNotify are */
!          	      /* thrown away here, since nothing is done with them                     */
! 	                
! 	              done1=1;    /* because of some problems with hafro */
! 		      break;
!         }
!      }
! 
!     
  }
+ 
+ /**********************************************************************/
+ /* set_dashes sets 5 diffrent gcs to be able to alter linemod quickly */
+ /* called by openpl                                                   */
+ /**********************************************************************/
+ set_dashes()
+      /*
+      * Create the GC for plotting.  See Section 5.3.
+      */
+ {
+   int i;
+   static int dash_list_length[]=
+     {
+       DOTTED_LIST_LENGTH,
+       DOT_DASHED_LIST_LENGTH,
+       SHORT_DASHED_LIST_LENGTH,
+       LONG_DASHED_LIST_LENGTH
+     };
+ 
+   static unsigned char dotted[DOTTED_LIST_LENGTH]={3,1};
+   static unsigned char dot_dashed[DOT_DASHED_LIST_LENGTH]={3,4,3,1};
+   static unsigned char short_dashed[SHORT_DASHED_LIST_LENGTH]={4,4};
+   static unsigned char long_dashed[LONG_DASHED_LIST_LENGTH]={4,7};
+ 
+   static unsigned char *dash_list[]=
+     {
+       dotted,dot_dashed,short_dashed,long_dashed
+     };
+   int dash_offset=0;
+   gcv.font = fontstruct->fid;
+   gcv.foreground = fg;
+   gcv.background = bg;
+ /*     gcv.function=GXand;
+      gcv.plane_mask=BlackPixel(dpy,DefaultScreen(dpy)) ^
+                     WhitePixel(dpy,DefaultScreen(dpy));    */
+ 
+   gcv.line_style=LineOnOffDash;
+   for (i=0; i<NUMLINES-1;i++)
+     {
+       gc[i] = XCreateGC(dpy, win, (GCFont | GCForeground | GCBackground | GCLineStyle ), &gcv);
+       XSetDashes(dpy,gc[i],dash_offset,dash_list[i],dash_list_length[i]);
+     }
+   gcv.line_style=LineSolid;
+   gc[4]=XCreateGC(dpy, win, (GCFont | GCForeground | GCBackground | GCLineStyle ), &gcv);
+ }
+ 
  /************************************************************************/
***************
*** 200,201 ****
--- 361,364 ----
  move(x1, y1) {
+ 
+     OUT=check(&x1,&y1);
      x = scalex(x1);
***************
*** 202,203 ****
--- 365,367 ----
      y = scaley(y1);
+   
  }
***************
*** 206,214 ****
  /************************************************************************/
! cont(x1, y1) {
!     x1 = scalex(x1);
!     y1 = scaley(y1);
!     XDrawLine(dpy, win, gc, x, y, x1, y1);
!     x = x1;
!     y = y1;
!     XFlush(dpy);
  }
--- 370,391 ----
  /************************************************************************/
! cont(x1, y1) 
! {
!     int outside;
! 
!     outside=check(&x1,&y1);
!     if (! (outside && OUT))
!       { 	
! 	OUT=outside;
! 	x1 = scalex(x1);
! 	y1 = scaley(y1);
! 	XDrawLine(dpy, win, gc[gcnum], x, y, x1, y1);
! 	x = x1;
! 	y = y1;
! 	XFlush(dpy);
!       }
!     else
!       {
! 	x = scalex(x1);
! 	y = scaley(y1);
!       }
  }
***************
*** 217,223 ****
  /************************************************************************/
! point(x, y) {
!     x = scalex(x);
!     y = scaley(y);
!     XDrawRectangle(dpy, win, gc, x, y, 1, 1);
!     XFlush(dpy);
  }
--- 394,405 ----
  /************************************************************************/
! point(x, y) 
! {
!     OUT=check(&x,&y);
!     if (! OUT)
!       {
! 	x = scalex(x);
! 	y = scaley(y);
! 	XDrawRectangle(dpy, win, gc[gcnum], x, y, 1, 1);
! 	XFlush(dpy);
!       }
  }
***************
*** 227,235 ****
  line(x1, y1, x2, y2) {
!     x1 = scalex(x1);
!     y1 = scaley(y1);
!     x2 = scalex(x2);
!     y2 = scaley(y2);
!     XDrawLine(dpy, win, gc, x1, y1, x2, y2);
!     XFlush(dpy);
  }
  /************************************************************************/
--- 409,444 ----
  line(x1, y1, x2, y2) {
!     int out1,out2;
!     out1=check(&x1,&y1);
!     out2=check(&x2,&y2);
!     if (! (out1 && out2))
!       {
! 	x1 = scalex(x1);
! 	y1 = scaley(y1);
! 	x2 = scalex(x2);
! 	y2 = scaley(y2);
! 	XDrawLine(dpy, win, gc[gcnum], x1, y1, x2, y2);
! 	XFlush(dpy);
!       }
  }
+ 
+ 
+ /************************************************************************
+  *        box by jvts                                                   *
+  ************************************************************************/
+ box(x1, y1, x2, y2) {
+     int out1,out2;
+     out1=check(&x1,&y1);
+     out2=check(&x2,&y2);
+     if (! (out1 && out2))
+       {
+ 	x1 = scalex(x1);
+ 	y1 = scaley(y1);
+ 	x2 = scalex(x2);
+ 	y2 = scaley(y2);
+ 	XDrawRectangle(dpy,win,gc[gcnum],x1,y1,x2-x1,y2-y1);
+ 	XFlush(dpy);
+       }
+ }
+ 
+ 
  /************************************************************************/
***************
*** 241,244 ****
        y1=scaley(y1-r);
!       width=scalex(2*r);
!       XDrawArc(dpy,win,gc,x1,y1,width,width,0,23040);
        XFlush(dpy);
--- 450,453 ----
        y1=scaley(y1-r);
!       width=2*r;
!       XDrawArc(dpy,win,gc[gcnum],x1,y1,width,width,0,23040);
        XFlush(dpy);
***************
*** 258,263 ****
  {
!     if(!use_labelplace){
!           XDrawString(dpy, win, gc, x, y, s, strlen(s));
            XFlush(dpy);
!           }
      else {
--- 467,485 ----
  {
!     if(!use_labelplace)
!       {
!       if (VERTICAL)
! 	{
! 	  int i,len;
! 	  len=strlen(s);
! 	  for (i=0;i<len;i++)
! 	  {
! 	    XDrawString(dpy,win,gc[gcnum],x,y+i*(fth+2),s++,1);
! 	  }
! 	}
!       else
! 	{
!           XDrawString(dpy, win, gc[gcnum], x, y, s, strlen(s));
            XFlush(dpy);
!         }
!     }
      else {
***************
*** 265,270 ****
  		case 'u':
!                       x=x-XTextWidth(fontstruct,s,strlen(s))/2;
!                       y=y+fth;
!                       XDrawString(dpy, win, gc, x, y, s, strlen(s));
!                       XFlush(dpy);
                        break;
--- 487,505 ----
  		case 'u':
! 	              if (VERTICAL)
! 			{
! 			  int i,len;
! 			  len=strlen(s);
! 			  y=y-(fth+2)*len/2;
! 			  for (i=0;i<len;i++)
! 			    {
! 			      XDrawString(dpy,win,gc[gcnum],x,y+i*(fth+2),s++,1);
! 			    }
! 			}
! 		      else
! 			{
! 			  x=x-XTextWidth(fontstruct,s,strlen(s))/2;
! 			  y=y+fth;
! 			  XDrawString(dpy, win, gc[gcnum], x, y, s, strlen(s));
! 			  XFlush(dpy);
! 			}
                        break;
***************
*** 273,275 ****
                        x=x-XTextWidth(fontstruct,s,strlen(s))/2;
!                       XDrawString(dpy, win, gc, x, y, s, strlen(s));
                        XFlush(dpy);
--- 508,510 ----
                        x=x-XTextWidth(fontstruct,s,strlen(s))/2;
!                       XDrawString(dpy, win, gc[gcnum], x, y, s, strlen(s));
                        XFlush(dpy);
***************
*** 281,283 ****
  		      y=y-fth/2+fontstruct->max_bounds.ascent;
!                       XDrawString(dpy, win, gc, x, y, s, strlen(s));
                        XFlush(dpy);
--- 516,518 ----
  		      y=y-fth/2+fontstruct->max_bounds.ascent;
!                       XDrawString(dpy, win, gc[gcnum], x, y, s, strlen(s));
                        XFlush(dpy);
***************
*** 288,290 ****
  		      y=y-fth/2+fontstruct->max_bounds.ascent;
!                       XDrawString(dpy, win, gc, x, y, s, strlen(s));
                        XFlush(dpy);
--- 523,525 ----
  		      y=y-fth/2+fontstruct->max_bounds.ascent;
!                       XDrawString(dpy, win, gc[gcnum], x, y, s, strlen(s));
                        XFlush(dpy);
***************
*** 296,298 ****
  /*		      y=y+fth/2;  */
!                       XDrawString(dpy, win, gc, x, y, s, strlen(s));
                        XFlush(dpy);
--- 531,533 ----
  /*		      y=y+fth/2;  */
!                       XDrawString(dpy, win, gc[gcnum], x, y, s, strlen(s));
                        XFlush(dpy);
***************
*** 299,301 ****
  	              break;
! 
  	        default: /* center the label at the point */
--- 534,536 ----
  	              break;
! 	
  	        default: /* center the label at the point */
***************
*** 304,306 ****
  /*		      y=y+fth/2;   */
! 	              XDrawString(dpy, win, gc, x, y, s, strlen(s));
          	      XFlush(dpy);
--- 539,541 ----
  /*		      y=y+fth/2;   */
! 	              XDrawString(dpy, win, gc[gcnum], x, y, s, strlen(s));
          	      XFlush(dpy);
***************
*** 316,318 ****
  {
-      
      switch(s[1]) {
--- 551,552 ----
***************
*** 353,355 ****
  /*			labelrotation  - a homemade function            */
! /*			not implemented  				*/
  /************************************************************************/
--- 587,589 ----
  /*			labelrotation  - a homemade function            */
! /*			by jvts     				        */
  /************************************************************************/
***************
*** 362,363 ****
--- 596,598 ----
      case 'h': /* horizontal */
+         VERTICAL=0;
          break;
***************
*** 365,366 ****
--- 600,602 ----
      case 'v': /* vertical */
+ 	VERTICAL=1;
          break;
***************
*** 371,373 ****
  /*	  		selectcolor  - a homemade function              */
! /*			not implemented  				*/
  /************************************************************************/
--- 607,609 ----
  /*	  		selectcolor  - a homemade function              */
! /*			by jvts          				*/
  /************************************************************************/
***************
*** 374,407 ****
  selectcolor(s)
!     char *s;
  {
!     
!     switch(s[1]) {
!         
!     case '1': /* select pen 1 */
!         break;
!         
!     case '2': /* select pen 2 */
!         break;
!         
!     case '3': /* select pen 3 */
!         break;
!  
!     case '4': /* select pen 4 */
!         break;
!  
!     case '5': /* select pen 5 */
!         break;
! 
!     case '6': /* select pen 6 */
!         break;
!     
!     case '7': /* select pen 7 */
!         break;
!     
!     case '8': /* select pen 8 */
!         break;
! 
!     default: /* select pen 1 */
!         break;
!     }
  }    
--- 610,624 ----
  selectcolor(s)
!     int s;
  {
!   int i;
!   if (COLOR)
!   {
!     if (s>=0 && s<MAX_COLORS)
!       {
! 	for (i=0;i<5;i++)
! 	  {
! 	    XSetForeground(dpy,gc[i],colors[s]);
! 	  }
!       }
!   }
  }    
***************
*** 418,420 ****
  /*			linemod						*/
! /*		    Not implemented					*/
  /************************************************************************/
--- 635,637 ----
  /*			linemod						*/
! /*		        by jvts		        			*/
  /************************************************************************/
***************
*** 425,427 ****
      switch(s[3]) {
!     case 't': /* dotTed */
          break;
--- 642,644 ----
      switch(s[3]) {
!     case 't': gcnum=0;
          break;
***************
*** 428,430 ****
  
!     case 'i': /* solId */
      default:
--- 645,647 ----
  
!     case 'i': /* solId */ gcnum=4;
      default:
***************
*** 432,434 ****
  
!     case 'g': /* lonGdashed */
          break;
--- 649,651 ----
  
!     case 'g': gcnum=3;
          break;
***************
*** 435,437 ****
  
!     case 'r': /* shoRtdashed */
          break;
--- 652,654 ----
  
!     case 'r': gcnum=2;
          break;
***************
*** 438,440 ****
  
!     case 'd': /* dotDashed */
          break;
--- 655,657 ----
  
!     case 'd': gcnum=1;
          break;
***************
*** 449,452 ****
      yorig = yorigi;
!     xscale = ((float) xsh.width) / (x1 - xorig);
!     yscale = ((float) xsh.height) / (y1 - yorig);
  }
--- 666,669 ----
      yorig = yorigi;
!     xscale = ((float) xxwidth) / (x1 - xorig);
!     yscale = ((float) xxheight) / (y1 - yorig);
  }
***************
*** 453,454 ****
--- 670,688 ----
  
+ 
+ /************************************************************************
+  *        homemade:     window by jon v. tetzchner stephenson           *
+  ************************************************************************
+  * sets boundries for drawing (not fully implemented, put there for     *
+  * use with the map program).                                           *
+  ************************************************************************/
+ window(x0,y0,x1,y1)
+      int x0,y0,x1,y1;
+ {
+   loX=x0;
+   loY=y0;
+   hiX=x1;
+   hiY=y1;
+ }
+ 
+ 
  /************************************************************************/
***************
*** 482,484 ****
      y = y * yscale;
!     y = xsh.height - y; /* origin at lower left. */
      return((int) y);
--- 716,718 ----
      y = y * yscale;
!     y = xxheight - y; /* origin at lower left. */
      return((int) y);
***************
*** 485,486 ****
--- 719,762 ----
  }
+ 
+ /***********************************************************************
+  *                       check by jvts                                 *
+  ***********************************************************************
+  * Checks if the point is inside or outside the area defined           *
+  * by the window statement. Sets endpoints in such a way that only the *
+  * part inside the window gets drawn. Returns 1 if the point is        *
+  * outside, 0 otherwise.                                               *
+  ***********************************************************************/
+ 
+ check(x,y)
+      int *x,*y;
+ {
+   int outside=0;
+   if (*x>hiX) {*x=hiX;outside=1;}
+   else if (*x<loX) {*x=loX;outside=1;}
+   if (*y>hiY) {*y=hiY;outside=1;}
+   else if (*y<loY) {*y=loY;outside=1;}
+   return outside;
+ }
+ 
+ /***********************************************************************
+  *                linewid by jvts (customised for mix)                 *
+  ***********************************************************************/
+ 
+ linewid(wi)                                /* set pen width */
+      int wi;
+ {
+   int i;
+   int line_style=LineSolid;
+   int cap_style=CapButt;
+   int join_style=JoinRound;
+   int line_width;
+   line_width=wi;
+   for (i=0;i<5;i++)
+     XSetLineAttributes(dpy,gc[i],line_width,line_style,cap_style,join_style);
+ }
+ 
+ 
+ 
+ 
+ 
  
*** plot1.src/plot.sh	Tue Sep 26 11:25:13 1989
--- plot1.src/plot.sh	Thu Sep 21 21:29:35 1989
***************
*** 7,12 ****
  #
! # There are currently available PD filters for at least HPGL, X11
  # and Postscript. The first two are included in the reldb distribution,
! # as the xplot program is new and the hpglplot program has been extended
! # somewhat to accept a few extended plot(5)-commands.
  #
--- 7,12 ----
  #
! # There are currently available PD filters for at least HPGL, X11, grap
  # and Postscript. The first two are included in the reldb distribution,
! # as the xplot and grap programs are new and the hpglplot program has been
! # extended somewhat to accept a few extended plot(5)-commands.
  #
***************
*** 18,20 ****
  #
! case $1 in
  -T*)	devarg=$1
--- 18,20 ----
  #
! case "$1" in
  -T*)	devarg=$1
***************
*** 26,28 ****
  -Thpgl)		hpglplot $* ;;
! -TX*|-Tx*)	xplot $* ;;
  -Tps*)		psplot $* ;;
--- 26,31 ----
  -Thpgl)		hpglplot $* ;;
! -TX*|-Tx*)      case "$#" in
!                 0)     xplot =1140x860+40+40 ;;
!                 *)    xplot $* ;;
!                 esac ;;
  -Tps*)		psplot $* ;;
*** plot1.src/graplot.c	Tue Sep 26 11:25:14 1989
--- plot1.src/graplot.c	Thu Sep 21 21:26:01 1989
***************
*** 4,9 ****
  
! /* HP-GL plot(5) library				*/
! /* - does NOT do line locking				*/
! /* - aspect ratio is not maintained			*/
! /* Jim Constantine	               	 		*/
  /* Copyright 1985 Sun Microsystems Inc.			*/
--- 4,10 ----
  
! /* GRAPLOT - plot routines which output commands for    */
! /*           grap -- the output of this program can then*/
! /*           be piped through troff                     */
! /* Adapted from HP-GL plot(5) library			*/
! /* originally by Jim Constantine	               	*/
  /* Copyright 1985 Sun Microsystems Inc.			*/
***************
*** 11,16 ****
  /* Prepared for redistribution by gunnar@hafro.is	*/
- /* Notable features: This program is to be used to
-    create troff files.  It can be used to print to a 
-    device without putting the statements through a file.
-    just use scat < file | graplot | lprenta8		*/
  
--- 12,13 ----
***************
*** 25,26 ****
--- 22,25 ----
      printf("\\!! rasterize=300\n");
+     printf("\\!! thickness=2\n");
+     printf(".S 14\n");
      printf(".G1\n");
***************
*** 27,29 ****
  
!     printf("frame invis ht 4 wid 6.2\n");
      printf("X=1\nY=0\n");
--- 26,28 ----
  
!     printf("frame invis ht 6 wid 6\n");
      printf("X=1\nY=0\n");
***************
*** 77,80 ****
--- 76,86 ----
  
+ /* circle(X,Y,r): Draws a circle whose centre is at X,Y.  It's size may
+    be determined by stating the radius, r.
+ */
+ 
  circle(X, Y, r)
+    int X,Y;
+  float r;
  {
+    printf("circle at %d,%d radius %f\n",X,Y,r); 
  }
***************
*** 118,120 ****
  
!  /*   switch(s[1]) {
  
--- 124,128 ----
  
! /* This routine is a NOOP as there does not seem to be a
!    decent way of rotating in grap */
! /*  switch(s[1]) {
  
***************
*** 121,128 ****
      case 'h': 
! 	printf("DI 1,0\n");
  
- 
      case 'v': 
! 	printf("DI 0,1\n");
! 
      } 
--- 129,136 ----
      case 'h': 
! 	printf("\n");
! 	
  
      case 'v': 
! 	printf("\n");
! 	
      } 
***************
*** 179,181 ****
  
!     /* switch(s[1]) {
  
--- 187,190 ----
  
! /* Another NOOP - there are no colors in troff */
! /*  switch(s[1]) {
  
***************
*** 222,223 ****
--- 231,261 ----
      printf (".G2\n");
+ }
+ 
+ 
+ /* box(x1,y1,x2,y2): Draws a box within the given x and y locations. */
+ 
+ box(x1,y1,x2,y2) 
+    int x1,y1,x2,y2;
+ {
+     move(x1,y1);
+     cont(x2,y1);
+     cont(x2,y2);
+     cont(x1,y2);
+     cont(x1,y1);
+ }
+ 
+ /* window(x1,y1,x2,y2): Allows one to specify the range of the x and y axes
+    explicitly.
+ */
+ 
+ window(x1,y1,x2,y2)
+      int x1,y1,x2,y2;
+ {
+    printf("coord x %d, %d y %d, %d\n",x1,x2,y1,y2);
+ }
+ 
+ 
+ 
+ linewid(x1)
+ {
  }
*** /dev/null	Tue Sep 26 10:45:31 1989
--- testgr/picture.sh	Mon Sep 25 22:48:06 1989
***************
*** 0 ****
--- 1,33 ----
+ #!/bin/sh
+ #
+ # This gives an example of how a rather complex figure can be generated.
+ #
+ # Since it's a rather complex figure, the input and options are
+ # quite complex.
+ #
+ # The options below are self-explanatory if the manual page for
+ # scat is at hand.
+ #
+ # The data file, picture.data, is best viewed through the
+ # reldb command sideview.
+ 
+ scat \
+ 	-H "Fishable stock (ages 4-14) for different TACs." \
+ 	-X "Year" \
+ 	-Y "000 tons" \
+ 	-y 0,2000,100 \
+ 	-x 1960,1995,1 \
+ 	-Fx"%.0f" \
+ 	-Fy"%.0f" \
+ 	-L lab1 \
+ 	-L lab2 \
+ 	-L lab3 \
+ 	-L lab4 \
+ 	-T "x 26" \
+ 	-t "x 1" \
+ 	-E < picture.data
+ 
+ #
+ # PS This is a real picture - it is an estimate of the various possible
+ #    trends in the Icelandic cod stock, given various TAC's (total
+ #    allowable catches).
*** /dev/null	Tue Sep 26 10:45:31 1989
--- testgr/picture.data	Mon Sep 25 22:39:00 1989
***************
*** 0 ****
--- 1,33 ----
+ year	opt1	opt11	lab1	opt2	opt22	lab2	opt3	opt33	lab3	opt4	opt44	lab4
+ ----	----	-----	----	----	-----	----	----	-----	----	----	-----	----
+ 1963	1323											
+ 1964	1151											
+ 1965	1177											
+ 1966	1252											
+ 1967	1417											
+ 1968	1682											
+ 1969	1610											
+ 1970	1490											
+ 1971	1228											
+ 1972	987											
+ 1973	832											
+ 1974	932											
+ 1975	891											
+ 1976	950											
+ 1977	1373											
+ 1978	1405											
+ 1979	1513											
+ 1980	1593											
+ 1981	1263											
+ 1982	979											
+ 1983	794											
+ 1984	901											
+ 1985	920											
+ 1986	865											
+ 1987	1048											
+ 1988	1103											
+ 1989	1067											
+ 1990	1007			1007			1007			1007		
+ 1991	1100			1040			980			920		
+ 1992	1180			1060			940			820		
+ 1993.5		1180	200		1060	250		940	300		820	350
-- 
-----------------------------------------------------------------------------
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