[comp.sources.misc] v15i016: gnuplot 2.0 patch 1

rjl@monu1.cc.monash.edu.au (Russell Lang) (10/06/90)

Posting-number: Volume 15, Issue 16
Submitted-by: Russell Lang <rjl@monu1.cc.monash.edu.au>
Archive-name: gnuplot2/patch01

# This is patch 1 to gnuplot 2.0.

# This patch is made up of 4 shar files.
# The first shar file must by unshared with the command 
# `sh gnuplot_patch1.sh1 -c` to allow it to overwrite the files
# version.c, setshow.c, docs/doc2tex.c, docs/titlepage.ms and 
# docs/titlepage.tex.  

# Russell Lang <rjl@monu1.cc.monash.edu.au>




#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  README.patch1 version.c setshow.c docs docs/doc2tex.c
#   docs/titlepage.ms docs/titlepage.tex
# Wrapped by eln272v@monu1 on Tue Sep 18 14:52:44 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f README.patch1 -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"README.patch1\"
else
echo shar: Extracting \"README.patch1\" \(4083 characters\)
sed "s/^X//" >README.patch1 <<'END_OF_README.patch1'
XPatch 1 to gnuplot 2.0.
X-----------------------
X
XThe files in this patch are
X
Xgnuplot_patch1.sh1:
X    README.patch1 (this file)
X    version.c
X    setshow.c
X    docs/doc2tex.c
X    docs/titlepage.ms
X    docs/titlepage.tex
X
Xgnuplot_patch1.sh2
X    patch1a
X
Xgnuplot_patch1.sh3
X    patch1b
X
Xgnuplot_patch1.sh4
X    patch1c
X
X
XTo apply this patch copy the files patch1a, patch1b and patch1c to the 
Xgnuplot directory.  
XOverwrite the original gnuplot files version.c, setshow.c, docs/doc2tex.c, 
Xdocs/titlepage.ms and docs/titlepage.tex with the replacements in this patch.
X
XChange directory to the gnuplot directory, and then apply the patches
Xwith the following commands:
X
X    patch -p < patch1a
X    patch -p < patch1b
X    patch -p < patch1c
X
XThen recompile gnuplot!
X
X
XBuilding Gnuplot on Ultrix.
X---------------------------
X
XChanges have been made to several term/*.trm files so that the Ultrix
Xstandard cc compiler can now be used.  Use makefile.unx instead of 
Xmakefile.ult.   makefile.ult may be deleted.
X
X
XBuilding Gnuplot on RS/6000 AIX 3.1
X-----------------------------------
X
XOne small source changes is needed to successfully compile gnuplot on AIX 3.1:
X
X   o Comment out the "extern char *malloc();" declaration in misc.c
X
XProper CFLAGS setting is -O -Dunix -DBCOPY -DBZERO -DGAMMA.
X
X
XBuilding Gnuplot for X11
X------------------------
X
XRead README.x11.
X
X
XSignificant changes in this patch
X---------------------------------
X
Xcommand.c:
X	Fixed bug in replot command that arose under Turbo C.
X        Added cd (change directory) and pwd (print working directory) 
X        commands.
Xgraphics.c:
X	Fixed bugs in the ticmark-series code, by adding new functions 
X	specifically for ticmark series.
X	Corrected problems using user-defined ticmark sets with logscale.
Xparse.c: 
X	Catch a situation where no floating point exception occured and 
X	yet the value computed was Inf (IEEE infinite).  
X	This happens on the 3b1 when plotting x**-4 + x.
Xpcgraph.asm:
X	Changed the 'jmp _inter' to a far jump.
Xstandard.c:
X	Bessel functions fixed.  However, they only accept real arguments.
Xterm.h:
X	Moved most terminal defines from makefiles to new file term.h.
X
Xdocs/gnuplot.doc:
X        Fixed a troff problem.
X        Added note about bessel function limitations.
X        Added cd and pwd commands.
Xdocs/titlepage.ms:
Xdocs/titlepage.tex:
X        Updated version number to 2.0.
X
Xdocs/latextut/tutorial.tex:
X	Mentioned a new package of useful auxiliary programs for latex users.
X
Xterm/eepic.trm:
X        Ultrix cc initialiser problem fixed.
Xterm/eps60.trm:
X	New epson driver for 60dpi printers.
Xterm/epson.trm:
X	New Star color printer driver.
Xterm/hpljet.trm:
X	Fixed text placement.
Xterm/hpgl.trm:
X        Ultrix cc initialiser problem fixed.
Xterm/imagen.trm:
X        Ultrix cc initialiser problem fixed.
Xterm/latex.trm: 
X	Many bugs fixed: some to help out different compilers, some bugs
X	  in LATEX_linetype that had caused coredumps, and several
X	  details in the line-drawing routines. This last one had
X	  sometimes left gaps in lines that were near-vertical.
X	New emTeX driver.
X        Ultrix cc initialiser problem fixed.
Xterm/pc.trm:
X	Added Turbo C ATT6300 driver.
Xterm/post.trm:
X	Added "0 setgray" to epsf output.
X        Ultrix cc initialiser problem fixed.
X        Added stroke before show.
Xterm/t410x.trm:
X	New Tektronix 410x driver.
Xterm/x11.trm:
Xgnuplot_x11.c:
X	New X11 driver.
Xterm/unixpc.trm: 
X	Use stdout and not stdin as the window device.
X
X
XMail Addresses
X--------------
X
XThe mailing list info-gnuplot exists as a forum for discussions about 
Xgnuplot.  About the only gnuplot topic not supported by this list is 
Xbug reports.  They are handled by a different mail alias, bug-gnuplot.  
X
XTo be removed or add someone to the mailing list send mail to:
X
Xpixar!info-gnuplot-request@sun.com
X
X
XTo report bugs send mail to:
X
Xpixar!bug-gnuplot@sun.com
X
X
XTo ask a question or discuss gnuplot send mail to:
X
Xpixar!info-gnuplot@sun.com
X
X
Xpixar is a UUCP site.  sun.com is a UUCP and Internet site.  
XIn the above addresses, sun.com can be replaced by ucbvax.berkeley.edu.
X
X
XEnd of README.patch1
END_OF_README.patch1
if test 4083 -ne `wc -c <README.patch1`; then
    echo shar: \"README.patch1\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f version.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"version.c\"
else
echo shar: Extracting \"version.c\" \(220 characters\)
sed "s/^X//" >version.c <<'END_OF_version.c'
Xchar version[] = "2.0";
Xchar patchlevel[] = "1";
Xchar date[] = "Tue Sep 18 14:46:32 EST 1990";
X
X/* override in Makefile */
X#ifndef CONTACT
X# define CONTACT "pixar!bug-gnuplot@sun.com";
X#endif
Xchar bug_email[] = CONTACT;
END_OF_version.c
if test 220 -ne `wc -c <version.c`; then
    echo shar: \"version.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f setshow.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"setshow.c\"
