[comp.text] GnuTeX patch 5b

dfk@romeo.cs.duke.edu (David F. Kotz) (02/13/89)

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	patch5b
# This archive created: Sun Feb 12 13:21:42 1989
export PATH; PATH=/bin:$PATH
if test -f 'patch5b'
then
	echo shar: will not over-write existing file "'patch5b'"
else
sed 's/^X//' << \SHAR_EOF > 'patch5b'
Xdiff -cr ../gnutex.old/lasergnu ./lasergnu
X*** ../gnutex.old/lasergnu	Mon Dec  5 13:25:57 1988
X--- ./lasergnu	Thu Feb  2 13:33:13 1989
X***************
X*** 9,15 ****
X  set print_banner = on	# Print a banner page unless told otherwise.
X  unset input_file	# the plot input command file
X  set output_file = ()	# the output file (used only by the old laserism)
X! set plot_args = (-p)	# arguments to the plotting program (if any)
X  unset plot_command	# command line arguments may be plot commands
X  if !($?LASER) then
X  	set LASER = "imagen018"
X--- 9,15 ----
X  set print_banner = on	# Print a banner page unless told otherwise.
X  unset input_file	# the plot input command file
X  set output_file = ()	# the output file (used only by the old laserism)
X! set plot_args = ()	# arguments to the plotting program (if any)
X  unset plot_command	# command line arguments may be plot commands
X  if !($?LASER) then
X  	set LASER = "imagen018"
X***************
X*** 16,25 ****
X  endif
X  set printer = (-P$LASER)	# Default printer set by shell variable LASER.
X  
X! # Plot-program-dependent stuff
X  set TMP=/tmp/gnu$$
X! echo "set term tek40xx" > $TMP
X  
X  # Loop through the command-line arguments.
X  
X  top:
X--- 16,30 ----
X  endif
X  set printer = (-P$LASER)	# Default printer set by shell variable LASER.
X  
X! # File for plot commands
X  set TMP=/tmp/gnu$$
X! onintr cleanup
X  
X+ # default is tektronix mode for printer
X+ set setterm="set terminal tek40xx"
X+ set setsize=""
X+ set LANG="-Ltektronix"
X+ 
X  # Loop through the command-line arguments.
X  
X  top:
X***************
X*** 97,102 ****
X--- 102,116 ----
X  			endif
X  			goto top
X  
X+                 # use impress instead of tektronix language
X+                 case -I:
X+ 	   		 set setterm="set term imagen"
X+ #	   		 set setsize="set size 4,3"
X+ 	   		 set setsize="set size 9,6.5"
X+ 	   		 set LANG=""
X+ 			 shift argv
X+ 	   		 goto top
X+ 
X  		case -?*:
X  			echo "I do not recognize option $argv[1]."
X  			echo "usage: lasergnu [-Pprinter] [-b] [-l] [-t title] [-f file] ['plot command']...."
X***************
X*** 121,136 ****
X  
X  set iflags = ($iflags $printer)
X  
X! if ($?plot_command) then
X! 	/usr/local/bin/gnutex $plot_args < $TMP | /usr/local/bin/ipr -Ltektronix \
X! 				$iflags -f gnutex \
X!               			-D"jobheader $print_banner" \
X!               			-D"program lasergnu"
X! else
X! #    cat $TMP - | /usr/local/bin/gnutex $plot_args | /usr/local/bin/ipr -Ltektronix \
X! 	cat $TMP | /usr/local/bin/gnutex $plot_args | /usr/local/bin/ipr -Ltektronix \
X! 				$iflags -f gnutex \
X!               			-D"jobheader $print_banner" \
X!               			-D"program lasergnu" 
X! endif
X  rm $TMP
X--- 135,147 ----
X  
X  set iflags = ($iflags $printer)
X  
X! if ($LANG == -Ltektronix) set plot_args=($plot_args -p)
X! 
X! (echo $setterm; echo $setsize; cat $TMP) \
X! 	   | gnutex $plot_args | /usr/local/bin/ipr $LANG \
X! 	   $iflags -f gnutex \
X! 	   -D"jobheader $print_banner" \
X! 	   -D"program lasergnu"
X! 
X! cleanup:
X  rm $TMP
Xdiff -cr ../gnutex.old/maildfk ./maildfk
X*** ../gnutex.old/maildfk	Fri Feb 10 12:24:38 1989
X--- ./maildfk	Wed Feb  1 18:05:42 1989
X***************
X*** 0 ****
X--- 1,44 ----
X+ #!/bin/sh
X+ # maildfk - send mail to GnuTeX author to register use of program
X+ #
X+ 
X+ # Don't do this more than once
X+ if test ! -r FIRST 
X+ then exit 
X+ fi
X+     
X+ echo ""
X+ echo The author of GnuTeX would like to hear that you have a
X+ echo copy. Unless you object, mail will be sent to him now.
X+ echo This mail will be used only to see how many copies exist.
X+ echo You can also ask to have your name added to the mailing list,
X+ echo to keep you informed of future patches.
X+ echo ""
X+ 
X+ echo -n Do you wish to have your name on the list '[y] '
X+ read yes
X+ if test -s "$yes" -o "$yes" = yes -o "$yes" = YES -o "$yes" = y -o "$yes" = Y
X+ then
X+     echo Please enter your e-mail address from the ARPAnet:
X+     read addr
X+     name="Please put this name on the list: $addr"
X+ else
X+     name="Please do not put me on the list."
X+ fi
X+ 
X+ echo -n Do you wish to send the mail '[y] '
X+ read yes
X+ if test -s "$yes" -o "$yes" = yes -o "$yes" = YES -o "$yes" = y -o "$yes" = Y
X+ then
X+     patch=`cat PATCHLEVEL`
X+     dfk=dfk@cs.duke.edu
X+ 
X+     echo GnuTeX was installed here. $name \
X+     | mail -s "GnuTeX 1.$patch installed" $dfk
X+     echo mail sent to $dfk
X+ else    
X+     echo No mail sent.
X+ fi
X+ 
X+ # Don't run this again
X+ rm FIRST
Xdiff -cr ../gnutex.old/plot.h ./plot.h
X*** ../gnutex.old/plot.h	Fri Feb 10 12:16:14 1989
X--- ./plot.h	Wed Feb  1 17:35:59 1989
X***************
X*** 23,33 ****
X  #define PROGRAM "gnutex"
X  #define PROMPT "gnutex> "
X  #define SHELL "/bin/sh"
X- #ifdef vms
X- #define HELP  ""
X- #else /* vms */
X- #define HELP  "echo Sorry, no help for gnutex"
X- #endif
X  
X  #define TRUE 1
X  #define FALSE 0
X--- 23,28 ----
Xdiff -cr ../gnutex.old/term.c ./term.c
X*** ../gnutex.old/term.c	Fri Feb 10 12:16:17 1989
X--- ./term.c	Thu Feb  2 15:10:54 1989
X***************
X*** 19,24 ****
X--- 19,31 ----
X   */
X  /*  modified 1/14/89 for Microsoft C5.1 by JDM (mcdonald@uxe.cso.uiuc.edu)
X   */
X+ /*
X+  * Modification for direct Imagen output (but retaining many of the
X+  * LaTeX extensions) by Paul E. McKenney, 1989.
X+  * Information Science and Technology Division, SRI International,
X+  * 333 Ravenswood Ave, Menlo Park, CA 94025.
X+  * Mail to mckenney@sri.com.
X+  */
X  
X  #include <stdio.h>
X  #include "plot.h"
X***************
X*** 1103,1108 ****
X--- 1110,1117 ----
X  
X  #define LATEX_TICSIZ 101		/* no more than 100 chars in a tic label */
X  
X+ #define LATEX_FORMAT "$%g$"	/* default format for tic marks */
X+ 
X  static long LATEX_posx;
X  static long LATEX_posy;
X  static BOOLEAN LATEX_inplot;
X***************
X*** 1138,1144 ****
X      LATEX_inplot = FALSE;
X      LATEX_style = NULL;
X      LATEX_type = -1;
X! 
X      fprintf(outfile, "\\setlength{\\unitlength}{%gpt}\n", LATEX_UNIT);
X  }
X  
X--- 1147,1153 ----
X      LATEX_inplot = FALSE;
X      LATEX_style = NULL;
X      LATEX_type = -1;
X!     
X      fprintf(outfile, "\\setlength{\\unitlength}{%gpt}\n", LATEX_UNIT);
X  }
X  
X***************
X*** 1342,1351 ****
X  		   str);
X  }
X  
X- #ifdef MSDOS
X- # define index(s,c) strchr(s,c)
X- #endif MSDOS
X- 
X  LATEX_xyput_text(x, y, str, pos, length, dx, dy)
X  unsigned int x,y;			/* reference point of string */
X  char str[];				/* the text */
X--- 1351,1356 ----
X***************
X*** 1367,1376 ****
X      /* optional arrow */
X      if (length != 0 && pos != NULL && *pos != NULL) {
X  	   if (dx == 0 && dy == 0) { /* determine slope from pos */
X!  		  if (index(pos, 'l') != NULL) dx = -1;
X!  		  if (index(pos, 'r') != NULL) dx = 1;
X!  		  if (index(pos, 't') != NULL) dy = 1;
X!  		  if (index(pos, 'b') != NULL) dy = -1;
X  	   }
X  	   fprintf(outfile, "\\vector(%d,%d){%u}\n", dx, dy, length);
X      }
X--- 1372,1381 ----
X      /* optional arrow */
X      if (length != 0 && pos != NULL && *pos != NULL) {
X  	   if (dx == 0 && dy == 0) { /* determine slope from pos */
X!  		  if (INDEX(pos, 'l') != NULL) dx = -1;
X!  		  if (INDEX(pos, 'r') != NULL) dx = 1;
X!  		  if (INDEX(pos, 't') != NULL) dy = 1;
X!  		  if (INDEX(pos, 'b') != NULL) dy = -1;
X  	   }
X  	   fprintf(outfile, "\\vector(%d,%d){%u}\n", dx, dy, length);
X      }
X***************
X*** 1483,1488 ****
X--- 1488,1495 ----
X  {
X      char mark[LATEX_TICSIZ];
X  
X+     if (*format == '\0')
X+ 	 format = LATEX_FORMAT;
X      sprintf(mark, format, number);
X      fprintf(outfile, "\\put(%ld,%ld){\\makebox(0,0)[t]{%s}}\n",
X  		  (long)x, (long)(-LATEX_HTIC), mark);
X***************
X*** 1495,1500 ****
X--- 1502,1509 ----
X  {
X      char mark[LATEX_TICSIZ];
X  
X+     if (*format == '\0')
X+ 	 format = LATEX_FORMAT;
X      sprintf(mark, format, number);
X      fprintf(outfile, "\\put(%ld,%ld){\\makebox(0,0)[r]{%s}}\n",
X  		  (long)(-LATEX_VTIC), (long)y, mark);
X***************
X*** 1512,1518 ****
X--- 1521,2066 ----
X  
X  #endif /* LATEX */
X  
X+ #ifdef IMAGEN
X  
X+ #include "imPcodes.h"
X+ 
X+ #define IMAGEN_PTS_PER_INCH (300)
X+ #define IMAGEN_UNIT (.01)		/* points */
X+ 
X+ #define IMAGEN_HTIC 20
X+ #define IMAGEN_VTIC 20
X+ #define IMAGEN_HCHAR (4./IMAGEN_UNIT)
X+ #define IMAGEN_VCHAR (12./IMAGEN_UNIT)
X+ 
X+ #define IMAGEN_TICSIZ 101	/* no more than 100 chars in a tic label */
X+ 
X+ #define IMAGEN_FORMAT "%g"	/* default tick mark format */
X+ 
X+ static int IMAGEN_orgx;		/* absolute-pixel-ORIgin of graph.	*/
X+ static int IMAGEN_orgy;
X+ static int IMAGEN_posx;		/* current drawing position (lines).	*/
X+ static int IMAGEN_posy;
X+ static int IMAGEN_inplot;
X+ static int IMAGEN_xmax;		/* width of graph in pixels.		*/
X+ static int IMAGEN_ymax;		/* height of graph in pixels.		*/
X+ static int IMAGEN_hchar;	/* Height of CHAR in current font.	*/
X+ static int IMAGEN_wchar;	/* Width of CHAR in current font.	*/
X+ static int IMAGEN_blofs;	/* BaseLine OFfSet from bounding box.	*/
X+ static int IMAGEN_rotated = -1;	/* text printing is ROTATED (y-axis label) */
X+ 
X+ static int IMAGEN_titlefsz = 15;
X+ static int IMAGEN_axisfsz = 12;
X+ static int IMAGEN_labelfsz = 10;
X+ static int IMAGEN_tickfsz = 9;
X+ static int IMAGEN_cursize = -1; /* pointer to one of above.		*/
X+ 
X+ static IMAGEN_endplot();
X+ extern char *malloc();
X+ 
X+ #ifndef sign
X+ #define sign(x) ((x) >= 0 ? 1 : -1)
X+ #define abs(x) ((x) >= 0 ? (x) : -(x))
X+ #define max(a,b) ((a) > (b) ? (a) : (b))
X+ #define min(a,b) ((a) < (b) ? (a) : (b))
X+ #endif /* sign */
X+ 
X+ /* Default line-drawing character */
X+ #define IMAGEN_DOT_SPACING (2.0/IMAGEN_UNIT)
X+ 
X+ static int IMAGEN_type;		/* negative types use real lines */
X+ static struct st_entry *IMAGEN_style = NULL; /* NULL => use default styles */
X+ static IMAGEN_seq_pos;		/* position in sequence */
X+ 
X+ IMAGEN_init()
X+ {
X+     IMAGEN_posx = IMAGEN_posy = 0;
X+     IMAGEN_inplot = FALSE;
X+     IMAGEN_style = NULL;
X+     IMAGEN_type = -1;
X+ 
X+ 	IMAGEN_rotated = -1;
X+ 
X+ 	fputs("@document(language impress)", outfile);
X+ 	putc(imP_SET_HV_SYSTEM, outfile);
X+ 	  putc((3<<3)|5, outfile);
X+ 	putc(imP_SET_ADV_DIRS, outfile); /* up and to the right, landscape. */
X+ 	  putc(7, outfile);
X+ 	IMAGEN_createfamily("cour06",  6);
X+ 	IMAGEN_createfamily("cour07",  7);
X+ 	IMAGEN_createfamily("cour08",  8);
X+ 	IMAGEN_createfamily("cour09",  9);
X+ 	IMAGEN_createfamily("cour10", 10);
X+ 	IMAGEN_createfamily("cour12", 12);
X+ 	IMAGEN_createfamily("cour14", 14);
X+ 	IMAGEN_createfamily("cour15", 15);
X+ 	IMAGEN_setfont(IMAGEN_titlefsz);
X+ 	IMAGEN_unrotate();
X+ 	putc(imP_SET_ABS_H, outfile);
X+ 	  IMAGEN_putwd(0);
X+ 	putc(imP_SET_ABS_V, outfile);
X+ 	  IMAGEN_putwd(0);
X+ }
X+ IMAGEN_putwd(w)
X+ {
X+ 	putc(w>>8, outfile);
X+ 	putc(w, outfile);
X+ }
X+ IMAGEN_createfamily(c, sz)
X+ 
X+ 	char		*c;
X+ 	int		sz;
X+ 
X+ 	{
X+ 	putc(imP_CREATE_FAMILY_TABLE, outfile);
X+ 	  putc(sz, outfile);
X+ 	  putc(1, outfile);
X+ 	  putc(0, outfile);
X+ 	  fputs(c, outfile);
X+ 	  putc(0, outfile);
X+ 	}
X+ IMAGEN_setfont(sz) int sz;
X+ {
X+ 	if (IMAGEN_cursize == sz)
X+ 		return;
X+ 	IMAGEN_hchar = sz * 5;
X+ 	IMAGEN_wchar = IMAGEN_hchar / 2;
X+ 	IMAGEN_blofs = IMAGEN_hchar / 3;
X+ 	putc(imP_SET_FAMILY, outfile);
X+ 	  putc(sz, outfile);
X+ 	putc(imP_SET_SP, outfile);
X+ 	  IMAGEN_putwd(IMAGEN_wchar);
X+ 	putc(imP_SET_IL, outfile);
X+ 	  IMAGEN_putwd(IMAGEN_hchar);
X+ 	IMAGEN_cursize = sz;
X+ }
X+ 
X+ 
X+ IMAGEN_graphics(xmax, ymax, t, xlabel, ylabel, yskip, title)
X+ 	float xmax, ymax;		/* in inches */
X+ 	struct termentry *t;
X+ 	char *xlabel;			/* x-axis label */
X+ 	char *ylabel;			/* y-axis label */
X+ 	int yskip;			/* y-axis label skip factor */
X+ 	char *title;			/* plot title */
X+ {
X+     int	h, w;
X+     char *s;
X+ 
X+     if (IMAGEN_inplot) 
X+ 	 IMAGEN_newpage();
X+     IMAGEN_inplot = TRUE;
X+ 
X+     /* Convert inches to points to coordinates */
X+     IMAGEN_xmax = (int) (xmax * IMAGEN_PTS_PER_INCH);
X+     IMAGEN_ymax = (int) (ymax * IMAGEN_PTS_PER_INCH);
X+     IMAGEN_orgx = ((int) (11.0 - xmax)) * IMAGEN_PTS_PER_INCH / 2;
X+     IMAGEN_orgy = ((int) (8.5 - ymax)) * IMAGEN_PTS_PER_INCH / 2;
X+ 
X+     /* store these away for the use of plotting routines */
X+     t->xmax = IMAGEN_xmax;
X+     t->ymax = IMAGEN_ymax;
X+ 
X+     /* Construct the image from the labels and the plot, as a table */
X+ 
X+     if (title && *title != '\0')
X+ 	 {
X+ 	 IMAGEN_unrotate();
X+ 	 IMAGEN_setfont(IMAGEN_titlefsz);
X+ 	 IMAGEN_xy_text(IMAGEN_xmax / 2,
X+ 			IMAGEN_ymax + 2 * IMAGEN_hchar,
X+ 			title, "b");
X+ 	 }
X+     if (ylabel && *ylabel != '\0') {
X+ 	   IMAGEN_rotate();
X+ 	   IMAGEN_setfont(IMAGEN_axisfsz);
X+ 	   IMAGEN_xy_text((-yskip - 3) * IMAGEN_wchar,
X+ 			  IMAGEN_ymax / 2,
X+ 			  ylabel, "r");
X+     }
X+     if (xlabel && *xlabel != '\0') {
X+ 	    IMAGEN_unrotate();
X+ 	    IMAGEN_setfont(IMAGEN_axisfsz);
X+ 	    IMAGEN_xy_text(IMAGEN_xmax / 2,
X+ 			   -2 * IMAGEN_hchar,
X+ 			   xlabel, "t");
X+     }
X+ 
X+     IMAGEN_move(0, 0);
X+ 
X+ }
X+ 
X+ 
X+ static 
X+ IMAGEN_newpage()
X+ {
X+     putc(imP_ENDPAGE, outfile);
X+ }
X+ 
X+ static 
X+ IMAGEN_endplot()
X+ {
X+     putc(imP_EOF, outfile);
X+ }
X+ 
X+ 
X+ IMAGEN_text()
X+ {
X+ }
X+ 
X+ 
X+ IMAGEN_linetype(linetype)
X+ int linetype;
X+ {
X+ 	static int lastlinetype = -1;
X+ 
X+ 	IMAGEN_type = linetype;
X+ 	if (linetype < 0)
X+ 		linetype = -linetype;
X+ 	else
X+ 		linetype = 1;
X+ 	if (lastlinetype == linetype)
X+ 		return;
X+ 	lastlinetype = linetype;
X+ 	putc(imP_SET_PEN, outfile);
X+ 	  putc(linetype, outfile);
X+ 	IMAGEN_style = NULL;
X+ }
X+ 
X+ 
X+ IMAGEN_plotstyle(stp)
X+ struct st_entry *stp;
X+ {
X+     IMAGEN_style = stp;
X+     IMAGEN_seq_pos = 0;
X+ }
X+ 
X+ 
X+ IMAGEN_move(x,y)
X+ unsigned int x,y;
X+ {
X+     IMAGEN_posx = x;
X+     IMAGEN_posy = y;
X+ }
X+ 
X+ IMAGEN_vector(ux,uy)
X+ unsigned int ux,uy;
X+ {
X+     int x=ux, y=uy;
X+ 
X+     /* Create path.							*/
X+ 
X+     putc(imP_CREATE_PATH, outfile);
X+       IMAGEN_putwd(2);
X+       IMAGEN_putwd(IMAGEN_posx + IMAGEN_orgx);
X+       IMAGEN_putwd(IMAGEN_posy + IMAGEN_orgy);
X+       IMAGEN_putwd(ux + IMAGEN_orgx);
X+       IMAGEN_putwd(uy + IMAGEN_orgy);
X+ 
X+     /* Draw path with black pen.					*/
X+ 
X+     putc(imP_DRAW_PATH, outfile);
X+       putc(15, outfile);
X+ 
X+     /* Set current position to end of line.				*/
X+ 
X+     IMAGEN_move(ux, uy);
X+ }
X+ 
X+ IMAGEN_setpos(ux, uy)
X+ 
X+ int ux,uy;
X+ {
X+     /* Set x and y position, also set beginning-of-line.		*/
X+ 
X+     putc(imP_SET_ABS_H, outfile);
X+       IMAGEN_putwd(ux + IMAGEN_orgx);
X+     putc(imP_SET_ABS_V, outfile);
X+       IMAGEN_putwd(uy + IMAGEN_orgy);
X+     putc(imP_SET_BOL, outfile);
X+       if (IMAGEN_rotated)
X+ 	      IMAGEN_putwd(uy + IMAGEN_orgx);
X+       else
X+ 	      IMAGEN_putwd(ux + IMAGEN_orgx);
X+ }
X+ 
X+ IMAGEN_rotate()
X+ 
X+ 	{
X+ 	if (IMAGEN_rotated == 1)
X+ 		return;
X+ 
X+ 	/* Cause text to run from bottom to top.			*/
X+ 
X+ 	putc(imP_SET_ADV_DIRS, outfile);
X+ 	  putc(7, outfile);
X+ 	IMAGEN_rotated = 1;
X+ 	}
X+ 
X+ IMAGEN_unrotate()
X+ 
X+ 	{
X+ 	if (IMAGEN_rotated == 0)
X+ 		return;
X+ 
X+ 	/* Cause text to run from left to right.			*/
X+ 
X+ 	putc(imP_SET_ADV_DIRS, outfile);
X+ 	  putc(0, outfile);
X+ 	IMAGEN_rotated = 0;
X+ 	}
X+ 
X+ char *
X+ IMAGEN_cvts(str, width, height)
X+ 
X+ 	char		*str;
X+ 	int		*width;
X+ 	int		*height;
X+ 
X+ 	{
X+ 	char		*cp1;
X+ 	char		*cp2;
X+ 	static char	*buf = NULL;
X+ 	int		h;
X+ 	int		maxw;
X+ 	int		w;
X+ 
X+ 	/* Free up old buffer, if there is one, get a new one.  Since	*/
X+ 	/* all transformations shorten the string, get a buffer that is	*/
X+ 	/* the same size as the input string.				*/
X+ 
X+ 	if (buf != NULL)
X+ 		(void)free(buf);
X+ 	buf = (char *)malloc(strlen(str));
X+ 
X+ 	/* Do the transformations.					*/
X+ 
X+ 	cp1 = str;
X+ 	cp2 = buf;
X+ 	h = 1;
X+ 	maxw = 0;
X+ 	w = 0;
X+ 	while (*cp1 != NULL)
X+ 		{
X+ 		switch (*cp1)
X+ 		{
X+ 		case ' ' :
X+ 
X+ 			/* Space character.				*/
X+ 
X+ 			*cp2++ = imP_SP;
X+ 			w++;
X+ 			break;
X+ 
X+ 		case  '\\' :
X+ 
X+ 			/* Escape sequence.				*/
X+ 
X+ 			if (*++cp1 == '\\')
X+ 				{
X+ 
X+ 				/* Begin new line.			*/
X+ 
X+ 				h++;
X+ 				if (w > maxw)
X+ 					maxw = w;
X+ 				w = 0;
X+ 				*cp2++ = imP_CRLF;
X+ 				break;
X+ 				}
X+ 			
X+ 			/* Fall through to just copy next char out.	*/
X+ 
X+ 		default :
X+ 			*cp2++ = *cp1;
X+ 			w++;
X+ 			break;
X+ 		}
X+ 		cp1++;
X+ 		}
X+ 
X+ 	*cp2 = '\0';
X+ 	if (w > maxw)
X+ 		maxw = w;
X+ 
X+ 	if (height != NULL)
X+ 		*height = IMAGEN_rotated ?
X+ 			  IMAGEN_wchar * maxw :
X+ 			  IMAGEN_hchar * h;
X+ 	if (width != NULL)
X+ 		*width = IMAGEN_rotated ?
X+ 			 IMAGEN_hchar * h :
X+ 			 IMAGEN_wchar * maxw;
X+ 	return (buf);
X+ 	}
X+ 
X+ IMAGEN_puts(str)
X+ 
X+ 	char		*str;
X+ 
X+ 	{
X+ 	str = IMAGEN_cvts(str, NULL, NULL);
X+ 	fputs(str, outfile);
X+ 	}
X+ 
X+ IMAGEN_lrput_text(row,str)
X+ unsigned int row;
X+ char str[];
X+ {
X+ 	char		*imstr;
X+ 	int		width;
X+ 
X+ 	imstr = IMAGEN_cvts(str, &width, NULL);
X+ 	IMAGEN_setpos((int)(IMAGEN_xmax - IMAGEN_HTIC - width),
X+ 		      (int)(IMAGEN_VTIC + 3 + IMAGEN_hchar*row));
X+ 	fputs(imstr, outfile);
X+ }
X+ 
X+ 
X+ IMAGEN_ulput_text(row,str)
X+ unsigned int row;
X+ char str[];
X+ {
X+ 	IMAGEN_setpos((int)(IMAGEN_HTIC+3),
X+ 		      (int)(IMAGEN_ymax -
X+ 			    IMAGEN_VTIC - IMAGEN_hchar*(row+1)));
X+ 	IMAGEN_puts(str);
X+ }
X+ 
X+ /* Invoked from gnutex, puts out optional arrow and forces font.	*/
X+ 
X+ IMAGEN_xyput_text(ref_x, ref_y, str, pos, length, dx, dy)
X+ int ref_x,ref_y;		/* reference point of string */
X+ char str[];				/* the text */
X+ char pos[];				/* for optional [pos] to \makebox */
X+ unsigned int length;		/* optional arrow length */
X+ int dx, dy;				/* optional slopes for arrow */
X+ 
X+ {
X+ 	IMAGEN_unrotate();
X+ 	IMAGEN_setfont(IMAGEN_labelfsz);
X+ 	IMAGEN_xy_text(ref_x, ref_y, str, pos);
X+ 	if (length != 0 && pos != NULL && *pos != '\0')
X+ 		{
X+ 		if (dx == 0 && dy == 0)
X+ 			{
X+ 			if (index(pos, 'l'))
X+ 				dx = -1;
X+ 			if (index(pos, 'r'))
X+ 				dx = 1;
X+ 			if (index(pos, 't'))
X+ 				dy = 1;
X+ 			if (index(pos, 'b'))
X+ 				dy = -1;
X+ 			}
X+ 		IMAGEN_move(ref_x, ref_y);
X+ 		IMAGEN_vector(ref_x + dx * length, ref_y + dy * length);
X+ 		}
X+ }
X+ 
X+ /* Called internally, just dumps string.				*/
X+ 
X+ IMAGEN_xy_text(ref_x, ref_y, str, pos)
X+ 
X+ int ref_x,ref_y;		/* reference point of string */
X+ char str[];				/* the text */
X+ char pos[];				/* for optional [pos] to \makebox */
X+ {
X+     char		*cvstr;
X+     int			dy = 0;
X+     int			height;
X+     int			width;
X+     int			x = ref_x;
X+     int			y = ref_y;
X+ 
X+     if (!IMAGEN_inplot)
X+ 	 return;
X+ 
X+     cvstr = IMAGEN_cvts(str, &width, &height);
X+     x -= width / 2;
X+     dy += height / 2;
X+     if (pos != NULL)
X+ 	{
X+ 	if (index(pos, 'l'))
X+ 		x += width / 2;
X+ 	if (index(pos, 'r'))
X+ 		x -= width / 2;
X+ 	if (index(pos, 't'))
X+ 		dy -= height / 2;
X+ 	if (index(pos, 'b'))
X+ 		dy += height / 2;
X+ 	}
X+     if (IMAGEN_rotated)
X+ 	{
X+ 	x += IMAGEN_hchar;
X+ 	y -= dy;
X+ 	}
X+     else
X+ 	y += dy - IMAGEN_hchar;
X+     IMAGEN_setpos(x, y + IMAGEN_blofs);
X+     fputs(cvstr, outfile);
X+ }
X+ 
X+ IMAGEN_key(x, y, style, names)
X+ 	unsigned int x,y;
X+ 	int style[];
X+ 	char *names[];
X+ {
X+     /* @@@ maybe someday . . . */
X+ }
X+ 
X+ static 
X+ char *					/* pointer to static storage */
X+ IMAGEN_key_point(style, pcount)
X+ 	int style;			/* style number to describe */
X+ 	int *pcount;			/* running counter of point-like styles */
X+ {
X+     /* @@@ Maybe someday . . . */
X+ }
X+ 
X+ IMAGEN_xtick_text(x, number, format)
X+ unsigned int x;			/* place to put on axis */
X+ double number;				/* the number to be written at that tick */
X+ char *format;
X+ {
X+     char mark[IMAGEN_TICSIZ];
X+ 
X+     if (*format == '\0')
X+ 	 format = IMAGEN_FORMAT;
X+     IMAGEN_unrotate();
X+     IMAGEN_setfont(IMAGEN_tickfsz);
X+     sprintf(mark, format, number);
X+     IMAGEN_xy_text(x, (int)(-IMAGEN_HTIC), mark, "t");
X+ }
X+ 
X+ IMAGEN_ytick_text(y, number, format)
X+ int y;			/* place to put on axis */
X+ double number;				/* the number to be written at that tick */
X+ char *format;
X+ {
X+     char mark[IMAGEN_TICSIZ];
X+ 
X+     if (*format == '\0')
X+ 	 format = IMAGEN_FORMAT;
X+     IMAGEN_unrotate();
X+     IMAGEN_setfont(IMAGEN_tickfsz);
X+     sprintf(mark, format, number);
X+     IMAGEN_xy_text((int)(-IMAGEN_VTIC), y,  mark, "r");
X+ }
X+ 
X+ 
X+ IMAGEN_reset()
X+ {
X+     if (IMAGEN_inplot) {
X+ 	   IMAGEN_endplot();
X+ 	   IMAGEN_inplot = FALSE;
X+     }
X+     IMAGEN_posx = IMAGEN_posy = 0;
X+ }
X+ 
X+ #endif /* IMAGEN */
X+ 
X+ 
X  UNKNOWN_null()
X  {
X  	int_error("you must set your terminal type before plotting!",NO_CARET);
X***************
X*** 1620,1625 ****
X--- 2168,2184 ----
X  	    LATEX_vector,
X  	    LATEX_linetype, LATEX_lrput_text, LATEX_ulput_text, LATEX_point,
X  	    LATEX_xyput_text, LATEX_xtick_text, LATEX_ytick_text, LATEX_plotstyle}
X+ #endif
X+ 
X+ #ifdef IMAGEN
X+ 	/* xmax and ymax are filled in by IMAGEN_graphics */
X+ 	/* We supply the absolute maximum here */
X+ 	,{"imagen", 11*IMAGEN_PTS_PER_INCH, 8.5*IMAGEN_PTS_PER_INCH,
X+ 	    IMAGEN_VCHAR, IMAGEN_HCHAR, IMAGEN_VTIC, IMAGEN_HTIC,
X+ 	    IMAGEN_init, IMAGEN_reset, IMAGEN_text, IMAGEN_graphics, IMAGEN_move, 
X+ 	    IMAGEN_vector,
X+ 	    IMAGEN_linetype, IMAGEN_lrput_text, IMAGEN_ulput_text, do_point,
X+ 	    IMAGEN_xyput_text, IMAGEN_xtick_text, IMAGEN_ytick_text, IMAGEN_plotstyle}
X  #endif
X  	};
X  
Xdiff -cr ../gnutex.old/util.c ./util.c
X*** ../gnutex.old/util.c	Mon Dec  5 13:25:59 1988
X--- ./util.c	Wed Feb  1 17:54:57 1989
X***************
X*** 326,331 ****
X--- 326,345 ----
X  	return(a);
X  }
X  
X+ /* Lower-case the given string (DFK) */
X+ /* Done in place. */
X+ void
X+ lower_case(s)
X+      char *s;
X+ {
X+   register char *p = s;
X+ 
X+   while (*p != '\0') {
X+     if (*p >= 'A' && *p <= 'Z')
X+       *p = *p - 'A' + 'a';
X+     p++;
X+   }
X+ }
X  
X  
X  os_error(str,t_num)
Xdiff -cr ../gnutex.old/version.c ./version.c
X*** ../gnutex.old/version.c	Mon Dec  5 13:25:59 1988
X--- ./version.c	Thu Feb  2 15:12:17 1989
X***************
X*** 1,2 ****
X! char version[] = "1.0.3 + latex mods 1.3";
X! char date[] = "Mon Dec  5 13:22:46 EST 1988";
X--- 1,2 ----
X! char version[] = "1.0.3 + latex mods 1.5";
X! char date[] = "Thu Feb  2 15:12:10 EST 1989";
XOnly in ../gnutex.old: vmshelp.csh
Xdiff -cr ../gnutex.old/Help/Makefile ./Help/Makefile
X*** ../gnutex.old/Help/Makefile	Fri Feb 10 12:26:05 1989
X--- ./Help/Makefile	Fri Feb 10 12:10:17 1989
X***************
X*** 0 ****
X--- 1,7 ----
X+ CFLAGS	= -g
X+ 
X+ htest:	help.o htest.o
X+ 	cc $(CFLAGS) htest.o help.o -o htest
X+ 
X+ clean:
X+ 	rm -f *~ *.o core
Xdiff -cr ../gnutex.old/Help/README ./Help/README
X*** ../gnutex.old/Help/README	Fri Feb 10 12:26:05 1989
X--- ./Help/README	Wed Feb  1 13:50:49 1989
X***************
X*** 0 ****
X--- 1,51 ----
X+ These are the files for the customizable help facility.
X+ 
X+ Contents:
X+ 	help.3		The man page for help().
X+ 	help.h		Include file showing return status values.
X+ 	help.c		The source for help() itself.
X+ 
X+ 	Makefile	Makes `htest', the help testing program.
X+ 	htest.c		Source for htest.
X+ 	helpfile	Sample help file.
X+ 	alt-helpfile	Other help file; contains help info for "alternate" key
X+ 
X+ Suggestion:  format the man page (nroff -man help.3 | lp) and read it,
X+ then read the comments in the prologue to the code.  Help-file writers
X+ might want to look at the helpfile, and run htest to see how it looks.
X+ Run the help test by typing "make", then "htest".
X+ 
X+ The basic idea for this routine is to provide a help interface like
X+ Edit/1000:  you ask for help, it prints out the help text for that
X+ subject only.  You can set up the help file so that several synonyms
X+ will cause the same help text to appear.  You can provide context-
X+ sensitive help by setting up the calling routine to use a different
X+ file depending on the context or desired verbosity level.
X+ 
X+ Advantages to using this help code over using `more' on a help file:
X+ 
X+ 1.  No "skipping" messages or unsightly "(73%)" prompts from `more'.
X+ You get the help text on only the subject you asked for, instead of
X+ being left in the file and being forced to type "q".
X+ 
X+ 2.  Help keywords (the subject that the user asks about) can be made
X+ case-insensitive if you provide keywords in both cases in your help
X+ file.  `more' insists on exact matches.
X+ 
X+ 3.  Various speed hacks.  Faster than vfork()+exec(), much faster than
X+ system().  Doesn't re-open your help file if the user asks for help
X+ more than once on the same file.
X+ 
X+ Disadvantage of this help code over `more':
X+ 
X+ The code as written doesn't scroll, it just cats the text to your
X+ screen.  This means that you should try to fit everything on 23 lines
X+ or less.  (This is not considered a real problem, especially because
X+ you can end an entry with "Get help on <whatever detail you mentioned>
X+ for more information", and because a screenful is an awful lot of
X+ material for a user to digest.)
X+ 
X+ Future directions:
X+ 
X+ The routine could be sped up even more by replacing the stdio calls
X+ with open/read/write/close, but it runs quite swiftly even now.
Xdiff -cr ../gnutex.old/Help/alt-helpfile ./Help/alt-helpfile
X*** ../gnutex.old/Help/alt-helpfile	Fri Feb 10 12:26:05 1989
X--- ./Help/alt-helpfile	Wed Feb  1 13:50:51 1989
X***************
X*** 0 ****
X--- 1,7 ----
X+ ?alternate
X+ This is the alternate help file right here.  It doesn't know about much
X+ for the purposes of the test, but could be quite extensive.
X+ 
X+ It could also contain auxiliary information (something more in-depth, or
X+ just an interesting side point, or a tutorial).  If the user never asks to
X+ see its information, it's never opened and doesn't incur any costs.
Xdiff -cr ../gnutex.old/Help/help.3 ./Help/help.3
X*** ../gnutex.old/Help/help.3	Fri Feb 10 12:26:05 1989
X--- ./Help/help.3	Wed Feb  1 13:50:54 1989
X***************
X*** 0 ****
X--- 1,87 ----
X+ .TH HELP 3:LOCAL "January 1986"
X+ .SH NAME
X+ help \- provide help message about a topic
X+ .SH SYNOPSIS
X+ .nf
X+ .ft B
X+ #include "help.h"
X+ 
X+ help(keyword, helpfile)
X+ char *keyword;
X+ char *helpfile;
X+ .ft R
X+ .fi
X+ .SH DESCRIPTION
X+ The
X+ .I help
X+ call looks up the
X+ .I keyword
X+ in the specified
X+ .IR helpfile .
X+ If an entry matching the desired
X+ .I keyword
X+ is found, its corresponding description is sent to the standard output.
X+ Thus, you can customize a program's help information merely by editing the
X+ .IR helpfile
X+ instead of re-compiling the program sources.
X+ If
X+ .I helpfile
X+ doesn't change from one call to the next,
X+ .I help
X+ avoids re-opening the file.
X+ .PP
X+ The
X+ .I keyword
X+ should have a trailing newline, and must end with a NULL character.
X+ The format of the
X+ .I helpfile
X+ is (with question marks in column 1 on each line):
X+ .PP
X+ .nf
X+ ?keyword
X+ This line is printed when help on \fBkeyword\fP is requested.
X+ ?Topic
X+ ?topic
X+ These lines are printed when help on \fBTopic\fP or \fBtopic\fP is
X+ requested.  No keywords are casefolded before processing, and each
X+ help message may have more than one key that matches it.
X+ ?
X+ ??
X+ These lines are printed out when a null keyword (really just a newline)
X+ or a keyword of \fB?\fP is requested.  Typically, this help message is
X+ a command summary or overview.
X+ .fi
X+ .SH EXAMPLE
X+ .nf
X+ 	/* `buf' contains the user's reply */
X+ 	switch (help(buf, "/usr/local/lib/helpfile")) {
X+ 	case H_FOUND:
X+ 		/* already printed the help info; do nothing */
X+ 		break;
X+ 	case H_NOTFOUND:
X+ 		printf("Sorry, no help for %s", buf);
X+ 		break;
X+ 	case H_ERROR:
X+ 		perror("/usr/local/lib/helpfile");
X+ 		break;
X+ 	default:
X+ 		cannot_happen("help");
X+ 		break;
X+ 	}
X+ .fi
X+ .SH DIAGNOSTICS
X+ A return of H_FOUND, defined in ``help.h'', means help was given:
X+ the keyword was found and a message was printed.
X+ A return of H_NOTFOUND means no help was given because the
X+ .I keyword
X+ wasn't found in the
X+ .I helpfile.
X+ A return of H_ERROR means there was an error opening the
X+ .IR helpfile .
X+ H_ERROR returns can be handled by the caller:
X+ write a message to standard error, typically using
X+ .IR perror (),
X+ or call
X+ .IR help ()
X+ using a different pathname in
X+ .IR helpfile .
Xdiff -cr ../gnutex.old/Help/help.c ./Help/help.c
X*** ../gnutex.old/Help/help.c	Fri Feb 10 12:26:05 1989
X--- ./Help/help.c	Wed Feb  1 13:50:56 1989
X***************
X*** 0 ****
X--- 1,134 ----
X+ #include <stdio.h>
X+ #include <errno.h>
X+ #include <string.h>
X+ #define	SAME	0	/* for strcmp() */
X+ 
X+ #include "help.h"	/* values passed back */
X+ 
X+ /* help -- help subsystem that understands defined keywords
X+ **
X+ ** Looks for the desired keyword in the help file at runtime, so you
X+ ** can give extra help or supply local customizations by merely editing
X+ ** the help file.
X+ **
X+ ** The original (single-file) idea and algorithm is by John D. Johnson,
X+ ** Hewlett-Packard Company.  Thanx and a tip of the Hatlo hat!
X+ **
X+ ** The help file looks like (the question marks are really in column 1):
X+ ** 
X+ ** 	?topic
X+ ** 	This line is printed when the user wants help on "topic".
X+ ** 	?keyword
X+ ** 	?Keyword
X+ ** 	?KEYWORD
X+ ** 	These lines will be printed on the screen if the user wanted
X+ ** 	help on "keyword", "Keyword", or "KEYWORD".  No casefolding is
X+ **	done on the keywords.
X+ ** 	?subject
X+ ** 	?alias
X+ ** 	This line is printed for help on "subject" and "alias".
X+ ** 	?
X+ **	??
X+ ** 	Since there is a null keyword for this line, this section
X+ ** 	is printed when the user wants general help (when a help
X+ ** 	keyword isn't given).  A command summary is usually here.
X+ **	Notice that the null keyword is equivalent to a "?" keyword
X+ **	here, because of the '?' and '??' topic lines above.
X+ ** 	?last-subject
X+ ** 	Note that help sections are terminated by the start of the next
X+ ** 	'?' entry or by EOF.  So you can't have a leading '?' on a line
X+ ** 	of any help section.  You can re-define the magic character to
X+ **	recognize in column 1, though, if '?' is too useful.  (Try ^A.)
X+ */
X+ 
X+ #define	KEYFLAG	'?'	/* leading char in help file topic lines */
X+ 
X+ /*
X+ ** Calling sequence:
X+ **	int result;		# 0 == success
X+ **	char *keyword;		# topic to give help on
X+ **	char *pathname;		# path of help file
X+ **	result = help(keyword, pathname);
X+ ** Sample:
X+ **	cmd = "search\n";
X+ **	helpfile = "/usr/local/lib/program/program.help";
X+ **	if (help(cmd, helpfile) != H_FOUND)
X+ **		printf("Sorry, no help for %s", cmd);
X+ **
X+ **
X+ ** Speed this up by replacing the stdio calls with open/close/read/write.
X+ */
X+ #ifdef	WDLEN
X+ #  define	PATHSIZE	WDLEN
X+ #else
X+ #  define	PATHSIZE	BUFSIZ
X+ #endif
X+ 
X+ help(keyword, path)	/* print a help message */
X+ 	char *keyword;	/* on this topic */
X+ 	char *path;	/* from this file */
X+ {
X+ 	static char oldpath[PATHSIZE] = '\0';	/* previous help file */
X+ 	char *oldpathp = oldpath;	/* pointer to same */
X+ 
X+ 	static FILE *helpfp = NULL;
X+ 	FILE *fopen();
X+ 
X+ 	char buf[BUFSIZ];	/* line from help file */
X+ 	char *bufp = buf;	/* pointer to same */
X+ 	char *bufkeyp = bufp + 1;	/* start of key in help line */
X+ 
X+ /*
X+ ** Open the help file if necessary (say, first time we enter this routine,
X+ ** or if the help file changes from the last time we were called).
X+ */
X+ 	errno = 0;
X+ 	if (strcmp(oldpathp, path) == SAME)
X+ 		rewind(helpfp);	/* start at the beginning each time */
X+ 	else
X+ 	{	/* first time the user asked for help using this file */
X+ 		if ((helpfp = fopen(path, "r")) == NULL)
X+ 		{	/* can't open help file, so error exit */
X+ 			return H_ERROR;
X+ 		}
X+ 		/* save the new path in oldpath */
X+ 		if (strlen(path) < sizeof oldpath)
X+ 			strcpy(oldpathp, path);
X+ 		else
X+ 		{	/* not enough room in oldpath, sigh */
X+ 			strncpy(oldpathp, path, sizeof oldpath);
X+ 			oldpath[sizeof oldpath] = NULL;
X+ 		}
X+ 	}
X+ 
X+ /*
X+ ** The correct help file is open.  Look in there for the keyword.
X+ */
X+ 	while (fgets(buf, sizeof buf, helpfp) != NULL)
X+ 	{	/*
X+ 		** If we find the keyword:
X+ 		**	skip to the first non-keyword line
X+ 		**	print lines until you find another keyword line or EOF
X+ 		**	return success
X+ 		*/
X+ 		if (buf[0] == KEYFLAG && strcmp(keyword, bufkeyp) == SAME)
X+ 		{	/* found the key */
X+ 			while (fgets(buf, sizeof buf, helpfp) != NULL
X+ 				&& buf[0] == KEYFLAG)
X+ 				;	/* eat additional keyword lines */
X+ 
X+ 			fputs(bufp, stdout);		/* print help */
X+ 			while (fgets(buf, sizeof buf, helpfp) != NULL
X+ 				&& buf[0] != KEYFLAG)
X+ 				fputs(bufp, stdout);	/* print help */
X+ 			return H_FOUND;
X+ 		}
X+ 	}
X+ 
X+ /* 
X+ ** Didn't find anything in the help file for the poor user.  Return failure.
X+ ** Don't close the help file!  The luser may want further help, and
X+ ** re-opening an already-open help file is wasteful of time.
X+ */
X+ 	return H_NOTFOUND;
X+ }
Xdiff -cr ../gnutex.old/Help/help.h ./Help/help.h
X*** ../gnutex.old/Help/help.h	Fri Feb 10 12:26:05 1989
X--- ./Help/help.h	Wed Feb  1 13:50:57 1989
X***************
X*** 0 ****
X--- 1,4 ----
X+ /* Exit status returned by help() */
X+ #define	H_FOUND		0	/* found the keyword */
X+ #define	H_NOTFOUND	1	/* didn't find the keyword */
X+ #define	H_ERROR		(-1)	/* didn't find the help file */
Xdiff -cr ../gnutex.old/Help/helpfile ./Help/helpfile
X*** ../gnutex.old/Help/helpfile	Fri Feb 10 12:26:05 1989
X--- ./Help/helpfile	Wed Feb  1 13:50:52 1989
X***************
X*** 0 ****
X--- 1,47 ----
X+ ?topic
X+ This line is printed when the user wants help on "topic".
X+ ?
X+ ??
X+ Help is available on:
X+ 
X+     alias    keyword    subject    topic    last-subject
X+     spaces work         space
X+ 
X+ Since there is a null keyword for this line, this section is printed when the
X+ user wants general help (when a help keyword isn't given).  A command summary
X+ is usually here.  Notice that the null keyword is equivalent to a "?"  keyword
X+ here, because of the '?' and '??' keyword lines above.
X+ ?keyword
X+ ?Keyword
X+ ?KEYWORD
X+ These lines will be printed on the screen if the user wanted help on
X+ "keyword", "Keyword", or "KEYWORD".  No casefolding is done on the keywords.
X+ ?subject
X+ ?alias
X+ This line is printed for help on "subject" and "alias".
X+ ?spaces work
X+ ?spaces
X+ ?work
X+ Note that spaces are okay in keywords.  This allows you to set up an
X+ entry for, say, "open usage".  Then when someone types an unrecognized
X+ argument to the `open' command, you can make a call like:
X+ 
X+ 	help("open usage", helpfilename);
X+ 
X+ so it looks like you have a usage message in your program, whereas you
X+ really are still using the help file.
X+ ? 
X+ ? That previous line was just a space, like this line is a comment.
X+ ?space
X+ You can even get help on just a space, although keywording invisible
X+ characters could prove confusing to your users.  Note that "comments"
X+ are really just very long keyword entries, above.  It's unlikely that
X+ anyone would ask for help on " That previous line was just a space,
X+ like this line is a comment."
X+ ?revision
X+ @(#)	1.1   87/07/23
X+ ?last-subject
X+ Note that help sections are terminated by the start of the next '?' entry or
X+ by EOF.  So you can't have a leading '?' on a line of any help section.  You
X+ can re-define the magic character to recognize in column 1, though, if '?' is
X+ too useful.  (I suggest ^A in such extreme cases.)
Xdiff -cr ../gnutex.old/Help/htest.c ./Help/htest.c
X*** ../gnutex.old/Help/htest.c	Fri Feb 10 12:26:05 1989
X--- ./Help/htest.c	Wed Feb  1 13:50:53 1989
X***************
X*** 0 ****
X--- 1,32 ----
X+ #include <stdio.h>
X+ #include "help.h"
X+ 
X+ main()	/* test out the help function */
X+ {
X+ 	char buf[BUFSIZ];
X+ 	char *hfpn = "helpfile";	/* help file path name */
X+ 	char *ahfpn = "alt-helpfile";	/* alternate help file name */
X+ 
X+ 	printf("Type control-D to quit.\n");
X+ 	printf("Help on:  ");
X+ 	while (fgets(buf, sizeof buf, stdin) != NULL)
X+ 	{
X+ 		switch (help(buf, hfpn)) {
X+ 		case H_FOUND:
X+ 			/* already printed the help info; do nothing */
X+ 			break;
X+ 		case H_NOTFOUND:
X+ 			printf("Sorry, no help for %s", buf);
X+ 			help(buf, ahfpn);	/* try other help file */
X+ 			break;
X+ 		case H_ERROR:
X+ 			perror(hfpn);
X+ 			break;
X+ 		default:	/* defensive programming */
X+ 			printf("Can't happen\n");
X+ 			break;
X+ 		}
X+ 		printf("Help on:  ");
X+ 	}
X+ 	exit(0);
X+ }
XCommon subdirectories: ../gnutex.old/doc/example and ./doc/example
Xdiff -cr ../gnutex.old/doc/lasergnu.1 ./doc/lasergnu.1
X*** ../gnutex.old/doc/lasergnu.1	Mon Dec  5 13:25:46 1988
X--- ./doc/lasergnu.1	Thu Feb  2 16:47:07 1989
X***************
X*** 26,31 ****
X--- 26,35 ----
X  .fi
X  The following switches are recognized:
X  .TP
X+ .BI \-I
X+ Use the impress language to make the plot, instead of Tektronix. Many
X+ of the fancier features of gnutex are available in this mode.
X+ .TP
X  .BI \-P\0 printer
X  The output of this program is intended for 
X  .I printer.
XCommon subdirectories: ../gnutex.old/doc/manual and ./doc/manual
Xdiff -cr ../gnutex.old/doc/example/Makefile ./doc/example/Makefile
X*** ../gnutex.old/doc/example/Makefile	Mon Dec 12 14:36:45 1988
X--- ./doc/example/Makefile	Wed Feb  1 13:39:29 1989
X***************
X*** 9,13 ****
X--- 9,19 ----
X  demo2: 
X  	lasergnu -l -f demo2.gnu
X  
X+ demo2.latex:
X+ 	(echo 'set terminal latex'; echo 'set output "plot.tex"'; cat demo2.gnu) | gnutex
X+ 	latex pic
X+ 	@echo ----------------------
X+ 	@echo Now print or view pic.dvi with some dvi output program
X+ 
X  clean:
X  	rm -f *.aux *.log *.dvi *~ plot.tex
Xdiff -cr ../gnutex.old/doc/manual/eg1.tex ./doc/manual/eg1.tex
X*** ../gnutex.old/doc/manual/eg1.tex	Fri Feb 10 12:16:18 1989
X--- ./doc/manual/eg1.tex	Thu Feb  2 17:23:21 1989
X***************
X*** 66,75 ****
X  \put(361,9972){\circle*{1}}
X  \put(361,9972){\circle*{1}}
X  \put(421,9831){\circle*{1}}
X! \put(482,9689){\circle*{1}}
X! \put(542,9548){\circle*{1}}
X! \put(542,9548){\circle*{1}}
X! \put(602,9408){\circle*{1}}
X  \put(662,9267){\circle*{1}}
X  \put(722,9127){\circle*{1}}
X  \put(722,9127){\circle*{1}}
X--- 66,75 ----
X  \put(361,9972){\circle*{1}}
X  \put(361,9972){\circle*{1}}
X  \put(421,9831){\circle*{1}}
X! \put(481,9689){\circle*{1}}
X! \put(541,9548){\circle*{1}}
X! \put(541,9548){\circle*{1}}
X! \put(601,9408){\circle*{1}}
X  \put(662,9267){\circle*{1}}
X  \put(722,9127){\circle*{1}}
X  \put(722,9127){\circle*{1}}
X***************
X*** 78,87 ****
X  \put(903,8708){\circle*{1}}
X  \put(903,8708){\circle*{1}}
X  \put(963,8570){\circle*{1}}
X! \put(1024,8431){\circle*{1}}
X! \put(1084,8293){\circle*{1}}
X! \put(1084,8293){\circle*{1}}
X! \put(1144,8156){\circle*{1}}
X  \put(1204,8019){\circle*{1}}
X  \put(1264,7882){\circle*{1}}
X  \put(1324,7746){\circle*{1}}
X--- 78,87 ----
X  \put(903,8708){\circle*{1}}
X  \put(903,8708){\circle*{1}}
X  \put(963,8570){\circle*{1}}
X! \put(1023,8431){\circle*{1}}
X! \put(1083,8293){\circle*{1}}
X! \put(1083,8293){\circle*{1}}
X! \put(1143,8156){\circle*{1}}
X  \put(1204,8019){\circle*{1}}
X  \put(1264,7882){\circle*{1}}
X  \put(1324,7746){\circle*{1}}
X***************
X*** 89,201 ****
X  \put(1445,7475){\circle*{1}}
X  \put(1445,7475){\circle*{1}}
X  \put(1505,7341){\circle*{1}}
X! \put(1566,7207){\circle*{1}}
X! \put(1626,7073){\circle*{1}}
X  \put(1716,6875){\circle*{1}}
X  \put(1806,6677){\circle*{1}}
X  \put(1897,6482){\circle*{1}}
X  \put(1987,6287){\circle*{1}}
X! \put(2078,6096){\circle*{1}}
X! \put(2168,5905){\circle*{1}}
X  \put(2258,5718){\circle*{1}}
X  \put(2348,5530){\circle*{1}}
X  \put(2439,5347){\circle*{1}}
X  \put(2529,5163){\circle*{1}}
X! \put(2620,4984){\circle*{1}}
X! \put(2710,4805){\circle*{1}}
X  \put(2800,4631){\circle*{1}}
X  \put(2890,4457){\circle*{1}}
X  \put(2981,4288){\circle*{1}}
X  \put(3071,4118){\circle*{1}}
X! \put(3162,3954){\circle*{1}}
X! \put(3252,3789){\circle*{1}}
X  \put(3342,3630){\circle*{1}}
X  \put(3432,3471){\circle*{1}}
X  \put(3523,3318){\circle*{1}}
X  \put(3613,3165){\circle*{1}}
X! \put(3704,3018){\circle*{1}}
X! \put(3794,2871){\circle*{1}}
X  \put(3884,2730){\circle*{1}}
X  \put(3974,2588){\circle*{1}}
X  \put(4065,2454){\circle*{1}}
X  \put(4155,2319){\circle*{1}}
X! \put(4246,2191){\circle*{1}}
X! \put(4336,2063){\circle*{1}}
X  \put(4426,1942){\circle*{1}}
X  \put(4516,1820){\circle*{1}}
X  \put(4607,1706){\circle*{1}}
X  \put(4697,1591){\circle*{1}}
X! \put(4788,1484){\circle*{1}}
X! \put(4878,1376){\circle*{1}}
X  \put(4968,1276){\circle*{1}}
X  \put(5058,1176){\circle*{1}}
X  \put(5239,991){\circle*{1}}
X! \put(5420,820){\circle*{1}}
X  \put(5600,666){\circle*{1}}
X  \put(5781,527){\circle*{1}}
X! \put(5962,404){\circle*{1}}
X  \put(6142,297){\circle*{1}}
X  \put(6323,206){\circle*{1}}
X! \put(6504,131){\circle*{1}}
X  \put(6684,74){\circle*{1}}
X  \put(6865,32){\circle*{1}}
X! \put(7046,8){\circle*{1}}
X  \put(7226,0){\circle*{1}}
X  \put(7407,8){\circle*{1}}
X! \put(7588,34){\circle*{1}}
X  \put(7768,76){\circle*{1}}
X  \put(7949,134){\circle*{1}}
X! \put(8130,209){\circle*{1}}
X  \put(8310,301){\circle*{1}}
X  \put(8491,408){\circle*{1}}
X! \put(8672,532){\circle*{1}}
X  \put(8852,672){\circle*{1}}
X  \put(9033,827){\circle*{1}}
X! \put(9214,998){\circle*{1}}
X  \put(9394,1184){\circle*{1}}
X  \put(9485,1284){\circle*{1}}
X  \put(9575,1384){\circle*{1}}
X! \put(9666,1492){\circle*{1}}
X! \put(9756,1600){\circle*{1}}
X  \put(9846,1715){\circle*{1}}
X  \put(9936,1829){\circle*{1}}
X  \put(10027,1951){\circle*{1}}
X  \put(10117,2073){\circle*{1}}
X! \put(10208,2202){\circle*{1}}
X! \put(10298,2330){\circle*{1}}
X  \put(10388,2465){\circle*{1}}
X  \put(10478,2600){\circle*{1}}
X  \put(10569,2741){\circle*{1}}
X  \put(10659,2882){\circle*{1}}
X! \put(10750,3030){\circle*{1}}
X! \put(10840,3177){\circle*{1}}
X  \put(10930,3331){\circle*{1}}
X  \put(11020,3484){\circle*{1}}
X  \put(11111,3643){\circle*{1}}
X  \put(11201,3802){\circle*{1}}
X! \put(11292,3967){\circle*{1}}
X! \put(11382,4131){\circle*{1}}
X  \put(11472,4301){\circle*{1}}
X  \put(11562,4470){\circle*{1}}
X  \put(11653,4645){\circle*{1}}
X  \put(11743,4820){\circle*{1}}
X! \put(11834,4999){\circle*{1}}
X! \put(11924,5178){\circle*{1}}
X  \put(12014,5362){\circle*{1}}
X  \put(12104,5545){\circle*{1}}
X  \put(12195,5733){\circle*{1}}
X  \put(12285,5920){\circle*{1}}
X! \put(12376,6112){\circle*{1}}
X! \put(12466,6303){\circle*{1}}
X  \put(12556,6498){\circle*{1}}
X  \put(12646,6693){\circle*{1}}
X  \put(12737,6891){\circle*{1}}
X  \put(12827,7089){\circle*{1}}
X  \put(12887,7223){\circle*{1}}
X! \put(12948,7357){\circle*{1}}
X! \put(13008,7491){\circle*{1}}
X! \put(13008,7491){\circle*{1}}
X! \put(13068,7627){\circle*{1}}
X  \put(13128,7762){\circle*{1}}
X  \put(13188,7898){\circle*{1}}
X  \put(13188,7898){\circle*{1}}
X--- 89,200 ----
X  \put(1445,7475){\circle*{1}}
X  \put(1445,7475){\circle*{1}}
X  \put(1505,7341){\circle*{1}}
X! \put(1565,7207){\circle*{1}}
X! \put(1625,7073){\circle*{1}}
X  \put(1716,6875){\circle*{1}}
X  \put(1806,6677){\circle*{1}}
X  \put(1897,6482){\circle*{1}}
X  \put(1987,6287){\circle*{1}}
X! \put(2077,6096){\circle*{1}}
X! \put(2167,5905){\circle*{1}}
X  \put(2258,5718){\circle*{1}}
X  \put(2348,5530){\circle*{1}}
X  \put(2439,5347){\circle*{1}}
X  \put(2529,5163){\circle*{1}}
X! \put(2619,4984){\circle*{1}}
X! \put(2709,4805){\circle*{1}}
X  \put(2800,4631){\circle*{1}}
X  \put(2890,4457){\circle*{1}}
X  \put(2981,4288){\circle*{1}}
X  \put(3071,4118){\circle*{1}}
X! \put(3161,3954){\circle*{1}}
X! \put(3251,3789){\circle*{1}}
X  \put(3342,3630){\circle*{1}}
X  \put(3432,3471){\circle*{1}}
X  \put(3523,3318){\circle*{1}}
X  \put(3613,3165){\circle*{1}}
X! \put(3703,3018){\circle*{1}}
X! \put(3793,2871){\circle*{1}}
X  \put(3884,2730){\circle*{1}}
X  \put(3974,2588){\circle*{1}}
X  \put(4065,2454){\circle*{1}}
X  \put(4155,2319){\circle*{1}}
X! \put(4245,2191){\circle*{1}}
X! \put(4335,2063){\circle*{1}}
X  \put(4426,1942){\circle*{1}}
X  \put(4516,1820){\circle*{1}}
X  \put(4607,1706){\circle*{1}}
X  \put(4697,1591){\circle*{1}}
X! \put(4787,1484){\circle*{1}}
X! \put(4877,1376){\circle*{1}}
X  \put(4968,1276){\circle*{1}}
X  \put(5058,1176){\circle*{1}}
X  \put(5239,991){\circle*{1}}
X! \put(5419,820){\circle*{1}}
X  \put(5600,666){\circle*{1}}
X  \put(5781,527){\circle*{1}}
X! \put(5961,404){\circle*{1}}
X  \put(6142,297){\circle*{1}}
X  \put(6323,206){\circle*{1}}
X! \put(6503,131){\circle*{1}}
X  \put(6684,74){\circle*{1}}
X  \put(6865,32){\circle*{1}}
X! \put(7045,8){\circle*{1}}
X  \put(7226,0){\circle*{1}}
X  \put(7407,8){\circle*{1}}
X! \put(7587,34){\circle*{1}}
X  \put(7768,76){\circle*{1}}
X  \put(7949,134){\circle*{1}}
X! \put(8129,209){\circle*{1}}
X  \put(8310,301){\circle*{1}}
X  \put(8491,408){\circle*{1}}
X! \put(8671,532){\circle*{1}}
X  \put(8852,672){\circle*{1}}
X  \put(9033,827){\circle*{1}}
X! \put(9213,998){\circle*{1}}
X  \put(9394,1184){\circle*{1}}
X  \put(9485,1284){\circle*{1}}
X  \put(9575,1384){\circle*{1}}
X! \put(9665,1492){\circle*{1}}
X! \put(9755,1600){\circle*{1}}
X  \put(9846,1715){\circle*{1}}
X  \put(9936,1829){\circle*{1}}
X  \put(10027,1951){\circle*{1}}
X  \put(10117,2073){\circle*{1}}
X! \put(10207,2202){\circle*{1}}
X! \put(10297,2330){\circle*{1}}
X  \put(10388,2465){\circle*{1}}
X  \put(10478,2600){\circle*{1}}
X  \put(10569,2741){\circle*{1}}
X  \put(10659,2882){\circle*{1}}
X! \put(10749,3030){\circle*{1}}
X! \put(10839,3177){\circle*{1}}
X  \put(10930,3331){\circle*{1}}
X  \put(11020,3484){\circle*{1}}
X  \put(11111,3643){\circle*{1}}
X  \put(11201,3802){\circle*{1}}
X! \put(11291,3967){\circle*{1}}
X! \put(11381,4131){\circle*{1}}
X  \put(11472,4301){\circle*{1}}
X  \put(11562,4470){\circle*{1}}
X  \put(11653,4645){\circle*{1}}
X  \put(11743,4820){\circle*{1}}
X! \put(11833,4999){\circle*{1}}
X! \put(11923,5178){\circle*{1}}
X  \put(12014,5362){\circle*{1}}
X  \put(12104,5545){\circle*{1}}
X  \put(12195,5733){\circle*{1}}
X  \put(12285,5920){\circle*{1}}
X! \put(12375,6112){\circle*{1}}
X! \put(12465,6303){\circle*{1}}
X  \put(12556,6498){\circle*{1}}
X  \put(12646,6693){\circle*{1}}
X  \put(12737,6891){\circle*{1}}
X  \put(12827,7089){\circle*{1}}
X  \put(12887,7223){\circle*{1}}
X! \put(12947,7357){\circle*{1}}
X! \put(13007,7491){\circle*{1}}
X! \put(13067,7627){\circle*{1}}
X  \put(13128,7762){\circle*{1}}
X  \put(13188,7898){\circle*{1}}
X  \put(13188,7898){\circle*{1}}
X***************
X*** 204,393 ****
X  \put(13369,8310){\circle*{1}}
X  \put(13369,8310){\circle*{1}}
X  \put(13429,8448){\circle*{1}}
X! \put(13490,8587){\circle*{1}}
X! \put(13550,8725){\circle*{1}}
X! \put(13550,8725){\circle*{1}}
X! \put(13610,8865){\circle*{1}}
X  \put(13670,9004){\circle*{1}}
X  \put(13730,9144){\circle*{1}}
X  \put(13790,9285){\circle*{1}}
X  \put(13851,9425){\circle*{1}}
X  \put(13911,9566){\circle*{1}}
X  \put(13911,9566){\circle*{1}}
X  \put(13971,9707){\circle*{1}}
X! \put(14032,9848){\circle*{1}}
X! \put(14092,9989){\circle*{1}}
X! \put(14092,9989){\circle*{1}}
X! \put(14152,10131){\circle*{1}}
X  \put(14212,10272){\circle*{1}}
X  \put(14272,10414){\circle*{1}}
X  \put(14332,10556){\circle*{1}}
X  \put(14393,10697){\circle*{1}}
X  \put(14453,10839){\circle*{1}}
X  \put(14453,10839){\circle*{1}}
X  \put(14513,10981){\circle*{1}}
X! \put(14574,11122){\circle*{1}}
X! \put(14634,11264){\circle*{1}}
X! \put(14634,11264){\circle*{1}}
X! \put(14694,11406){\circle*{1}}
X  \put(14754,11547){\circle*{1}}
X  \put(14814,11689){\circle*{1}}
X  \put(14874,11830){\circle*{1}}
X! \put(14935,11971){\circle*{1}}
X! \put(14995,12112){\circle*{1}}
X! \put(14995,12112){\circle*{1}}
X! \put(15055,12253){\circle*{1}}
X! \put(15116,12393){\circle*{1}}
X! \put(15176,12534){\circle*{1}}
X! \put(15176,12534){\circle*{1}}
X! \put(15236,12674){\circle*{1}}
X  \put(15296,12813){\circle*{1}}
X  \put(15356,12953){\circle*{1}}
X  \put(15416,13091){\circle*{1}}
X! \put(15477,13230){\circle*{1}}
X! \put(15537,13368){\circle*{1}}
X! \put(15537,13368){\circle*{1}}
X! \put(15597,13505){\circle*{1}}
X! \put(15658,13643){\circle*{1}}
X! \put(15718,13780){\circle*{1}}
X! \put(15718,13780){\circle*{1}}
X! \put(15778,13916){\circle*{1}}
X  \put(15838,14051){\circle*{1}}
X  \put(15898,14187){\circle*{1}}
X  \put(15958,14321){\circle*{1}}
X! \put(16019,14455){\circle*{1}}
X! \put(16079,14589){\circle*{1}}
X! \put(16079,14589){\circle*{1}}
X! \put(16170,14787){\circle*{1}}
X! \put(16260,14985){\circle*{1}}
X  \put(16350,15180){\circle*{1}}
X  \put(16440,15375){\circle*{1}}
X! \put(16531,15567){\circle*{1}}
X! \put(16621,15758){\circle*{1}}
X! \put(16712,15946){\circle*{1}}
X! \put(16802,16133){\circle*{1}}
X  \put(16892,16317){\circle*{1}}
X  \put(16982,16500){\circle*{1}}
X! \put(17073,16679){\circle*{1}}
X! \put(17163,16858){\circle*{1}}
X! \put(17254,17033){\circle*{1}}
X! \put(17344,17208){\circle*{1}}
X  \put(17434,17378){\circle*{1}}
X  \put(17524,17547){\circle*{1}}
X! \put(17615,17712){\circle*{1}}
X! \put(17705,17876){\circle*{1}}
X! \put(17796,18035){\circle*{1}}
X! \put(17886,18194){\circle*{1}}
X  \put(17976,18348){\circle*{1}}
X  \put(18066,18501){\circle*{1}}
X! \put(18157,18649){\circle*{1}}
X! \put(18247,18796){\circle*{1}}
X! \put(18338,18937){\circle*{1}}
X! \put(18428,19078){\circle*{1}}
X  \put(18518,19213){\circle*{1}}
X  \put(18608,19348){\circle*{1}}
X! \put(18699,19477){\circle*{1}}
X! \put(18789,19605){\circle*{1}}
X! \put(18880,19727){\circle*{1}}
X! \put(18970,19849){\circle*{1}}
X  \put(19060,19964){\circle*{1}}
X  \put(19150,20078){\circle*{1}}
X! \put(19241,20186){\circle*{1}}
X! \put(19331,20294){\circle*{1}}
X! \put(19422,20394){\circle*{1}}
X! \put(19512,20494){\circle*{1}}
X  \put(19692,20680){\circle*{1}}
X! \put(19873,20851){\circle*{1}}
X! \put(20054,21006){\circle*{1}}
X  \put(20234,21146){\circle*{1}}
X! \put(20415,21270){\circle*{1}}
X! \put(20596,21377){\circle*{1}}
X  \put(20776,21469){\circle*{1}}
X! \put(20957,21544){\circle*{1}}
X! \put(21138,21602){\circle*{1}}
X  \put(21318,21644){\circle*{1}}
X! \put(21499,21670){\circle*{1}}
X! \put(21680,21678){\circle*{1}}
X  \put(21860,21670){\circle*{1}}
X! \put(22041,21646){\circle*{1}}
X! \put(22222,21604){\circle*{1}}
X  \put(22402,21547){\circle*{1}}
X! \put(22583,21472){\circle*{1}}
X! \put(22764,21381){\circle*{1}}
X  \put(22944,21274){\circle*{1}}
X! \put(23125,21151){\circle*{1}}
X! \put(23306,21012){\circle*{1}}
X  \put(23486,20858){\circle*{1}}
X! \put(23667,20687){\circle*{1}}
X! \put(23848,20502){\circle*{1}}
X  \put(23938,20402){\circle*{1}}
X  \put(24028,20302){\circle*{1}}
X! \put(24119,20195){\circle*{1}}
X! \put(24209,20087){\circle*{1}}
X! \put(24300,19973){\circle*{1}}
X! \put(24390,19858){\circle*{1}}
X  \put(24480,19737){\circle*{1}}
X  \put(24570,19615){\circle*{1}}
X! \put(24661,19487){\circle*{1}}
X! \put(24751,19359){\circle*{1}}
X! \put(24842,19225){\circle*{1}}
X! \put(24932,19090){\circle*{1}}
X  \put(25022,18949){\circle*{1}}
X  \put(25112,18807){\circle*{1}}
X! \put(25203,18660){\circle*{1}}
X! \put(25293,18513){\circle*{1}}
X! \put(25384,18360){\circle*{1}}
X! \put(25474,18207){\circle*{1}}
X  \put(25564,18048){\circle*{1}}
X  \put(25654,17889){\circle*{1}}
X! \put(25745,17725){\circle*{1}}
X! \put(25835,17560){\circle*{1}}
X! \put(25926,17391){\circle*{1}}
X! \put(26016,17221){\circle*{1}}
X  \put(26106,17047){\circle*{1}}
X  \put(26196,16873){\circle*{1}}
X! \put(26287,16694){\circle*{1}}
X! \put(26377,16515){\circle*{1}}
X! \put(26468,16332){\circle*{1}}
X! \put(26558,16148){\circle*{1}}
X  \put(26648,15961){\circle*{1}}
X  \put(26738,15773){\circle*{1}}
X! \put(26829,15582){\circle*{1}}
X! \put(26919,15391){\circle*{1}}
X! \put(27010,15196){\circle*{1}}
X! \put(27100,15001){\circle*{1}}
X  \put(27190,14803){\circle*{1}}
X  \put(27280,14605){\circle*{1}}
X  \put(27340,14471){\circle*{1}}
X! \put(27401,14337){\circle*{1}}
X! \put(27461,14203){\circle*{1}}
X! \put(27521,14067){\circle*{1}}
X! \put(27582,13932){\circle*{1}}
X! \put(27642,13796){\circle*{1}}
X! \put(27702,13659){\circle*{1}}
X  \put(27762,13522){\circle*{1}}
X  \put(27822,13385){\circle*{1}}
X  \put(27882,13247){\circle*{1}}
X! \put(27943,13108){\circle*{1}}
X! \put(28003,12970){\circle*{1}}
X! \put(28003,12970){\circle*{1}}
X! \put(28063,12830){\circle*{1}}
X! \put(28124,12691){\circle*{1}}
X! \put(28184,12551){\circle*{1}}
X! \put(28244,12411){\circle*{1}}
X  \put(28304,12270){\circle*{1}}
X  \put(28364,12130){\circle*{1}}
X  \put(28364,12130){\circle*{1}}
X  \put(28424,11989){\circle*{1}}
X! \put(28485,11847){\circle*{1}}
X! \put(28545,11706){\circle*{1}}
X! \put(28545,11706){\circle*{1}}
X! \put(28605,11565){\circle*{1}}
X! \put(28666,11423){\circle*{1}}
X! \put(28726,11282){\circle*{1}}
X! \put(28726,11282){\circle*{1}}
X! \put(28786,11140){\circle*{1}}
X! \put(28847,10998){\circle*{1}}
X  \end{picture}
X  \end{tabular}
X  
X--- 203,393 ----
X  \put(13369,8310){\circle*{1}}
X  \put(13369,8310){\circle*{1}}
X  \put(13429,8448){\circle*{1}}
X! \put(13489,8587){\circle*{1}}
X! \put(13549,8725){\circle*{1}}
X! \put(13549,8725){\circle*{1}}
X! \put(13609,8865){\circle*{1}}
X  \put(13670,9004){\circle*{1}}
X  \put(13730,9144){\circle*{1}}
X+ \put(13730,9144){\circle*{1}}
X  \put(13790,9285){\circle*{1}}
X  \put(13851,9425){\circle*{1}}
X  \put(13911,9566){\circle*{1}}
X  \put(13911,9566){\circle*{1}}
X  \put(13971,9707){\circle*{1}}
X! \put(14031,9848){\circle*{1}}
X! \put(14091,9989){\circle*{1}}
X! \put(14151,10131){\circle*{1}}
X  \put(14212,10272){\circle*{1}}
X  \put(14272,10414){\circle*{1}}
X+ \put(14272,10414){\circle*{1}}
X  \put(14332,10556){\circle*{1}}
X  \put(14393,10697){\circle*{1}}
X  \put(14453,10839){\circle*{1}}
X  \put(14453,10839){\circle*{1}}
X  \put(14513,10981){\circle*{1}}
X! \put(14573,11122){\circle*{1}}
X! \put(14633,11264){\circle*{1}}
X! \put(14693,11406){\circle*{1}}
X  \put(14754,11547){\circle*{1}}
X  \put(14814,11689){\circle*{1}}
X+ \put(14814,11689){\circle*{1}}
X  \put(14874,11830){\circle*{1}}
X! \put(14934,11971){\circle*{1}}
X! \put(14994,12112){\circle*{1}}
X! \put(15054,12253){\circle*{1}}
X! \put(15115,12393){\circle*{1}}
X! \put(15175,12534){\circle*{1}}
X! \put(15175,12534){\circle*{1}}
X! \put(15235,12674){\circle*{1}}
X  \put(15296,12813){\circle*{1}}
X  \put(15356,12953){\circle*{1}}
X+ \put(15356,12953){\circle*{1}}
X  \put(15416,13091){\circle*{1}}
X! \put(15476,13230){\circle*{1}}
X! \put(15536,13368){\circle*{1}}
X! \put(15536,13368){\circle*{1}}
X! \put(15596,13505){\circle*{1}}
X! \put(15657,13643){\circle*{1}}
X! \put(15717,13780){\circle*{1}}
X! \put(15717,13780){\circle*{1}}
X! \put(15777,13916){\circle*{1}}
X  \put(15838,14051){\circle*{1}}
X  \put(15898,14187){\circle*{1}}
X+ \put(15898,14187){\circle*{1}}
X  \put(15958,14321){\circle*{1}}
X! \put(16018,14455){\circle*{1}}
X! \put(16078,14589){\circle*{1}}
X! \put(16169,14787){\circle*{1}}
X! \put(16259,14985){\circle*{1}}
X  \put(16350,15180){\circle*{1}}
X  \put(16440,15375){\circle*{1}}
X! \put(16530,15567){\circle*{1}}
X! \put(16620,15758){\circle*{1}}
X! \put(16711,15946){\circle*{1}}
X! \put(16801,16133){\circle*{1}}
X  \put(16892,16317){\circle*{1}}
X  \put(16982,16500){\circle*{1}}
X! \put(17072,16679){\circle*{1}}
X! \put(17162,16858){\circle*{1}}
X! \put(17253,17033){\circle*{1}}
X! \put(17343,17208){\circle*{1}}
X  \put(17434,17378){\circle*{1}}
X  \put(17524,17547){\circle*{1}}
X! \put(17614,17712){\circle*{1}}
X! \put(17704,17876){\circle*{1}}
X! \put(17795,18035){\circle*{1}}
X! \put(17885,18194){\circle*{1}}
X  \put(17976,18348){\circle*{1}}
X  \put(18066,18501){\circle*{1}}
X! \put(18156,18649){\circle*{1}}
X! \put(18246,18796){\circle*{1}}
X! \put(18337,18937){\circle*{1}}
X! \put(18427,19078){\circle*{1}}
X  \put(18518,19213){\circle*{1}}
X  \put(18608,19348){\circle*{1}}
X! \put(18698,19477){\circle*{1}}
X! \put(18788,19605){\circle*{1}}
X! \put(18879,19727){\circle*{1}}
X! \put(18969,19849){\circle*{1}}
X  \put(19060,19964){\circle*{1}}
X  \put(19150,20078){\circle*{1}}
X! \put(19240,20186){\circle*{1}}
X! \put(19330,20294){\circle*{1}}
X! \put(19421,20394){\circle*{1}}
X! \put(19511,20494){\circle*{1}}
X  \put(19692,20680){\circle*{1}}
X! \put(19872,20851){\circle*{1}}
X! \put(20053,21006){\circle*{1}}
X  \put(20234,21146){\circle*{1}}
X! \put(20414,21270){\circle*{1}}
X! \put(20595,21377){\circle*{1}}
X  \put(20776,21469){\circle*{1}}
X! \put(20956,21544){\circle*{1}}
X! \put(21137,21602){\circle*{1}}
X  \put(21318,21644){\circle*{1}}
X! \put(21498,21670){\circle*{1}}
X! \put(21679,21678){\circle*{1}}
X  \put(21860,21670){\circle*{1}}
X! \put(22040,21646){\circle*{1}}
X! \put(22221,21604){\circle*{1}}
X  \put(22402,21547){\circle*{1}}
X! \put(22582,21472){\circle*{1}}
X! \put(22763,21381){\circle*{1}}
X  \put(22944,21274){\circle*{1}}
X! \put(23124,21151){\circle*{1}}
X! \put(23305,21012){\circle*{1}}
X  \put(23486,20858){\circle*{1}}
X! \put(23666,20687){\circle*{1}}
X! \put(23847,20502){\circle*{1}}
X  \put(23938,20402){\circle*{1}}
X  \put(24028,20302){\circle*{1}}
X! \put(24118,20195){\circle*{1}}
X! \put(24208,20087){\circle*{1}}
X! \put(24299,19973){\circle*{1}}
X! \put(24389,19858){\circle*{1}}
X  \put(24480,19737){\circle*{1}}
X  \put(24570,19615){\circle*{1}}
X! \put(24660,19487){\circle*{1}}
X! \put(24750,19359){\circle*{1}}
X! \put(24841,19225){\circle*{1}}
X! \put(24931,19090){\circle*{1}}
X  \put(25022,18949){\circle*{1}}
X  \put(25112,18807){\circle*{1}}
X! \put(25202,18660){\circle*{1}}
X! \put(25292,18513){\circle*{1}}
X! \put(25383,18360){\circle*{1}}
X! \put(25473,18207){\circle*{1}}
X  \put(25564,18048){\circle*{1}}
X  \put(25654,17889){\circle*{1}}
X! \put(25744,17725){\circle*{1}}
X! \put(25834,17560){\circle*{1}}
X! \put(25925,17391){\circle*{1}}
X! \put(26015,17221){\circle*{1}}
X  \put(26106,17047){\circle*{1}}
X  \put(26196,16873){\circle*{1}}
X! \put(26286,16694){\circle*{1}}
X! \put(26376,16515){\circle*{1}}
X! \put(26467,16332){\circle*{1}}
X! \put(26557,16148){\circle*{1}}
X  \put(26648,15961){\circle*{1}}
X  \put(26738,15773){\circle*{1}}
X! \put(26828,15582){\circle*{1}}
X! \put(26918,15391){\circle*{1}}
X! \put(27009,15196){\circle*{1}}
X! \put(27099,15001){\circle*{1}}
X  \put(27190,14803){\circle*{1}}
X  \put(27280,14605){\circle*{1}}
X  \put(27340,14471){\circle*{1}}
X! \put(27400,14337){\circle*{1}}
X! \put(27460,14203){\circle*{1}}
X! \put(27520,14067){\circle*{1}}
X! \put(27581,13932){\circle*{1}}
X! \put(27641,13796){\circle*{1}}
X! \put(27701,13659){\circle*{1}}
X  \put(27762,13522){\circle*{1}}
X  \put(27822,13385){\circle*{1}}
X  \put(27882,13247){\circle*{1}}
X! \put(27942,13108){\circle*{1}}
X! \put(28002,12970){\circle*{1}}
X! \put(28002,12970){\circle*{1}}
X! \put(28062,12830){\circle*{1}}
X! \put(28123,12691){\circle*{1}}
X! \put(28183,12551){\circle*{1}}
X! \put(28243,12411){\circle*{1}}
X  \put(28304,12270){\circle*{1}}
X  \put(28364,12130){\circle*{1}}
X  \put(28364,12130){\circle*{1}}
X  \put(28424,11989){\circle*{1}}
X! \put(28484,11847){\circle*{1}}
X! \put(28544,11706){\circle*{1}}
X! \put(28544,11706){\circle*{1}}
X! \put(28604,11565){\circle*{1}}
X! \put(28665,11423){\circle*{1}}
X! \put(28725,11282){\circle*{1}}
X! \put(28725,11282){\circle*{1}}
X! \put(28785,11140){\circle*{1}}
X! \put(28846,10998){\circle*{1}}
X  \end{picture}
X  \end{tabular}
X  
SHAR_EOF
fi # end of overwriting check
#	End of shell archive
exit 0
Department of Computer Science, Duke University, Durham, NC 27706
ARPA:	dfk@cs.duke.edu
CSNET:	dfk@duke        
UUCP:	decvax!duke!dfk