else
echo shar: Extracting \"setshow.c\" \(41480 characters\)
sed "s/^X//" >setshow.c <<'END_OF_setshow.c'
X/* GNUPLOT - setshow.c */
X/*
X * Copyright (C) 1986, 1987, 1990   Thomas Williams, Colin Kelley
X *
X * Permission to use, copy, and distribute this software and its
X * documentation for any purpose with or without fee is hereby granted, 
X * provided that the above copyright notice appear in all copies and 
X * that both that copyright notice and this permission notice appear 
X * in supporting documentation.
X *
X * Permission to modify the software is granted, but not the right to
X * distribute the modified code.  Modifications are to be distributed 
X * as patches to released version.
X *  
X * This software  is provided "as is" without express or implied warranty.
X * 
X *
X * AUTHORS
X * 
X *   Original Software:
X *     Thomas Williams,  Colin Kelley.
X * 
X *   Gnuplot 2.0 additions:
X *       Russell Lang, Dave Kotz, John Campbell.
X * 
X * send your comments or suggestions to (pixar!info-gnuplot@sun.com).
X * 
X */
X
X#include <stdio.h>
X#include <math.h>
X#include "plot.h"
X#include "setshow.h"
X
X#define DEF_FORMAT   "%g"	/* default format for tic mark labels */
X#define SIGNIF (0.01)		/* less than one hundredth of a tic mark */
X
X/*
X * global variables to hold status of 'set' options
X *
X */
XBOOLEAN			autoscale_x	= TRUE;
XBOOLEAN			autoscale_y	= TRUE;
XBOOLEAN			autoscale_lx	= TRUE;
XBOOLEAN			autoscale_ly	= TRUE;
XBOOLEAN 	  	 	clip_points    = FALSE;
XBOOLEAN 	  	 	clip_lines1    = TRUE;
XBOOLEAN 	  	 	clip_lines2    = FALSE;
Xchar			dummy_var[MAX_ID_LEN+1] = "x";
Xchar			xformat[MAX_ID_LEN+1] = DEF_FORMAT;
Xchar			yformat[MAX_ID_LEN+1] = DEF_FORMAT;
Xenum PLOT_STYLE data_style	= POINTS,
X				func_style	= LINES;
XBOOLEAN			grid		= FALSE;
Xint				key			= -1;	/* default position */
Xdouble			key_x, key_y;		/* user specified position for key */
XBOOLEAN			log_x		= FALSE,
X				log_y		= FALSE;
XFILE*			outfile;
Xchar			outstr[MAX_ID_LEN+1] = "STDOUT";
XBOOLEAN			polar		= FALSE;
Xint				samples		= SAMPLES;
Xfloat			xsize		= 1.0;  /* scale factor for size */
Xfloat			ysize		= 1.0;  /* scale factor for size */
Xint				term		= 0;				/* unknown term is 0 */
Xchar			title[MAX_LINE_LEN+1] = "";
Xchar			xlabel[MAX_LINE_LEN+1] = "";
Xchar			ylabel[MAX_LINE_LEN+1] = "";
Xdouble			xmin		= -10.0,
X				xmax		= 10.0,
X				ymin		= -10.0,
X				ymax		= 10.0;
Xdouble			loff		= 0.0,
X				roff		= 0.0,
X				toff		= 0.0,
X				boff		= 0.0;
Xdouble			zero = ZERO;			/* zero threshold, not 0! */
X
XBOOLEAN xtics = TRUE;
XBOOLEAN ytics = TRUE;
X
Xstruct ticdef xticdef = {TIC_COMPUTED};
Xstruct ticdef yticdef = {TIC_COMPUTED};
X
XBOOLEAN			tic_in		= TRUE;
X
Xstruct text_label *first_label = NULL;
Xstruct arrow_def *first_arrow = NULL;
X
X/*** other things we need *****/
Xextern char *strcpy(),*strcat();
Xextern int strlen();
X
X/* input data, parsing variables */
Xextern struct lexical_unit token[];
Xextern char input_line[];
Xextern int num_tokens, c_token;
X
Xextern char replot_line[];
Xextern struct udvt_entry *first_udv;
X
Xextern double magnitude(),real();
Xextern struct value *const_express();
X
X/******** Local functions ********/
Xstatic void set_label();
Xstatic void set_nolabel();
Xstatic void set_arrow();
Xstatic void set_noarrow();
Xstatic void load_tics();
Xstatic void load_tic_user();
Xstatic void free_marklist();
Xstatic void load_tic_series();
Xstatic void load_offsets();
X
Xstatic void show_style(), show_range(), show_zero();
Xstatic void show_offsets(), show_output(), show_samples(), show_size();
Xstatic void show_title(), show_xlabel(), show_ylabel();
Xstatic void show_label(), show_arrow(), show_grid(), show_key();
Xstatic void show_polar(), show_tics(), show_ticdef();
Xstatic void show_term(), show_plot(), show_autoscale(), show_clip();
Xstatic void show_format(), show_logscale(), show_variables();
X
Xstatic void delete_label();
Xstatic int assign_label_tag();
Xstatic void delete_arrow();
Xstatic int assign_arrow_tag();
X
X/******** The 'set' command ********/
Xvoid
Xset_command()
X{
X     static char testfile[MAX_LINE_LEN+1];
X
X	c_token++;
X
X	if (almost_equals(c_token,"ar$row")) {
X		c_token++;
X		set_arrow();
X	}
X	else if (almost_equals(c_token,"noar$row")) {
X		c_token++;
X		set_noarrow();
X	}
X     else if (almost_equals(c_token,"au$toscale")) {
X	    c_token++;
X	    if (END_OF_COMMAND) {
X		   autoscale_x = autoscale_y = TRUE;
X	    } else if (equals(c_token, "xy") || equals(c_token, "yx")) {
X		   autoscale_x = autoscale_y = TRUE;
X		   c_token++;
X	    } else if (equals(c_token, "x")) {
X		   autoscale_x = TRUE;
X		   c_token++;
X	    } else if (equals(c_token, "y")) {
X		   autoscale_y = TRUE;
X		   c_token++;
X	    }
X	} 
X	else if (almost_equals(c_token,"noau$toscale")) {
X	    c_token++;
X	    if (END_OF_COMMAND) {
X		   autoscale_x = autoscale_y = FALSE;
X	    } else if (equals(c_token, "xy") || equals(c_token, "yx")) {
X		   autoscale_x = autoscale_y = FALSE;
X		   c_token++;
X	    } else if (equals(c_token, "x")) {
X		   autoscale_x = FALSE;
X		   c_token++;
X	    } else if (equals(c_token, "y")) {
X		   autoscale_y = FALSE;
X		   c_token++;
X	    }
X	} 
X	else if (almost_equals(c_token,"c$lip")) {
X	    c_token++;
X	    if (END_OF_COMMAND)
X		 /* assuming same as points */
X		 clip_points = TRUE;
X	    else if (almost_equals(c_token, "p$oints"))
X		 clip_points = TRUE;
X	    else if (almost_equals(c_token, "o$ne"))
X		 clip_lines1 = TRUE;
X	    else if (almost_equals(c_token, "t$wo"))
X		 clip_lines2 = TRUE;
X	    else
X		 int_error("expecting 'points', 'one', or 'two'", c_token);
X	    c_token++;
X	}
X	else if (almost_equals(c_token,"noc$lip")) {
X	    c_token++;
X	    if (END_OF_COMMAND) {
X		   /* same as all three */
X		   clip_points = FALSE;
X		   clip_lines1 = FALSE;
X		   clip_lines2 = FALSE;
X	    } else if (almost_equals(c_token, "p$oints"))
X		 clip_points = FALSE;
X	    else if (almost_equals(c_token, "o$ne"))
X		 clip_lines1 = FALSE;
X	    else if (almost_equals(c_token, "t$wo"))
X		 clip_lines2 = FALSE;
X	    else
X		 int_error("expecting 'points', 'one', or 'two'", c_token);
X	    c_token++;
X	}
X	else if (almost_equals(c_token,"d$ata")) {
X		c_token++;
X		if (!almost_equals(c_token,"s$tyle"))
X			int_error("expecting keyword 'style'",c_token);
X		data_style = get_style();
X	}
X	else if (almost_equals(c_token,"d$ummy")) {
X		c_token++;
X		copy_str(dummy_var,c_token++);
X	}
X	else if (almost_equals(c_token,"fo$rmat")) {
X		BOOLEAN setx, sety;
X		c_token++;
X		if (equals(c_token,"x")) {
X			setx = TRUE; sety = FALSE;
X			c_token++;
X		}
X		else if (equals(c_token,"y")) {
X			setx = FALSE; sety = TRUE;
X			c_token++;
X		}
X		else if (equals(c_token,"xy") || equals(c_token,"yx")) {
X			setx = sety = TRUE;
X			c_token++;
X		}
X		else if (isstring(c_token) || END_OF_COMMAND) {
X			/* Assume he wants both */
X			setx = sety = TRUE;
X		}
X		if (END_OF_COMMAND) {
X			if (setx)
X				(void) strcpy(xformat,DEF_FORMAT);
X			if (sety)
X				(void) strcpy(yformat,DEF_FORMAT);
X		}
X		else {
X			if (!isstring(c_token))
X			  int_error("expecting format string",c_token);
X			else {
X				if (setx)
X				 quote_str(xformat,c_token);
X				if (sety)
X				 quote_str(yformat,c_token);
X				c_token++;
X			}
X		}
X	}
X	else if (almost_equals(c_token,"fu$nction")) {
X		c_token++;
X		if (!almost_equals(c_token,"s$tyle"))
X			int_error("expecting keyword 'style'",c_token);
X		func_style = get_style();
X	}
X	else if (almost_equals(c_token,"la$bel")) {
X		c_token++;
X		set_label();
X	}
X	else if (almost_equals(c_token,"nola$bel")) {
X		c_token++;
X		set_nolabel();
X	}
X	else if (almost_equals(c_token,"lo$gscale")) {
X		c_token++;
X	    if (END_OF_COMMAND) {
X		   log_x = log_y = TRUE;
X	    } else if (equals(c_token, "xy") || equals(c_token, "yx")) {
X		   log_x = log_y = TRUE;
X		   c_token++;
X	    } else if (equals(c_token, "x")) {
X		   log_x = TRUE;
X		   c_token++;
X	    } else if (equals(c_token, "y")) {
X		   log_y = TRUE;
X		   c_token++;
X	    }
X	}
X	else if (almost_equals(c_token,"nolo$gscale")) {
X		c_token++;
X		if (END_OF_COMMAND) {
X		   log_x = log_y = FALSE;
X		} else if (equals(c_token, "xy") || equals(c_token, "yx")) {
X		   log_x = log_y = FALSE;
X		   c_token++;
X		} else if (equals(c_token, "x")) {
X		   log_x = FALSE;
X		   c_token++;
X		} else if (equals(c_token, "y")) {
X		   log_y = FALSE;
X		   c_token++;
X		}
X	} 
X	else if (almost_equals(c_token,"of$fsets")) {
X		c_token++;
X		if (END_OF_COMMAND) {
X			loff = roff = toff = boff = 0.0;  /* Reset offsets */
X		}
X		else {
X			load_offsets (&loff,&roff,&toff,&boff);
X		}
X	}
X	else if (almost_equals(c_token,"o$utput")) {
X		register FILE *f;
X
X		c_token++;
X		if (term && term_init)
X			(*term_tbl[term].reset)();
X		if (END_OF_COMMAND) {	/* no file specified */
X 			UP_redirect (4);
X			if (outfile != stdout) /* Never close stdout */
X				(void) fclose(outfile);
X			outfile = stdout; /* Don't dup... */
X			term_init = FALSE;
X			(void) strcpy(outstr,"STDOUT");
X		} else if (!isstring(c_token))
X			int_error("expecting filename",c_token);
X		else {
X			quote_str(testfile,c_token);
X			if ((f = fopen(testfile,"w")) == (FILE *)NULL) {
X			  os_error("cannot open file; output not changed",c_token);
X			}
X			if (outfile != stdout) /* Never close stdout */
X				(void) fclose(outfile);
X			outfile = f;
X			term_init = FALSE;
X			outstr[0] = '\'';
X			(void) strcat(strcpy(outstr+1,testfile),"'");
X 			UP_redirect (1);
X		}
X		c_token++;
X	}
X	else if (almost_equals(c_token,"tit$le")) {
X		c_token++;
X		if (END_OF_COMMAND) {	/* no label specified */
X			title[0] = '\0';
X		} else {
X		quotel_str(title,c_token);
X		c_token++;
X		}
X	} 
X	else if (almost_equals(c_token,"xl$abel")) {
X		c_token++;
X		if (END_OF_COMMAND) {	/* no label specified */
X			xlabel[0] = '\0';
X		} else {
X		quotel_str(xlabel,c_token);
X		c_token++;
X		}
X	} 
X	else if (almost_equals(c_token,"yl$abel")) {
X		c_token++;
X		if (END_OF_COMMAND) {	/* no label specified */
X			ylabel[0] = '\0';
X		} else {
X		quotel_str(ylabel,c_token);
X		c_token++;
X		}
X	} 
X	else if (almost_equals(c_token,"pol$ar")) {
X	    if (!polar) {
X		   polar = TRUE;
X		   xmin = 0.0;
X		   xmax = 2*Pi;
X	    }
X	    c_token++;
X	}
X	else if (almost_equals(c_token,"nopo$lar")) {
X	    if (polar) {
X		   polar = FALSE;
X		   xmin = -10.0;
X		   xmax = 10.0;
X	    }
X	    c_token++;
X	}
X	else if (almost_equals(c_token,"g$rid")) {
X		grid = TRUE;
X		c_token++;
X	}
X	else if (almost_equals(c_token,"nog$rid")) {
X		grid = FALSE;
X		c_token++;
X	}
X	else if (almost_equals(c_token,"k$ey")) {
X		struct value a;
X		c_token++;
X		if (END_OF_COMMAND) {
X			key = -1;
X		} 
X		else {
X			key_x = real(const_express(&a));
X			if (!equals(c_token,","))
X				int_error("',' expected",c_token);
X			c_token++;
X			key_y = real(const_express(&a));
X			key = 1;
X		} 
X	}
X	else if (almost_equals(c_token,"nok$ey")) {
X		key = 0;
X		c_token++;
X	}
X	else if (almost_equals(c_token,"tic$s")) {
X		tic_in = TRUE;
X		c_token++;
X		if (almost_equals(c_token,"i$n")) {
X			tic_in = TRUE;
X			c_token++;
X		}
X		else if (almost_equals(c_token,"o$ut")) {
X			tic_in = FALSE;
X			c_token++;
X		}
X	}
X     else if (almost_equals(c_token,"xt$ics")) {
X	    xtics = TRUE;
X	    c_token++;
X	    if (END_OF_COMMAND) { /* reset to default */
X		   if (xticdef.type == TIC_USER) {
X			  free_marklist(xticdef.def.user);
X			  xticdef.def.user = NULL;
X		   }
X		   xticdef.type = TIC_COMPUTED;
X	    }
X	    else
X		 load_tics(&xticdef);
X	} 
X     else if (almost_equals(c_token,"noxt$ics")) {
X	    xtics = FALSE;
X	    c_token++;
X	} 
X     else if (almost_equals(c_token,"yt$ics")) {
X	    ytics = TRUE;
X	    c_token++;
X	    if (END_OF_COMMAND) { /* reset to default */
X		   if (yticdef.type == TIC_USER) {
X			  free_marklist(yticdef.def.user);
X			  yticdef.def.user = NULL;
X		   }
X		   yticdef.type = TIC_COMPUTED;
X	    }
X	    else
X		 load_tics(&yticdef);
X	} 
X     else if (almost_equals(c_token,"noyt$ics")) {
X	    ytics = FALSE;
X	    c_token++;
X	} 
X	else if (almost_equals(c_token,"sa$mples")) {
X		register int tsamp;
X		struct value a;
X
X		c_token++;
X		tsamp = (int)magnitude(const_express(&a));
X		if (tsamp < 1)
X			int_error("sampling rate must be > 0; sampling unchanged",
X				c_token);
X		else {
X		     extern struct curve_points *first_plot;
X			register struct curve_points *f_p = first_plot;
X
X			first_plot = NULL;
X			cp_free(f_p);
X			samples = tsamp;
X		}
X	}
X	else if (almost_equals(c_token,"si$ze")) {
X		struct value s;
X		c_token++;
X		if (END_OF_COMMAND) {
X			xsize = 1.0;
X			ysize = 1.0;
X		} 
X		else {
X				xsize=real(const_express(&s));
X				if (!equals(c_token,","))
X					int_error("',' expected",c_token);
X				c_token++;
X				ysize=real(const_express(&s));
X		} 
X	} 
X	else if (almost_equals(c_token,"t$erminal")) {
X		c_token++;
X		if (END_OF_COMMAND) {
X			list_terms();
X			screen_ok = FALSE;
X		}
X		else {
X			if (term && term_init) {
X				(*term_tbl[term].reset)();
X				(void) fflush(outfile);
X			}
X			term = set_term(c_token);
X			c_token++;
X		}
X	}
X	else if (almost_equals(c_token,"xr$ange")) {
X	     BOOLEAN changed;
X		c_token++;
X		if (!equals(c_token,"["))
X			int_error("expecting '['",c_token);
X		c_token++;
X		changed = load_range(&xmin,&xmax);
X		if (!equals(c_token,"]"))
X		  int_error("expecting ']'",c_token);
X		c_token++;
X		if (changed)
X		  autoscale_x = FALSE;
X	}
X	else if (almost_equals(c_token,"yr$ange")) {
X	     BOOLEAN changed;
X		c_token++;
X		if (!equals(c_token,"["))
X			int_error("expecting '['",c_token);
X		c_token++;
X		changed = load_range(&ymin,&ymax);
X		if (!equals(c_token,"]"))
X		  int_error("expecting ']'",c_token);
X		c_token++;
X		if (changed)
X		  autoscale_y = FALSE;
X	}
X	else if (almost_equals(c_token,"z$ero")) {
X		struct value a;
X		c_token++;
X		zero = magnitude(const_express(&a));
X	}
X	else
X		int_error(
X	"valid set options:  '{no}arrow', {no}autoscale', '{no}clip', data', \n\
X	'dummy', 'format', 'function', '{no}grid', '{no}key', '{no}label', \n\
X	'{no}logscale','offsets', 'output', '{no}polar', 'samples', \n\
X	'size', 'terminal', 'tics', 'title', 'xlabel', 'xrange', 'xtics', \n\
X	'ylabel', 'yrange', 'ytics', 'zero',\n",
X	c_token);
X}
X
X/*********** Support functions for set_command ***********/
X
X/* process a 'set label' command */
X/* set label {tag} {label_text} {at x,y} {pos} */
Xstatic void
Xset_label()
X{
X    struct value a;
X    struct text_label *this_label = NULL;
X    struct text_label *new_label = NULL;
X    struct text_label *prev_label = NULL;
X    double x, y;
X    char text[MAX_LINE_LEN+1];
X    enum JUSTIFY just;
X    int tag;
X    BOOLEAN set_text, set_position, set_just;
X
X    /* get tag */
X    if (!END_OF_COMMAND 
X	   && !isstring(c_token) 
X	   && !equals(c_token, "at")
X	   && !equals(c_token, "left")
X	   && !equals(c_token, "center")
X	   && !equals(c_token, "centre")
X	   && !equals(c_token, "right")) {
X	   /* must be a tag expression! */
X	   tag = (int)real(const_express(&a));
X	   if (tag <= 0)
X		int_error("tag must be > zero", c_token);
X    } else
X	 tag = assign_label_tag(); /* default next tag */
X	 
X    /* get text */
X    if (!END_OF_COMMAND && isstring(c_token)) {
X	   /* get text */
X	   quotel_str(text, c_token);
X	   c_token++;
X	   set_text = TRUE;
X    } else {
X	   text[0] = '\0';		/* default no text */
X	   set_text = FALSE;
X    }
X	 
X    /* get justification - what the heck, let him put it here */
X    if (!END_OF_COMMAND && !equals(c_token, "at")) {
X	   if (almost_equals(c_token,"l$eft")) {
X		  just = LEFT;
X	   }
X	   else if (almost_equals(c_token,"c$entre")
X			  || almost_equals(c_token,"c$enter")) {
X		  just = CENTRE;
X	   }
X	   else if (almost_equals(c_token,"r$ight")) {
X		  just = RIGHT;
X	   }
X	   else
X		int_error("bad syntax in set label", c_token);
X	   c_token++;
X	   set_just = TRUE;
X    } else {
X	   just = LEFT;			/* default left justified */
X	   set_just = FALSE;
X    } 
X
X    /* get position */
X    if (!END_OF_COMMAND && equals(c_token, "at")) {
X	   c_token++;
X	   if (END_OF_COMMAND)
X		int_error("coordinates expected", c_token);
X	   /* get coordinates */
X	   x = real(const_express(&a));
X	   if (!equals(c_token,","))
X		int_error("',' expected",c_token);
X	   c_token++;
X	   y = real(const_express(&a));
X	   set_position = TRUE;
X    } else {
X	   x = y = 0;			/* default at origin */
X	   set_position = FALSE;
X    }
X
X    /* get justification */
X    if (!END_OF_COMMAND) {
X	   if (set_just)
X		int_error("only one justification is allowed", c_token);
X	   if (almost_equals(c_token,"l$eft")) {
X		  just = LEFT;
X	   }
X	   else if (almost_equals(c_token,"c$entre")
X			  || almost_equals(c_token,"c$enter")) {
X		  just = CENTRE;
X	   }
X	   else if (almost_equals(c_token,"r$ight")) {
X		  just = RIGHT;
X	   }
X	   else
X		int_error("bad syntax in set label", c_token);
X	   c_token++;
X	   set_just = TRUE;
X    } 
X
X    if (!END_OF_COMMAND)
X	 int_error("extraneous or out-of-order arguments in set label", c_token);
X
X    /* OK! add label */
X    if (first_label != NULL) { /* skip to last label */
X	   for (this_label = first_label; this_label != NULL ; 
X		   prev_label = this_label, this_label = this_label->next)
X		/* is this the label we want? */
X		if (tag <= this_label->tag)
X		  break;
X    }
X    if (this_label != NULL && tag == this_label->tag) {
X	   /* changing the label */
X	   if (set_position) {
X		  this_label->x = x;
X		  this_label->y = y;
X	   }
X	   if (set_text)
X		(void) strcpy(this_label->text, text);
X	   if (set_just)
X		this_label->pos = just;
X    } else {
X	   /* adding the label */
X	   new_label = (struct text_label *) 
X		alloc ( (unsigned int) sizeof(struct text_label), "label");
X	   if (prev_label != NULL)
X		prev_label->next = new_label; /* add it to end of list */
X	   else 
X		first_label = new_label; /* make it start of list */
X	   new_label->tag = tag;
X	   new_label->next = this_label;
X	   new_label->x = x;
X	   new_label->y = y;
X	   (void) strcpy(new_label->text, text);
X	   new_label->pos = just;
X    }
X}
X
X/* process 'set nolabel' command */
X/* set nolabel {tag} */
Xstatic void
Xset_nolabel()
X{
X    struct value a;
X    struct text_label *this_label;
X    struct text_label *prev_label; 
X    int tag;
X
X    if (END_OF_COMMAND) {
X	   /* delete all labels */
X	   while (first_label != NULL)
X		delete_label((struct text_label *)NULL,first_label);
X    }
X    else {
X	   /* get tag */
X	   tag = (int)real(const_express(&a));
X	   if (!END_OF_COMMAND)
X		int_error("extraneous arguments to set nolabel", c_token);
X	   for (this_label = first_label, prev_label = NULL;
X		   this_label != NULL;
X		   prev_label = this_label, this_label = this_label->next) {
X		  if (this_label->tag == tag) {
X			 delete_label(prev_label,this_label);
X			 return;		/* exit, our job is done */
X		  }
X	   }
X	   int_error("label not found", c_token);
X    }
X}
X
X/* assign a new label tag */
X/* labels are kept sorted by tag number, so this is easy */
Xstatic int				/* the lowest unassigned tag number */
Xassign_label_tag()
X{
X    struct text_label *this_label;
X    int last = 0;			/* previous tag value */
X
X    for (this_label = first_label; this_label != NULL;
X	    this_label = this_label->next)
X	 if (this_label->tag == last+1)
X	   last++;
X	 else
X	   break;
X    
X    return (last+1);
X}
X
X/* delete label from linked list started by first_label.
X * called with pointers to the previous label (prev) and the 
X * label to delete (this).
X * If there is no previous label (the label to delete is
X * first_label) then call with prev = NULL.
X */
Xstatic void
Xdelete_label(prev,this)
X	struct text_label *prev, *this;
X{
X    if (this!=NULL)	{		/* there really is something to delete */
X	   if (prev!=NULL)		/* there is a previous label */
X		prev->next = this->next; 
X	   else				/* this = first_label so change first_label */
X		first_label = this->next;
X	   free((char *)this);
X    }
X}
X
X
X/* process a 'set arrow' command */
X/* set arrow {tag} {from x,y} {to x,y} */
Xstatic void
Xset_arrow()
X{
X    struct value a;
X    struct arrow_def *this_arrow = NULL;
X    struct arrow_def *new_arrow = NULL;
X    struct arrow_def *prev_arrow = NULL;
X    double sx, sy;
X    double ex, ey;
X    int tag;
X    BOOLEAN set_start, set_end;
X
X    /* get tag */
X    if (!END_OF_COMMAND 
X	   && !equals(c_token, "from")
X	   && !equals(c_token, "to")) {
X	   /* must be a tag expression! */
X	   tag = (int)real(const_express(&a));
X	   if (tag <= 0)
X		int_error("tag must be > zero", c_token);
X    } else
X	 tag = assign_arrow_tag(); /* default next tag */
X	 
X    /* get start position */
X    if (!END_OF_COMMAND && equals(c_token, "from")) {
X	   c_token++;
X	   if (END_OF_COMMAND)
X		int_error("start coordinates expected", c_token);
X	   /* get coordinates */
X	   sx = real(const_express(&a));
X	   if (!equals(c_token,","))
X		int_error("',' expected",c_token);
X	   c_token++;
X	   sy = real(const_express(&a));
X	   set_start = TRUE;
X    } else {
X	   sx = sy = 0;			/* default at origin */
X	   set_start = FALSE;
X    }
X
X    /* get end position */
X    if (!END_OF_COMMAND && equals(c_token, "to")) {
X	   c_token++;
X	   if (END_OF_COMMAND)
X		int_error("end coordinates expected", c_token);
X	   /* get coordinates */
X	   ex = real(const_express(&a));
X	   if (!equals(c_token,","))
X		int_error("',' expected",c_token);
X	   c_token++;
X	   ey = real(const_express(&a));
X	   set_end = TRUE;
X    } else {
X	   ex = ey = 0;			/* default at origin */
X	   set_end = FALSE;
X    }
X
X    /* get start position - what the heck, either order is ok */
X    if (!END_OF_COMMAND && equals(c_token, "from")) {
X	   if (set_start)
X		int_error("only one 'from' is allowed", c_token);
X	   c_token++;
X	   if (END_OF_COMMAND)
X		int_error("start coordinates expected", c_token);
X	   /* get coordinates */
X	   sx = real(const_express(&a));
X	   if (!equals(c_token,","))
X		int_error("',' expected",c_token);
X	   c_token++;
X	   sy = real(const_express(&a));
X	   set_start = TRUE;
X    }
X
X    if (!END_OF_COMMAND)
X	 int_error("extraneous or out-of-order arguments in set arrow", c_token);
X
X    /* OK! add arrow */
X    if (first_arrow != NULL) { /* skip to last arrow */
X	   for (this_arrow = first_arrow; this_arrow != NULL ; 
X		   prev_arrow = this_arrow, this_arrow = this_arrow->next)
X		/* is this the arrow we want? */
X		if (tag <= this_arrow->tag)
X		  break;
X    }
X    if (this_arrow != NULL && tag == this_arrow->tag) {
X	   /* changing the arrow */
X	   if (set_start) {
X		  this_arrow->sx = sx;
X		  this_arrow->sy = sy;
X	   }
X	   if (set_end) {
X		  this_arrow->ex = ex;
X		  this_arrow->ey = ey;
X	   }
X    } else {
X	   /* adding the arrow */
X	   new_arrow = (struct arrow_def *) 
X		alloc ( (unsigned int) sizeof(struct arrow_def), "arrow");
X	   if (prev_arrow != NULL)
X		prev_arrow->next = new_arrow; /* add it to end of list */
X	   else 
X		first_arrow = new_arrow; /* make it start of list */
X	   new_arrow->tag = tag;
X	   new_arrow->next = this_arrow;
X	   new_arrow->sx = sx;
X	   new_arrow->sy = sy;
X	   new_arrow->ex = ex;
X	   new_arrow->ey = ey;
X    }
X}
X
X/* process 'set noarrow' command */
X/* set noarrow {tag} */
Xstatic void
Xset_noarrow()
X{
X    struct value a;
X    struct arrow_def *this_arrow;
X    struct arrow_def *prev_arrow; 
X    int tag;
X
X    if (END_OF_COMMAND) {
X	   /* delete all arrows */
X	   while (first_arrow != NULL)
X		delete_arrow((struct arrow_def *)NULL,first_arrow);
X    }
X    else {
X	   /* get tag */
X	   tag = (int)real(const_express(&a));
X	   if (!END_OF_COMMAND)
X		int_error("extraneous arguments to set noarrow", c_token);
X	   for (this_arrow = first_arrow, prev_arrow = NULL;
X		   this_arrow != NULL;
X		   prev_arrow = this_arrow, this_arrow = this_arrow->next) {
X		  if (this_arrow->tag == tag) {
X			 delete_arrow(prev_arrow,this_arrow);
X			 return;		/* exit, our job is done */
X		  }
X	   }
X	   int_error("arrow not found", c_token);
X    }
X}
X
X/* assign a new arrow tag */
X/* arrows are kept sorted by tag number, so this is easy */
Xstatic int				/* the lowest unassigned tag number */
Xassign_arrow_tag()
X{
X    struct arrow_def *this_arrow;
X    int last = 0;			/* previous tag value */
X
X    for (this_arrow = first_arrow; this_arrow != NULL;
X	    this_arrow = this_arrow->next)
X	 if (this_arrow->tag == last+1)
X	   last++;
X	 else
X	   break;
X
X    return (last+1);
X}
X
X/* delete arrow from linked list started by first_arrow.
X * called with pointers to the previous arrow (prev) and the 
X * arrow to delete (this).
X * If there is no previous arrow (the arrow to delete is
X * first_arrow) then call with prev = NULL.
X */
Xstatic void
Xdelete_arrow(prev,this)
X	struct arrow_def *prev, *this;
X{
X    if (this!=NULL)	{		/* there really is something to delete */
X	   if (prev!=NULL)		/* there is a previous arrow */
X		prev->next = this->next; 
X	   else				/* this = first_arrow so change first_arrow */
X		first_arrow = this->next;
X	   free((char *)this);
X    }
X}
X
X
Xenum PLOT_STYLE			/* not static; used by command.c */
Xget_style()
X{
Xregister enum PLOT_STYLE ps;
X
X	c_token++;
X	if (almost_equals(c_token,"l$ines"))
X		ps = LINES;
X	else if (almost_equals(c_token,"i$mpulses"))
X		ps = IMPULSES;
X	else if (almost_equals(c_token,"p$oints"))
X		ps = POINTS;
X	else if (almost_equals(c_token,"linesp$oints"))
X		ps = LINESPOINTS;
X	else if (almost_equals(c_token,"d$ots"))
X		ps = DOTS;
X	else
X		int_error("expecting 'lines', 'points', 'linespoints', 'dots', or 'impulses'",c_token);
X	c_token++;
X	return(ps);
X}
X
X/* For set [xy]tics... command*/
Xstatic void
Xload_tics(tdef)
X	struct ticdef *tdef;	/* change this ticdef */
X{
X    if (equals(c_token,"(")) { /* set : TIC_USER */
X	   c_token++;
X	   load_tic_user(tdef);
X    } else {				/* series : TIC_SERIES */
X	   load_tic_series(tdef);
X    }
X}
X
X/* load TIC_USER definition */
X/* (tic[,tic]...)
X * where tic is ["string"] value
X * Left paren is already scanned off before entry.
X */
Xstatic void
Xload_tic_user(tdef)
X	struct ticdef *tdef;
X{
X    struct ticmark *list = NULL; /* start of list */
X    struct ticmark *last = NULL; /* end of list */
X    struct ticmark *tic = NULL; /* new ticmark */
X    char temp_string[MAX_LINE_LEN];
X    struct value a;
X
X    while (!END_OF_COMMAND) {
X	   /* parse a new ticmark */
X	   tic = (struct ticmark *)alloc(sizeof(struct ticmark), (char *)NULL);
X	   if (tic == (struct ticmark *)NULL) {
X		  free_marklist(list);
X		  int_error("out of memory for tic mark", c_token);
X	   }
X
X	   /* has a string with it? */
X	   if (isstring(c_token)) {
X		  quote_str(temp_string,c_token);
X		  tic->label = alloc((unsigned int)strlen(temp_string)+1, "tic label");
X		  (void) strcpy(tic->label, temp_string);
X		  c_token++;
X	   } else
X		tic->label = NULL;
X
X	   /* in any case get the value */
X	   tic->position = real(const_express(&a));
X	   tic->next = NULL;
X
X	   /* append to list */
X	   if (list == NULL)
X		last = list = tic;	/* new list */
X	   else {				/* append to list */
X		  last->next = tic;
X		  last = tic;
X	   }
X
X	   /* expect "," or ")" here */
X	   if (!END_OF_COMMAND && equals(c_token, ","))
X		c_token++;		/* loop again */
X	   else
X		break;			/* hopefully ")" */
X    }
X    
X    if (END_OF_COMMAND || !equals(c_token, ")")) {
X	   free_marklist(list);
X	   int_error("expecting right parenthesis )", c_token);
X    }
X    c_token++;
X    
X    /* successful list */
X    if (tdef->type == TIC_USER) {
X	   /* remove old list */
X		/* VAX Optimiser was stuffing up following line. Turn Optimiser OFF */
X	   free_marklist(tdef->def.user);
X	   tdef->def.user = NULL;
X    }
X    tdef->type = TIC_USER;
X    tdef->def.user = list;
X}
X
Xstatic void
Xfree_marklist(list)
X	struct ticmark *list;
X{
X    register struct ticmark *freeable;
X
X    while (list != NULL) {
X	   freeable = list;
X	   list = list->next;
X	   if (freeable->label != NULL)
X		free( (char *)freeable->label );
X	   free( (char *)freeable );
X    }
X}
X
X/* load TIC_SERIES definition */
X/* start,incr[,end] */
Xstatic void
Xload_tic_series(tdef)
X	struct ticdef *tdef;
X{
X    double start, incr, end;
X    struct value a;
X    int incr_token;
X
X    start = real(const_express(&a));
X    if (!equals(c_token, ","))
X	 int_error("expecting comma to separate start,incr", c_token);
X    c_token++;
X
X    incr_token = c_token;
X    incr = real(const_express(&a));
X
X    if (END_OF_COMMAND)
X	 end = VERYLARGE;
X    else {
X	   if (!equals(c_token, ","))
X		int_error("expecting comma to separate incr,end", c_token);
X	   c_token++;
X
X	   end = real(const_express(&a));
X    }
X    if (!END_OF_COMMAND)
X	 int_error("tic series is defined by start,increment[,end]", 
X			 c_token);
X    
X    if (start < end && incr <= 0)
X	 int_error("increment must be positive", incr_token);
X    if (start > end && incr >= 0)
X	 int_error("increment must be negative", incr_token);
X    if (start > end) {
X	   /* put in order */
X		double numtics;
X		numtics = floor( (end*(1+SIGNIF) - start)/incr );
X		end = start;
X		start = end + numtics*incr;
X		incr = -incr;
X/*
X	   double temp = start;
X	   start = end;
X	   end = temp;
X	   incr = -incr;
X */
X    }
X
X    if (tdef->type == TIC_USER) {
X	   /* remove old list */
X		/* VAX Optimiser was stuffing up following line. Turn Optimiser OFF */
X	   free_marklist(tdef->def.user);
X	   tdef->def.user = NULL;
X    }
X    tdef->type = TIC_SERIES;
X    tdef->def.series.start = start;
X    tdef->def.series.incr = incr;
X    tdef->def.series.end = end;
X}
X
Xstatic void
Xload_offsets (a, b, c, d)
Xdouble *a,*b, *c, *d;
X{
Xstruct value t;
X
X	*a = real (const_express(&t));  /* loff value */
X	c_token++;
X	if (equals(c_token,","))
X		c_token++;
X	if (END_OF_COMMAND) 
X	    return;
X
X	*b = real (const_express(&t));  /* roff value */
X	c_token++;
X	if (equals(c_token,","))
X		c_token++;
X	if (END_OF_COMMAND) 
X	    return;
X
X	*c = real (const_express(&t));  /* toff value */
X	c_token++;
X	if (equals(c_token,","))
X		c_token++;
X	if (END_OF_COMMAND) 
X	    return;
X
X	*d = real (const_express(&t));  /* boff value */
X	c_token++;
X}
X
X
XBOOLEAN					/* TRUE if a or b were changed */
Xload_range(a,b)			/* also used by command.c */
Xdouble *a,*b;
X{
Xstruct value t;
XBOOLEAN changed = FALSE;
X
X	if (equals(c_token,"]"))
X		return(FALSE);
X	if (END_OF_COMMAND) {
X	    int_error("starting range value or ':' or 'to' expected",c_token);
X	} else if (!equals(c_token,"to") && !equals(c_token,":"))  {
X		*a = real(const_express(&t));
X		changed = TRUE;
X	}	
X	if (!equals(c_token,"to") && !equals(c_token,":"))
X		int_error("':' or keyword 'to' expected",c_token);
X	c_token++;
X	if (!equals(c_token,"]")) {
X		*b = real(const_express(&t));
X		changed = TRUE;
X	 }
X     return(changed);
X}
X
X
X
X/******* The 'show' command *******/
Xvoid
Xshow_command()
X{
X    c_token++;
X
X	if (almost_equals(c_token,"ac$tion_table") ||
X			 equals(c_token,"at") ) {
X		c_token++; 
X		show_at();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"ar$row")) {
X	    struct value a;
X	    int tag = 0;
X
X	    c_token++;
X	    if (!END_OF_COMMAND) {
X		   tag = (int)real(const_express(&a));
X		   if (tag <= 0)
X			int_error("tag must be > zero", c_token);
X	    }
X
X	    (void) putc('\n',stderr);
X	    show_arrow(tag);
X	}
X	else if (almost_equals(c_token,"au$toscale")) {
X		(void) putc('\n',stderr);
X		show_autoscale();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"c$lip")) {
X		(void) putc('\n',stderr);
X		show_clip();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"d$ata")) {
X		c_token++;
X		if (!almost_equals(c_token,"s$tyle"))
X			int_error("expecting keyword 'style'",c_token);
X		(void) putc('\n',stderr);
X		show_style("data",data_style);
X		c_token++;
X	}
X	else if (almost_equals(c_token,"d$ummy")) {
X		(void) fprintf(stderr,"\n\tdummy variable is %s\n",dummy_var);
X		c_token++;
X	}
X	else if (almost_equals(c_token,"fo$rmat")) {
X		show_format();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"f$unctions")) {
X		c_token++;
X		if (almost_equals(c_token,"s$tyle"))  {
X			(void) putc('\n',stderr);
X			show_style("functions",func_style);
X			c_token++;
X		}
X		else
X			show_functions();
X	}
X	else if (almost_equals(c_token,"lo$gscale")) {
X		(void) putc('\n',stderr);
X		show_logscale();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"of$fsets")) {
X		(void) putc('\n',stderr);
X		show_offsets();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"o$utput")) {
X		(void) putc('\n',stderr);
X		show_output();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"tit$le")) {
X		(void) putc('\n',stderr);
X		show_title();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"xl$abel")) {
X		(void) putc('\n',stderr);
X		show_xlabel();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"yl$abel")) {
X		(void) putc('\n',stderr);
X		show_ylabel();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"la$bel")) {
X	    struct value a;
X	    int tag = 0;
X
X	    c_token++;
X	    if (!END_OF_COMMAND) {
X		   tag = (int)real(const_express(&a));
X		   if (tag <= 0)
X			int_error("tag must be > zero", c_token);
X	    }
X
X	    (void) putc('\n',stderr);
X	    show_label(tag);
X	}
X	else if (almost_equals(c_token,"g$rid")) {
X		(void) putc('\n',stderr);
X		show_grid();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"k$ey")) {
X		(void) putc('\n',stderr);
X		show_key();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"p$lot")) {
X		(void) putc('\n',stderr);
X		show_plot();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"pol$ar")) {
X		(void) putc('\n',stderr);
X		show_polar();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"ti$cs")) {
X		(void) putc('\n',stderr);
X		show_tics(TRUE, TRUE);
X		c_token++;
X	}
X	else if (almost_equals(c_token,"xti$cs")) {
X	    show_tics(TRUE, FALSE);
X	    c_token++;
X	}
X	else if (almost_equals(c_token,"yti$cs")) {
X	    show_tics(FALSE, TRUE);
X	    c_token++;
X	}
X	else if (almost_equals(c_token,"sa$mples")) {
X		(void) putc('\n',stderr);
X		show_samples();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"si$ze")) {
X		(void) putc('\n',stderr);
X		show_size();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"t$erminal")) {
X		(void) putc('\n',stderr);
X		show_term();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"v$ariables")) {
X		show_variables();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"ve$rsion")) {
X		show_version();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"xr$ange")) {
X		(void) putc('\n',stderr);
X		show_range('x',xmin,xmax);
X		c_token++;
X	}
X	else if (almost_equals(c_token,"yr$ange")) {
X		(void) putc('\n',stderr);
X		show_range('y',ymin,ymax);
X		c_token++;
X	}
X	else if (almost_equals(c_token,"z$ero")) {
X		(void) putc('\n',stderr);
X		show_zero();
X		c_token++;
X	}
X	else if (almost_equals(c_token,"a$ll")) {
X		c_token++;
X		show_version();
X		show_autoscale();
X		show_clip();
X		(void) fprintf(stderr,"\tdummy variable is %s\n",dummy_var);
X		show_format();
X		show_style("data",data_style);
X		show_style("functions",func_style);
X		show_grid();
X		show_label(0);
X		show_arrow(0);
X		show_key();
X		show_logscale();
X		show_offsets();
X		show_output();
X		show_polar();
X		show_samples();
X		show_size();
X		show_term();
X		show_tics(TRUE,TRUE);
X		show_range('x',xmin,xmax);
X		show_range('y',ymin,ymax);
X		show_title();
X		show_xlabel();
X		show_ylabel();
X		show_zero();
X		show_plot();
X		show_variables();
X		show_functions();
X		c_token++;
X	}
X	else
X		int_error(
X	"valid show options:  'action_table', 'all', 'arrow', 'autoscale',  \n\
X	'clip', 'data', 'dummy', 'format', 'function', 'grid', 'key', 'label', \n\
X	'logscale', 'offsets', 'output', 'plot', 'polar', 'samples', \n\
X	'size', 'terminal', 'tics', 'title', 'variables', 'version', \n\
X	'xlabel', 'xrange', 'xtics', 'ylabel', 'yrange', 'ytics', 'zero'", c_token);
X	screen_ok = FALSE;
X	(void) putc('\n',stderr);
X}
X
X
X/*********** support functions for 'show'  **********/
Xstatic void
Xshow_style(name,style)
Xchar name[];
Xenum PLOT_STYLE style;
X{
X	fprintf(stderr,"\t%s are plotted with ",name);
X	switch (style) {
X		case LINES: fprintf(stderr,"lines\n"); break;
X		case POINTS: fprintf(stderr,"points\n"); break;
X		case IMPULSES: fprintf(stderr,"impulses\n"); break;
X		case LINESPOINTS: fprintf(stderr,"linespoints\n"); break;
X		case DOTS: fprintf(stderr,"dots\n"); break;
X	}
X}
X
Xstatic void
Xshow_range(name,min,max)
Xchar name;
Xdouble min,max;
X{
X	fprintf(stderr,"\t%crange is [%g : %g]\n",name,min,max);
X}
X
Xstatic void
Xshow_zero()
X{
X	fprintf(stderr,"\tzero is %g\n",zero);
X}
X
Xstatic void
Xshow_offsets()
X{
X	fprintf(stderr,"\toffsets are %g, %g, %g, %g\n",loff,roff,toff,boff);
X}
X
Xstatic void
Xshow_output()
X{
X	fprintf(stderr,"\toutput is sent to %s\n",outstr);
X}
X
Xstatic void
Xshow_samples()
X{
X	fprintf(stderr,"\tsampling rate is %d\n",samples);
X}
X
Xstatic void
Xshow_size()
X{
X	fprintf(stderr,"\tsize is scaled by %g,%g\n",xsize,ysize);
X}
X
Xstatic void
Xshow_title()
X{
X	fprintf(stderr,"\ttitle is \"%s\"\n",title);
X}
X
Xstatic void
Xshow_xlabel()
X{
X	fprintf(stderr,"\txlabel is \"%s\"\n",xlabel);
X}
X
Xstatic void
Xshow_ylabel()
X{
X	fprintf(stderr,"\tylabel is \"%s\"\n",ylabel);
X}
X
Xstatic void
Xshow_label(tag)
X    int tag;				/* 0 means show all */
X{
X    struct text_label *this_label;
X    BOOLEAN showed = FALSE;
X
X    for (this_label = first_label; this_label != NULL;
X	    this_label = this_label->next) {
X	   if (tag == 0 || tag == this_label->tag) {
X		  showed = TRUE;
X		  fprintf(stderr,"\tlabel %d \"%s\" at %g,%g ",
X				this_label->tag, this_label->text, 
X				this_label->x, this_label->y);
X		  switch(this_label->pos) {
X			 case LEFT : {
X				fprintf(stderr,"left");
X				break;
X			 }
X			 case CENTRE : {
X				fprintf(stderr,"centre");
X				break;
X			 }
X			 case RIGHT : {
X				fprintf(stderr,"right");
X				break;
X			 }
X		  }
X		  fputc('\n',stderr);
X	   }
X    }
X    if (tag > 0 && !showed)
X	 int_error("label not found", c_token);
X}
X
Xstatic void
Xshow_arrow(tag)
X    int tag;				/* 0 means show all */
X{
X    struct arrow_def *this_arrow;
X    BOOLEAN showed = FALSE;
X
X    for (this_arrow = first_arrow; this_arrow != NULL;
X	    this_arrow = this_arrow->next) {
X	   if (tag == 0 || tag == this_arrow->tag) {
X		  showed = TRUE;
X		  fprintf(stderr,"\tarrow %d from %g,%g to %g,%g\n",
X				this_arrow->tag, 
X				this_arrow->sx, this_arrow->sy,
X				this_arrow->ex, this_arrow->ey);
X	   }
X    }
X    if (tag > 0 && !showed)
X	 int_error("arrow not found", c_token);
X}
X
Xstatic void
Xshow_grid()
X{
X	fprintf(stderr,"\tgrid is %s\n",(grid)? "ON" : "OFF");
X}
X
Xstatic void
Xshow_key()
X{
X	switch (key) {
X		case -1 : 
X			fprintf(stderr,"\tkey is ON\n");
X			break;
X		case 0 :
X			fprintf(stderr,"\tkey is OFF\n");
X			break;
X		case 1 :
X			fprintf(stderr,"\tkey is at %g,%g\n",key_x,key_y);
X			break;
X	}
X}
X
Xstatic void
Xshow_polar()
X{
X	fprintf(stderr,"\tpolar is %s\n",(polar)? "ON" : "OFF");
X}
X
Xstatic void
Xshow_tics(showx, showy)
X	BOOLEAN showx, showy;
X{
X    fprintf(stderr,"\ttics are %s\n",(tic_in)? "IN" : "OUT");
X
X    if (showx)
X	 show_ticdef(xtics, 'x', &xticdef);
X    if (showy)
X	 show_ticdef(ytics, 'y', &yticdef);
X    screen_ok = FALSE;
X}
X
X/* called by show_tics */
Xstatic void
Xshow_ticdef(tics, axis, tdef)
X	BOOLEAN tics;			/* xtics or ytics */
X	char axis;			/* 'x' or 'y' */
X	struct ticdef *tdef;	/* xticdef or yticdef */
X{
X    register struct ticmark *t;
X
X    fprintf(stderr, "\t%c-axis tic labelling is ", axis);
X    if (!tics) {
X	   fprintf(stderr, "OFF\n");
X	   return;
X    }
X
X    switch(tdef->type) {
X	   case TIC_COMPUTED: {
X		  fprintf(stderr, "computed automatically\n");
X		  break;
X	   }
X	   case TIC_SERIES: {
X		  if (tdef->def.series.end == VERYLARGE)
X		    fprintf(stderr, "series from %g by %g\n", 
X				  tdef->def.series.start, tdef->def.series.incr);
X		  else
X		    fprintf(stderr, "series from %g by %g until %g\n", 
X				  tdef->def.series.start, tdef->def.series.incr, 
X				  tdef->def.series.end);
X		  break;
X	   }
X	   case TIC_USER: {
X		  fprintf(stderr, "list (");
X		  for (t = tdef->def.user; t != NULL; t=t->next) {
X			 if (t->label)
X			   fprintf(stderr, "\"%s\" ", t->label);
X			 if (t->next)
X			   fprintf(stderr, "%g, ", t->position);
X			 else
X			   fprintf(stderr, "%g", t->position);
X		  }
X		  fprintf(stderr, ")\n");
X		  break;
X	   }
X	   default: {
X		  int_error("unknown ticdef type in show_ticdef()", NO_CARET);
X		  /* NOTREACHED */
X	   }
X    }
X}
X
Xstatic void
Xshow_term()
X{
X	fprintf(stderr,"\tterminal type is %s\n",term_tbl[term].name);
X}
X
Xstatic void
Xshow_plot()
X{
X	fprintf(stderr,"\tlast plot command was: %s\n",replot_line);
X}
X
Xstatic void
Xshow_autoscale()
X{
X	fprintf(stderr,"\tx autoscaling is %s\n",(autoscale_x)? "ON" : "OFF");
X	fprintf(stderr,"\ty autoscaling is %s\n",(autoscale_y)? "ON" : "OFF");
X}
X
Xstatic void
Xshow_clip()
X{
X	fprintf(stderr,"\tpoint clip is %s\n",(clip_points)? "ON" : "OFF");
X
X	if (clip_lines1)
X	  fprintf(stderr,
X         "\tdrawing and clipping lines between inrange and outrange points\n");
X	else
X	  fprintf(stderr,
X         "\tnot drawing lines between inrange and outrange points\n");
X
X	if (clip_lines2)
X	  fprintf(stderr,
X         "\tdrawing and clipping lines between two outrange points\n");
X	else
X	  fprintf(stderr,
X         "\tnot drawing lines between two outrange points\n");
X}
X
Xstatic void
Xshow_format()
X{
X	fprintf(stderr, "\tx-axis tic format is \"%s\"\n", xformat);
X	fprintf(stderr, "\ty-axis tic format is \"%s\"\n", yformat);
X}
X
Xstatic void
Xshow_logscale()
X{
X	if (log_x && log_y)
X		fprintf(stderr,"\tlogscaling both x and y axes\n");
X	else if (log_x)
X		fprintf(stderr,"\tlogscaling x axis\n");
X	else if (log_y)
X		fprintf(stderr,"\tlogscaling y axis\n");
X	else
X		fprintf(stderr,"\tno logscaling\n");
X}
X
Xstatic void
Xshow_variables()
X{
Xregister struct udvt_entry *udv = first_udv;
Xint len;
X
X	fprintf(stderr,"\n\tVariables:\n");
X	while (udv) {
X	     len = instring(udv->udv_name, ' ');
X		fprintf(stderr,"\t%-*s ",len,udv->udv_name);
X		if (udv->udv_undef)
X			fputs("is undefined\n",stderr);
X		else {
X			fputs("= ",stderr);
X			disp_value(stderr,&(udv->udv_value));
X			(void) putc('\n',stderr);
X		}
X		udv = udv->next_udv;
X	}
X}
X
Xvoid				/* used by plot.c */
Xshow_version()
X{
Xextern char version[];
Xextern char patchlevel[];
Xextern char date[];
Xextern char bug_email[];
Xstatic char *authors[] = {"Thomas Williams","Colin Kelley"}; /* primary */
Xint x;
Xlong time();
X
X	x = time((long *)NULL) & 1;
X	fprintf(stderr,"\n\t%s\n\t%sversion %s\n",
X		PROGRAM, OS, version); 
X	fprintf(stderr,"\tpatchlevel %s\n",patchlevel);
X     fprintf(stderr, "\tlast modified %s\n", date);
X	fprintf(stderr,"\tCopyright (C) 1986, 1987, 1990  %s, %s\n",
X		authors[x],authors[1-x]);
X#ifdef __TURBOC__
X	fprintf(stderr,"\tCreated using Turbo C, Copyright Borland 1987, 1988\n");
X#endif
X    fprintf(stderr, "\n\tSend bugs and comments to %s\n", bug_email);
X}
END_OF_setshow.c
if test 41480 -ne `wc -c <setshow.c`; then
    echo shar: \"setshow.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test ! -d docs ; then
    echo shar: Creating directory \"docs\"
    mkdir docs
fi
if test -f docs/doc2tex.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"docs/doc2tex.c\"
else
echo shar: Extracting \"docs/doc2tex.c\" \(4694 characters\)
sed "s/^X//" >docs/doc2tex.c <<'END_OF_docs/doc2tex.c'
X/*
X * doc2tex.c  -- program to convert Gnuplot .DOC format to LaTeX document
X * Also will work for VMS .HLP files. 
X * Modified by Russell Lang from hlp2ms.c by Thomas Williams 
X * Extended by David Kotz to support quotes ("), backquotes, tables.
X *
X * usage:  doc2tex < file.doc > file.tex
X *
X *   where file.doc is a Gnuplot .DOC file, and file.tex will be an
X *     article document suitable for printing with LaTeX.
X *
X * typical usage for GNUPLOT:
X *
X *   doc2tex < gnuplot.doc > gnuplot.tex 
X *   latex gnuplot.tex ; latex gnuplot.tex
X */
X
Xstatic char rcsid[] = "$Id: doc2tex.c,v 1.1 90/01/11 15:44:06 dfk Exp Locker: dfk $";
X
X#include <stdio.h>
X#include <ctype.h>
X
X#define MAX_NAME_LEN	256
X#define MAX_LINE_LEN	256
X#define TRUE 1
X#define FALSE 0
X
Xtypedef int boolean;
X
Xboolean intable = FALSE;
Xboolean verb = FALSE;
X
Xmain()
X{
X	init(stdout);
X	convert(stdin,stdout);
X	finish(stdout);
X	exit(0);
X}
X
X
Xinit(b)
XFILE *b;
X{
X	(void) fputs("\\input{titlepage.tex}\n",b);
X}
X
X
Xconvert(a,b)
X	FILE *a,*b;
X{
X    static char line[MAX_LINE_LEN];
X
X    while (fgets(line,MAX_LINE_LEN,a)) {
X	   process_line(line, b);
X    }
X}
X
Xprocess_line(line, b)
X	char *line;
X	FILE *b;
X{
X    switch(line[0]) {		/* control character */
X	   case '?': {			/* interactive help entry */
X		  break;			/* ignore */
X	   }
X	   case '@': {			/* start/end table */
X		  if (intable) {
X			 (void) fputs("\\hline\n\\end{tabular}\n", b);
X			 (void) fputs("\\end{center}\n",b);
X			 intable = FALSE;
X		  } else {
X			 if (verb) {
X				(void) fputs("\\end{verbatim}\n",b);
X				verb=FALSE;
X			 } 
X			 (void) fputs("\n\\begin{center}\n", b);
X			 (void) fputs("\\begin{tabular}{|ccl|} \\hline\n", b);
X			 intable = TRUE;
X		  }
X		  /* ignore rest of line */
X		  break;
X	   }
X	   case '#': {			/* latex table entry */
X		  if (intable)
X		    (void) fputs(line+1, b); /* copy directly */
X		  else
X		    fprintf(stderr, "error: # line found outside of table\n");
X		  break;
X	   }
X	   case '%': {			/* troff table entry */
X		  break;			/* ignore */
X	   }
X	   case '\n':			/* empty text line */
X	   case ' ': {			/* normal text line */
X		  if (intable)
X		    break;		/* ignore while in table */
X		  if (line[1] == ' ') {
X			 /* verbatim mode */
X			 if (!verb) {
X				(void) fputs("\\begin{verbatim}\n",b);
X				verb=TRUE;
X			 }
X			 (void) fputs(line+1,b); 
X		  } else {
X			 if (verb) {
X				(void) fputs("\\end{verbatim}\n",b);
X				verb=FALSE;
X			 } 
X			 puttex(line+1,b);
X		  }
X		  break;
X	   }
X	   default: {
X		  if (isdigit(line[0])) { /* start of section */
X			 if (!intable)	/* ignore while in table */
X			   section(line, b);
X		  } else
X		    fprintf(stderr, "unknown control code '%c' in column 1\n", 
X				  line[0]);
X		  break;
X	   }
X    }
X}
X
X/* process a line with a digit control char */
X/* starts a new [sub]section */
X
Xsection(line, b)
X	char *line;
X	FILE *b;
X{
X    static char string[MAX_LINE_LEN];
X    int sh_i;
X
X    if (verb) {
X	   (void) fputs("\\end{verbatim}\n",b);
X	   verb=FALSE;
X    } 
X    (void) sscanf(line,"%d %[^\n]s",&sh_i,string);
X    switch(sh_i)
X	 {
X		case 1: 
X		(void) fprintf(b,"\\section{");
X		break;
X		case 2: 
X		(void) fprintf(b,"\\section{");
X		break;
X		case 3:
X		(void) fprintf(b,"\\subsection{");
X		break;
X		case 4: 
X		(void) fprintf(b,"\\subsubsection{");
X		break;
X		default:
X		case 5: 
X		(void) fprintf(b,"\\paragraph{");
X		break;
X	 }
X    if (islower(string[0]))
X	 string[0] = toupper(string[0]);
X    puttex(string,b);
X    (void) fprintf(b,"}\n");
X}
X
X/* put text in string str to file while buffering special TeX characters */
Xputtex(str,file)
XFILE *file;
Xregister char *str;
X{
Xregister char ch;
Xstatic boolean inquote = FALSE;
X
X	 while( (ch = *str++) != '\0') {
X		 switch(ch) {
X			 case '#':
X			 case '$':
X			 case '%':
X			 case '&':
X			 case '_':
X			 case '{':
X			 case '}':
X				 (void) fputc('\\',file);
X				 (void) fputc(ch,file);
X				 break;
X			 case '\\':
X				 (void) fputs("$\\backslash$",file);
X				 break;
X			 case '~':
X				 (void) fputs("\\~{\\ }",file);
X				 break;
X			 case '^':
X				 (void) fputs("\\verb+^+",file);
X				 break;
X			 case '>':
X			 case '<':
X			 case '|':
X				 (void) fputc('$',file);
X				 (void) fputc(ch,file);
X				 (void) fputc('$',file);
X				 break;
X			 case '"': 
X				 /* peek at next character: if space, end of quote */
X				 if (*str == NULL || isspace(*str) || ispunct(*str))
X				   (void) fputs("''", file);
X				 else
X				   (void) fputs("``", file);
X				 break;
X			 case '`':	/* backquotes mean boldface */
X				 if (inquote) {
X					fputs("}", file);
X					inquote = FALSE;
X				 } else {
X					fputs("{\\bf ", file);
X					inquote = TRUE;
X				 }
X				 break;
X			 default:
X				 (void) fputc(ch,file);
X				 break;
X		 }
X	 }
X}
X
X
Xfinish(b)
XFILE *b;
X{
X	(void) fputs("\\end{document}\n",b);
X}
END_OF_docs/doc2tex.c
if test 4694 -ne `wc -c <docs/doc2tex.c`; then
    echo shar: \"docs/doc2tex.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f docs/titlepage.ms -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"docs/titlepage.ms\"
else
echo shar: Extracting \"docs/titlepage.ms\" \(290 characters\)
sed "s/^X//" >docs/titlepage.ms <<'END_OF_docs/titlepage.ms'
X.nr HM 3.2i
X.TL
XGNUPLOT
X.br
XAn Interactive Plotting Program
X.sp
X.AU
XThomas Williams & Colin Kelley
X.br
XJohn Campbell, David Kotz, and Russell Lang (Version 2.0)
X.AI
Xpixar!info-gnuplot@sun.com
X\*(DY
X.br
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
XThis manual is for GNUPLOT version 2.0.
X.AB no
X.AE
X.LP
X.nr HM 1.2i
END_OF_docs/titlepage.ms
if test 290 -ne `wc -c <docs/titlepage.ms`; then
    echo shar: \"docs/titlepage.ms\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f docs/titlepage.tex -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"docs/titlepage.tex\"
else
echo shar: Extracting \"docs/titlepage.tex\" \(760 characters\)
sed "s/^X//" >docs/titlepage.tex <<'END_OF_docs/titlepage.tex'
X\documentstyle{article}
X\setlength{\textwidth}{6.25in}
X\setlength{\oddsidemargin}{0.5cm}
X\setlength{\topmargin}{-0.5in}
X\setlength{\textheight}{9in}
X\setlength{\parskip}{1ex}
X\setlength{\parindent}{0pt}
X\begin{document}
X
X\pagestyle{empty}
X   \rule{0in}{3in}
X   \begin{center}
X   {\huge\bf GNUPLOT}\\
X   \vspace{3ex}
X   {\Large An Interactive Plotting Program}\\
X   \vspace{2ex}
X   \large
X   Thomas Williams \& Colin Kelley\\
X   \vspace{2ex}
X   Version 2.0: \\
X   John Campbell, David Kotz, and Russell Lang\\
X   \vspace{2ex}
X   \verb+pixar!info-gnuplot@sun.com+
X
X   \vfill
X   {\small This manual is for GNUPLOT version 2.0.}
X
X   \end{center}
X\newpage
X
X\tableofcontents
X\newpage
X
X\setcounter{page}{1}
X\pagestyle{myheadings}
X\markboth{GNUPLOT 2.0}{GNUPLOT 2.0}
X
END_OF_docs/titlepage.tex
if test 760 -ne `wc -c <docs/titlepage.tex`; then
    echo shar: \"docs/titlepage.tex\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of shell archive.
exit 0