Index: /trunk/Jgraph/MSDOS.help
===================================================================
--- /trunk/Jgraph/MSDOS.help	(revision 418)
+++ /trunk/Jgraph/MSDOS.help	(revision 418)
@@ -0,0 +1,11 @@
+This from Alan S. Raskin:
+
+You may be interested in knowing what it takes to get jgraph to compile
+MS-DOS/MS-QuickC:
+
+1) Ignore all of the "function should return a value" warnings.  :-)
+2) Use the blank VMS templates for popen and pclose in token.c
+3) Define float=double to avoid math-overflow run-time errors.
+
+-Alan
+
Index: /trunk/Jgraph/NeXT.help
===================================================================
--- /trunk/Jgraph/NeXT.help	(revision 418)
+++ /trunk/Jgraph/NeXT.help	(revision 418)
@@ -0,0 +1,6 @@
+To compile jgraph on the NeXT machines, compile with -DLCC.  This will
+define LCC in jgraph.h and token.c so that <stdlib.h> will be included.  
+Otherwise, the compilation will go fine, but there will be type conversion 
+errors in token.c which will give bogus output.
+
+Jim
Index: /trunk/Jgraph/README
===================================================================
--- /trunk/Jgraph/README	(revision 418)
+++ /trunk/Jgraph/README	(revision 418)
@@ -0,0 +1,53 @@
+$Revision: 8.3 $
+
+Jgraph takes the description of a graph or graphs in the standard
+input, and produces a postscript file on the standard output.  Jgraph
+is ideal for plotting any mixture of scatter point graphs, line
+graphs, and/or bar graphs, and embedding the output into LaTeX, or
+any other text processing system which can read postscript.
+
+The graph description language is simple enough to get nice looking
+graphs with a minimum of effort, yet powerful enough to give the user
+the flexibility to tailor the appearance of the graph to his or her
+individual preferences.  This includes plotting multiple graphs and
+laying them out separately on the page (or pages). 
+
+The program is written in C, and shouldn't take anything too fancy
+or machine-dependent.  It has been tested on DECstations, 
+sun3's, and sparc's (and is being used on many other types
+of machines, including those running VMS and DOS).
+
+There is a makefile, a man page (in jgraph.1), source code, and 
+example graphs.
+
+Jgraph is available via anonymous ftp to princeton.edu, in the
+file pub/jgraph.Z.  This file is a compressed shell bundle file.
+
+Jgraph is also available from netlib, a mail archive server.
+To acquire jgraph from netlib, send a mail message to
+netlib@ornl.gov with nothing but the text:
+
+send jgraph.shar from misc
+
+It will respond by mailing you messages which comprise
+the file jgraph.shar.  To extract jgraph.shar from these 
+messages, first save each one into a file.  Then for each
+of these files, strip off all the lines up to but not including
+the '#!/bin/sh' line.  Then run /bin/sh on each file.  When
+you're done, you should be left with the file jgraph.shar, upon
+which you then run /bin/sh -- this will produce all the jgraph
+source files.
+
+There is also a mailing list in which I inform users directly 
+about bug fixes.  This is for those who don't read comp.sources.misc,
+or those who would like to hear about minor bug fixes which I
+haven't posted as a patch to comp.sources.misc.
+
+Please send me comments and/or bug reports.
+
+Author: Jim Plank
+Email:  jsp@princeton.edu
+USmail:	Department of Computer Science
+	Princeton University
+	35 Olden St.
+	Princeton, NJ 08544-2087
Index: /trunk/Jgraph/acc.jgr
===================================================================
--- /trunk/Jgraph/acc.jgr	(revision 418)
+++ /trunk/Jgraph/acc.jgr	(revision 418)
@@ -0,0 +1,38 @@
+(* Graph #6: Kbytes processed each second
+ *)
+
+newgraph
+
+yaxis size 2.5 min 0 max 100
+  label fontsize 8 : Percentage of bus utilization
+
+xaxis size 1.8 min 0 max 5
+  no_draw_hash_marks no_draw_axis_label no_draw_hash_labels
+
+(* 100% of utilization == 6510.4166 Kb/sec *)
+
+newcurve
+  label : DB
+  marktype xbar fill .9 marksize .4
+  pts 
+    1   3.3573  (* 218.5792 Kb/sec *)
+
+newcurve
+  label : QS
+  marktype xbar fill .6 marksize .4
+  pts
+    2   8.0665  (* 525.1688 Kb/sec *)
+
+newcurve
+  label : GE
+  marktype xbar fill .3 pattern stripe 40 marksize .4
+  pts
+    3   27.9602  (* 518.2473 Kb/sec *)
+
+newcurve
+  label : RNG
+  marktype xbar fill 0 pattern stripe marksize .4
+  pts
+    4   8.2876  (* 539.5619 Kb/sec *)
+
+
Index: /trunk/Jgraph/acc.tex
===================================================================
--- /trunk/Jgraph/acc.tex	(revision 418)
+++ /trunk/Jgraph/acc.tex	(revision 418)
@@ -0,0 +1,15 @@
+
+\documentstyle[12pt]{report}
+\input{psfig}
+
+\begin{document}
+
+
+A sample bar graph
+
+\begin{figure}[h]
+\centerline{\psfig{figure=acc.eps}}
+\end{figure}
+
+\end{document}
+
Index: /trunk/Jgraph/ad.jgr
===================================================================
--- /trunk/Jgraph/ad.jgr	(revision 418)
+++ /trunk/Jgraph/ad.jgr	(revision 418)
@@ -0,0 +1,19 @@
+newgraph 
+xaxis min 0 max 5.5 size 5.5 nodraw
+yaxis min 0 max 2.8 size 2.8 nodraw
+(*
+newcurve eps cube.eps marksize 1.25 2.8 pts .6 1.4
+newcurve eps disk.eps marksize .8 .8 pts 
+*)
+newcurve eps cube.eps marksize 0 0 pts .6 1.4
+newcurve eps disk.eps marksize 0 0 pts 
+   4.7 1.6
+   4.5 1.3
+   4.3 1
+   4.1 0.7
+
+newline asize .2 .1 linethickness 3 rarrow 
+          pts 1.4 1.5 4.0 1.6
+copycurve pts 1.4 1.4 3.8 1.3
+copycurve pts 1.4 1.3 3.6 1.0
+copycurve pts 1.4 1.2 3.4 0.7
Index: /trunk/Jgraph/alb.jgr
===================================================================
--- /trunk/Jgraph/alb.jgr	(revision 418)
+++ /trunk/Jgraph/alb.jgr	(revision 418)
@@ -0,0 +1,443 @@
+newgraph
+xaxis min 1 max 25 size 6.000 nodraw
+yaxis min .25 max 5 size 1.14 nodraw
+
+newstring x 12.5 y .25 vjc hjc : (a)
+
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	1 5 1 4 1 3 1 2 1 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	2 5 3 4 3 3 3 2 3 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	2 4 3 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	2 3 3 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	2 2 3 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	2 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	3 5 3 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	4 5 3 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	4 4 3 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	4 3 3 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	4 2 3 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	4 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	5 5 7 4 7 3 7 2 7 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	5 4 7 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	5 3 7 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	5 2 7 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	5 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	6 5 7 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	6 4 7 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	6 3 7 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	6 2 7 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	6 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	7 5 7 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	8 5 7 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	8 4 7 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	8 3 7 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	8 2 7 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	8 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	9 5 7 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	9 4 7 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	9 3 7 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	9 2 7 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	9 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	10 5 13 4 13 3 13 2 13 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	10 4 13 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	10 3 13 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	10 2 13 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	10 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	11 5 13 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	11 4 13 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	11 3 13 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	11 2 13 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	11 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	12 5 13 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	12 4 13 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	12 3 13 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	12 2 13 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	12 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	13 5 13 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	14 5 13 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	14 4 13 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	14 3 13 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	14 2 13 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	14 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	15 5 13 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	15 4 13 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	15 3 13 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	15 2 13 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	15 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	16 5 13 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	16 4 13 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	16 3 13 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	16 2 13 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	16 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	17 5 21 4 21 3 21 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	17 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	17 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	17 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	17 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	18 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	18 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	18 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	18 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	18 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	19 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	19 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	19 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	19 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	19 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	20 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	20 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	20 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	20 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	20 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	21 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	22 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	22 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	22 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	22 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	22 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	23 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	23 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	23 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	23 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	23 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	24 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	24 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	24 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	24 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	24 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	25 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	25 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	25 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	25 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	25 1 
+
+newgraph
+xaxis min 1 max 25 size 6.000 nodraw
+yaxis min .25 max 5 size 1.14 nodraw
+y_translate -1.5
+
+newstring x 12.5 y .25 vjc hjc : (b)
+
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	1 5 21 4 21 3 21 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	1 4 3 3 7 2 13 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	1 3 3 2 7 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	1 2 3 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	1 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	2 5 3 4 7 3 13 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	2 4 3 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	2 3 3 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	2 2 3 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	2 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	3 5 3 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	4 5 3 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	4 4 3 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	4 3 3 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	4 2 3 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	4 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	5 5 7 4 13 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	5 4 7 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	5 3 7 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	5 2 7 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	5 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	6 5 7 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	6 4 7 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	6 3 7 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	6 2 7 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	6 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	7 5 7 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	8 5 7 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	8 4 7 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	8 3 7 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	8 2 7 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	8 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	9 5 7 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	9 4 7 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	9 3 7 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	9 2 7 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	9 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	10 5 13 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	10 4 13 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	10 3 13 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	10 2 13 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	10 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	11 5 13 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	11 4 13 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	11 3 13 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	11 2 13 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	11 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	12 5 13 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	12 4 13 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	12 3 13 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	12 2 13 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	12 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	13 5 13 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	14 5 13 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	14 4 13 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	14 3 13 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	14 2 13 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	14 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	15 5 13 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	15 4 13 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	15 3 13 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	15 2 13 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	15 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	16 5 13 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	16 4 13 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	16 3 13 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	16 2 13 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	16 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	17 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	17 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	17 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	17 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	17 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	18 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	18 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	18 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	18 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	18 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	19 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	19 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	19 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	19 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	19 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	20 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	20 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	20 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	20 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	20 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	21 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	22 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	22 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	22 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	22 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	22 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	23 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	23 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	23 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	23 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	23 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	24 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	24 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	24 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	24 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	24 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	25 5 21 4 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	25 4 21 3 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	25 3 21 2 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	25 2 21 1 
+newcurve linetype solid marktype circle marksize 0.200 0.200 pts
+	25 1 
+
Index: /trunk/Jgraph/bailey.jgr
===================================================================
--- /trunk/Jgraph/bailey.jgr	(revision 418)
+++ /trunk/Jgraph/bailey.jgr	(revision 418)
@@ -0,0 +1,30 @@
+
+(* Example of Unix spline(1) to smooth a curve.
+This is a file to draw sin(i) for i going from -pi to pi *)
+
+newgraph
+
+yaxis min -1 max 1 label : sin(i)
+xaxis label : i
+grid_lines
+border
+title : Example Unix spline(1) to interpolate points
+
+(* Plot the sin curve *)
+newline
+  label : data
+  pts include bailey.pts
+copycurve
+  label : splined
+  linetype dotted
+  pts shell : spline < bailey.pts
+
+(* 
+bailey.pts file:
+-3.1416 0.0
+-1.81 -0.9715
+-0.55 -0.5226
+ 0.71  0.6518
+ 1.97  0.9213
+ 3.1416 0.0
+*)
Index: /trunk/Jgraph/bailey.pts
===================================================================
--- /trunk/Jgraph/bailey.pts	(revision 418)
+++ /trunk/Jgraph/bailey.pts	(revision 418)
@@ -0,0 +1,6 @@
+-3.1416 0.0
+-1.81 -0.9715
+-0.55 -0.5226
+ 0.71  0.6518
+ 1.97  0.9213
+ 3.1416 0.0
Index: /trunk/Jgraph/cube.jgr
===================================================================
--- /trunk/Jgraph/cube.jgr	(revision 418)
+++ /trunk/Jgraph/cube.jgr	(revision 418)
@@ -0,0 +1,35 @@
+(* Drawing of the hypercube:  
+   Dimensions = 1.25 * 2.55 *)
+
+newgraph 
+xaxis min 0 max 1.25 size 1.25 nodraw
+yaxis min -0.30 max 2.25 size 2.55 nodraw
+
+(* Legs *)
+newline poly pfill 0 pts
+  0.50  0.00   0.75  0.00   0.75 -0.20   0.50 -0.20
+copycurve pts
+  0.75 -0.20   1.20 -0.30   1.23 -0.28   0.75 -0.10
+copycurve pts
+  0.50 -0.20   0.05 -0.30   0.02 -0.28   0.50 -0.10
+copycurve pts
+  0.75 -0.05   1.20  0.03   1.23  0.02   0.75 -0.13
+copycurve pts
+  0.50 -0.05   0.05  0.03   0.02  0.02   0.50 -0.13
+
+(* Box *)
+newline poly pfill 1 pts
+  0.00 0.00   1.00 0.00   1.00 2.00   0.00 2.00   
+copycurve pfill .80 pts
+  0.00 2.00   0.25 2.20   1.25 2.20   1.00 2.00
+copycurve pfill .9 pts
+  1.00 2.00   1.25 2.20   1.25 0.25   1.00 0.00
+
+
+newline poly pfill 0 pts
+  0.60 0.70   0.60 1.80   0.90 1.80   0.90 0.70
+
+newcurve marktype box marksize .03 .08 fill 1 pts
+  shell : awk ' BEGIN { for (i = 0.65; i < 0.90; i += 0.05) {\
+                          for (j = 0.80; j < 1.70; j += 0.15) {\
+                            printf("%f %f\n", i, j); } } }'
Index: /trunk/Jgraph/data.txt
===================================================================
--- /trunk/Jgraph/data.txt	(revision 418)
+++ /trunk/Jgraph/data.txt	(revision 418)
@@ -0,0 +1,60 @@
+Number of records = 0		Time = 0
+Number of records = 5000	Time = 2
+Number of records = 10000	Time = 3
+Number of records = 15000	Time = 4
+Number of records = 20000	Time = 6
+Number of records = 25000	Time = 9
+Number of records = 30000	Time = 10
+Number of records = 35000	Time = 11
+Number of records = 40000	Time = 13
+Number of records = 45000	Time = 15
+Number of records = 50000	Time = 16
+Number of records = 55000	Time = 18
+Number of records = 60000	Time = 21
+Number of records = 65000	Time = 21
+Number of records = 70000	Time = 23
+Number of records = 75000	Time = 26
+Number of records = 80000	Time = 27
+Number of records = 85000	Time = 28
+Number of records = 90000	Time = 31
+Number of records = 95000	Time = 32
+Number of records = 100000	Time = 33
+Number of records = 105000	Time = 36
+Number of records = 110000	Time = 38
+Number of records = 115000	Time = 38
+Number of records = 120000	Time = 41
+Number of records = 125000	Time = 45
+Number of records = 130000	Time = 44
+Number of records = 135000	Time = 46
+Number of records = 140000	Time = 48
+Number of records = 145000	Time = 49
+Number of records = 150000	Time = 51
+Number of records = 155000	Time = 52
+Number of records = 160000	Time = 54
+Number of records = 165000	Time = 56
+Number of records = 170000	Time = 58
+Number of records = 175000	Time = 61
+Number of records = 180000	Time = 61
+Number of records = 185000	Time = 63
+Number of records = 190000	Time = 69
+Number of records = 195000	Time = 66
+Number of records = 200000 Time = 69
+Number of records = 210000 Time = 73
+Number of records = 220000 Time = 77
+Number of records = 230000 Time = 78
+Number of records = 240000 Time = 88
+Number of records = 250000 Time = 86
+Number of records = 260000 Time = 89
+Number of records = 270000 Time = 94
+Number of records = 280000 Time = 96
+Number of records = 290000 Time = 102
+Number of records = 300000 Time = 104
+Number of records = 310000 Time = 106
+Number of records = 320000 Time = 111
+Number of records = 330000 Time = 113
+Number of records = 340000 Time = 120
+Number of records = 350000 Time = 122
+Number of records = 360000 Time = 124
+Number of records = 370000 Time = 133
+Number of records = 380000 Time = 131
+Number of records = 390000 Time = 134
Index: /trunk/Jgraph/descrip.mms
===================================================================
--- /trunk/Jgraph/descrip.mms	(revision 418)
+++ /trunk/Jgraph/descrip.mms	(revision 418)
@@ -0,0 +1,46 @@
+# VMS MMS makefile
+#
+# In the link you will get a warning because of the multiple definition
+# of exit(). This may be ignored; in order to get MMS completing without
+# trouble you will have to call MMS as follows:
+#	$ MMS/IGNORE
+#
+.ifdef DEBUG
+CFLAGS=/INCLUDE=(SYS$DISK:[],SYS$SHARE:)/noopt/debug
+LFLAGS=/debug
+.else
+CFLAGS=/INCLUDE=(SYS$DISK:[],SYS$SHARE:)
+LFLAGS=
+.endif
+
+OBJS = draw.obj, \
+		edit.obj, \
+		jgraph.obj, \
+		list.obj, \
+		printline.obj, \
+		prio_list.obj, \
+		process.obj, \
+		show.obj, \
+		token.obj, \
+		exit.obj
+
+all :	jgraph.exe
+	! done
+
+# Do not link against the shareable image VAXCRTL.EXE, or you will
+# miss the reference to the local exit() routine.
+# EXIT will be reported as being multiply defined - ignore that.
+jgraph.exe : $(OBJS)
+	link $(LFLAGS) /exe=jgraph $(OBJS),sys$library:vaxcrtl/libr
+
+###
+draw.obj :	draw.c jgraph.h list.h prio_list.h
+edit.obj :	edit.c jgraph.h list.h prio_list.h
+jgraph.obj :	jgraph.c jgraph.h list.h prio_list.h
+list.obj :	list.c list.h
+printline.obj :	printline.c jgraph.h list.h prio_list.h
+prio_list.obj :	prio_list.c list.h prio_list.h
+process.obj :	process.c jgraph.h list.h prio_list.h
+show.obj :	show.c jgraph.h list.h prio_list.h
+token.obj :	token.c list.h
+exit.obj :	exit.c
Index: /trunk/Jgraph/disk.jgr
===================================================================
--- /trunk/Jgraph/disk.jgr	(revision 418)
+++ /trunk/Jgraph/disk.jgr	(revision 418)
@@ -0,0 +1,13 @@
+newgraph
+xaxis min 0 max 0.4 nodraw
+yaxis min 0 max 0.4 nodraw
+
+(* Picture of a disk:
+   0 0 to 0.4 0.4 *)
+
+newcurve marktype ellipse fill .5 marksize 0.4 0.2 pts 0.2 0.1
+newcurve marktype box fill .5 gray .5 marksize 0.4 0.2 pts 0.2 0.2
+newline pts 0.0 0.1   0.0 0.3
+newline pts 0.4 0.1   0.4 0.3
+newcurve marktype ellipse fill 1 marksize 0.4 0.2 pts 0.2 0.3
+
Index: /trunk/Jgraph/draw.c
===================================================================
--- /trunk/Jgraph/draw.c	(revision 418)
+++ /trunk/Jgraph/draw.c	(revision 418)
@@ -0,0 +1,774 @@
+/* 
+ * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/draw.c,v $
+ * $Revision: 8.3 $
+ * $Date: 92/11/30 11:42:10 $
+ * $Author: jsp $
+ */
+
+#include "jgraph.h"
+#include <stdio.h>
+#include <math.h>
+
+static char real_eof = EOF;
+
+float ctop(val, axis)
+float val;
+Axis axis;
+{
+  if (axis->is_lg) {
+    if (val <= 0.0) {
+      error_header();
+      fprintf(stderr, 
+              "Value of %f is at negative infinity with logrhythmic %c axis\n", 
+              val, (axis->is_x) ? 'x' : 'y'); 
+       exit(1);
+    }
+    return (log(val) / axis->logfactor - axis->logmin) * axis->factor;
+  } else {
+    return (val - axis->min) * axis->factor;
+  }
+}
+
+float disttop(val, axis)
+float val;
+Axis axis;
+{
+  if (axis->is_lg) {
+    return FCPI * val;
+  } else {
+    return (val) * axis->factor;
+  }
+}
+
+float intop(val)
+float val;
+{
+  return FCPI * val;
+}
+
+#define MAXIMUM(a,b) ((a > b) ? a : b)
+
+draw_axis(a, other)
+Axis a, other;
+{
+  char orientation;
+  Hash h;
+  String s;
+
+  orientation = (a->is_x) ? 'x' : 'y';
+  setlinewidth(1.0);
+  comment("Drawing Axis");
+  if (a->grid_lines) {
+    comment("Drawing Grid lines");
+    gsave();
+    setgray(a->gr_graytype, a->gr_gray);
+    for (h = first(a->hash_lines); h != nil(a->hash_lines); h = next(h)) {
+      if (h->major) {
+        printline(h->loc, 0.0, h->loc, other->psize, orientation);
+      }
+    }
+    grestore();
+  }
+  if (a->mgrid_lines) {
+    comment("Drawing Minor Grid lines");
+    gsave();
+    setgray(a->mgr_graytype, a->mgr_gray);
+    for (h = first(a->hash_lines); h != nil(a->hash_lines); h = next(h)) {
+      if (!h->major) {
+        printline(h->loc, 0.0, h->loc, other->psize, orientation);
+      }
+    }
+    grestore();
+  }
+  gsave();
+  setgray(a->graytype, a->gray);
+  if (a->draw_axis_line) {
+    printline(0.0, a->draw_at, a->psize, a->draw_at, orientation);
+  }
+  if (a->draw_hash_marks) {
+    comment("Drawing Hash Marks");
+    for (h = first(a->hash_lines); h != nil(a->hash_lines); h = next(h)) {
+      printline(h->loc, a->draw_hash_marks_at, h->loc, 
+                a->draw_hash_marks_at + (h->size * a->hash_scale), 
+                orientation);
+    }
+  }
+  if (a->draw_hash_labels) {
+    comment("Drawing Hash Labels");
+    for (s = first(a->hash_labels); s != nil(a->hash_labels); s = next(s)) {
+      a->hl->label = s->s->label;
+      if (a->is_x) {
+        a->hl->x = s->s->x;
+      } else {
+        a->hl->y = s->s->y;
+      }
+      draw_label(a->hl);
+    }
+  }
+  if (a->draw_axis_label) {
+    comment("Drawing Axis Label");
+    draw_label(a->label);
+  }
+  grestore();
+  printf("\n");
+}
+
+
+draw_label(l)
+Label l;
+{
+  if (l->label == CNULL) return;
+  comment(l->label);
+  print_label(l);
+}
+
+set_clip(g)
+Graph g;
+{
+  comment("Setting Clip");
+  printf("newpath\n");
+  printf(" 0 0 moveto 0 %f lineto %f %f lineto %f 0 lineto\n",
+           g->y_axis->psize, g->x_axis->psize,
+           g->y_axis->psize, g->x_axis->psize);
+  printf("  closepath clip newpath\n");
+}
+
+draw_curves(g)
+Graph g;
+{
+  Curve c;
+
+  gsave();
+  printf("\n");
+  if (g->clip) set_clip(g);
+  for(c = first(g->curves); c != nil(g->curves); c = next(c)) {
+    draw_curve(c, g);
+  }
+  grestore();
+  printf("\n");
+}
+
+draw_curve(c, g)
+Curve c;
+Graph g;
+{
+  Point p, px, py;
+  int i, j;
+  float this_x, this_y, last_x, last_y, x, y;
+
+  gsave();
+  setgray(c->graytype, c->gray);
+  if (c->clip) set_clip(g);
+  if (first(c->xepts) != nil(c->xepts) ||
+      first(c->yepts) != nil(c->yepts)) {
+    comment("Drawing Epts");
+    px = first(c->xepts);
+    py = first(c->yepts);
+    setlinewidth(c->linethick);
+    setlinestyle('s', (Flist)0);
+    for (p = first(c->pts); p != nil(c->pts); p = next(p)) {
+      if (p->e == 'x') {
+        x = ctop(p->x, g->x_axis);
+        y = ctop(p->y, g->y_axis);
+        print_ebar(x, y, ctop(px->x, g->x_axis), c->marksize[1]/2.0, 'x');
+        px = next(px);
+        print_ebar(x, y, ctop(px->x, g->x_axis), c->marksize[1]/2.0, 'x');
+        px = next(px);
+      } else if (p->e == 'y') {
+        x = ctop(p->x, g->x_axis);
+        y = ctop(p->y, g->y_axis);
+        print_ebar(y, x, ctop(py->y, g->y_axis), c->marksize[0]/2.0, 'y');
+        py = next(py);
+        print_ebar(y, x, ctop(py->y, g->y_axis), c->marksize[0]/2.0, 'y');
+        py = next(py);
+      }
+    }
+  }
+
+  comment("Drawing Curve");
+  if (c->linetype != '0' || c->poly) {
+    if (c->bezier) {
+      i = 0;
+      j = 0;
+      if (c->poly) printf("newpath ");
+      for (p = first(c->pts); p != nil(c->pts); p = next(p)) {
+        if (j == 0 && i == 0) {
+          start_line(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis), c);
+          j++;
+        } else if (i != 0) {
+          bezier_control(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis));
+        } else {
+          bezier_end(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis));
+          j++;
+        }
+        if (!c->poly && j == 30 && i == 0) {
+          end_line();
+          p = prev(p);
+          j = 0;
+          i = 0;
+        } else i = (i + 1) % 3;
+      }
+      if (j != 0) {
+        if (c->poly) {
+          printf("closepath ");
+          setfill(0.0, 0.0, c->pfilltype, c->pfill, c->ppattern, c->pparg);
+        }
+        end_line();
+      }
+    } else {
+      i = 0;
+      if (c->poly) printf("newpath ");
+      for (p = first(c->pts);
+           p != nil(c->pts);
+           p = next(p)) {
+        if (i == 0) {
+          start_line(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis), c);
+        } else {
+          cont_line(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis));
+        } 
+        if (!c->poly && i == 100 && next(p)) {
+          end_line();
+          p = prev(p);
+          i = 0;
+        } else i++;
+      }
+      if (i != 0) {
+        if (c->poly) {
+          printf("closepath ");
+          setfill(0.0, 0.0, c->pfilltype, c->pfill, c->ppattern, c->pparg);
+        }
+        end_line();
+      }
+    }
+  }
+  comment("Drawing Curve points");
+  i = 0;
+  for (p = first(c->pts);
+       p != nil(c->pts);
+       p = next(p)) {
+    this_x = ctop(p->x, g->x_axis);
+    this_y = ctop(p->y, g->y_axis);
+    if (!c->bezier || i == 0) draw_mark(this_x, this_y, c, g);
+    if (p != first(c->pts)) {
+      if (c->rarrows || (c->rarrow && p == last(c->pts))) {
+        if (!c->bezier || i == 0) 
+          draw_arrow(this_x, this_y, last_x, last_y, c);
+      }
+      if (c->larrows || (c->larrow && prev(p) == first(c->pts))) {
+        if (!c->bezier || i == 1) 
+          draw_arrow(last_x, last_y, this_x, this_y, c);
+      }
+    }
+    last_x = this_x;  
+    last_y = this_y;  
+    i = (i + 1) % 3;
+  }
+  grestore();
+  printf("\n");
+}
+
+draw_mark(x, y, c, g)
+float x, y;
+Curve c;
+Graph g;
+{
+  Point p;
+  float ms0, ms1, scx, scy, trx, try;
+  int i, j;
+  FILE *f;
+  char ch;
+  int done, newline;
+  char inp[100];
+  int bb[4];
+
+  if (c->marktype == 'n') return;
+  ms0 = c->marksize[0] / 2.0;
+  ms1 = c->marksize[1] / 2.0;
+
+  gsave();
+  printf(" %f %f translate %f rotate\n", x, y, c->mrotate);
+
+  switch (c->marktype) {
+    case 'n': break;
+    case 'E': if (c->eps == CNULL) break;
+              f = fopen(c->eps, "r");
+              if (f == NULL) {
+                fprintf(stderr, "Error: eps file %s couldn't be opened\n",
+                      c->eps);
+                exit(1);
+              }
+              /* Get bbox */
+              newline = 1;
+              done = 0;
+              while(!done) {
+                while(!newline) {
+                  ch = getc(f);
+                  if (ch == real_eof) {
+                    fprintf(stderr, "Error: Eps file '%s' has %s\n",
+                            c->eps, "no bounding box");
+                    exit(1);
+                  }
+                  newline = (ch == '\n');
+                }
+                fscanf(f, "%s", inp); 
+                if (strcmp(inp, "%%BoundingBox:") == 0) done = 1;
+              }
+              for (i = 0; i < 4; i++) {
+                if (fscanf(f, "%d", &(bb[i])) != 1) {
+                  fprintf(stderr, "Error: Eps file '%s': eof in %s\n",
+                          c->eps, "bounding box");
+                  exit(1);
+                }
+              }
+              if (bb[2] - bb[0] == 0) {
+                scx = ms0;
+                trx = 0.0;
+              } else {
+                scx = ms0 * 2.0/(float)(bb[2] - bb[0]);
+                trx = -(float)(bb[2] - bb[0])/2.0 - bb[0];
+              }
+              if (bb[3] - bb[1] == 0) {
+                scy = ms1;
+                try = 0.0;
+              } else {
+                scy = ms1 * 2.0/(float)(bb[3] - bb[1]);
+                try = -(float)(bb[3] - bb[1])/2.0 - bb[1];
+              }
+	      /* Don't scale if ms == 0 0 */
+	      if (ms0 == 0.0 && ms1 == 0.0) {
+                scx = 1.0;
+                scy = 1.0;
+              }
+
+              sprintf(inp, "Including eps file %s", c->eps);
+              comment(inp);
+              /* Use bbox to scale and translate */
+                
+              printf("%f %f scale %f %f translate\n", scx, scy, trx, try);
+              /* Include the rest of the file */
+              for (ch = getc(f); ch != real_eof; ch = getc(f)) putchar(ch);
+              putchar('\n');
+              fclose(f);
+              break;
+    case 'p': if (c->postscript == CNULL) break;
+	      if (ms0 != 0.0 || ms1 != 0.0) {
+                printf("%f %f scale\n", ms0, ms1);
+              }
+              if (!c->postfile) {
+                printf("%s\n", c->postscript);
+              } else {
+                f = fopen(c->postscript, "r");
+                if (f == NULL) {
+                  fprintf(stderr, 
+                          "Error: postscript file %s couldn't be opened\n",
+                          c->postscript);
+                  exit(1);
+                }
+                for (ch = getc(f); ch != real_eof; ch = getc(f)) putchar(ch);
+                putchar('\n');
+                fclose(f);
+              }
+              break;
+    case 'c': printline(-ms0, 0.0, ms0, 0.0, 'x');
+              printline(-ms1, 0.0, ms1, 0.0, 'y');
+              break;
+    case 'b': start_poly(-ms0, -ms1);
+              cont_poly(ms0, -ms1);
+              cont_poly(ms0, ms1);
+              cont_poly(-ms0, ms1);
+              end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg);
+              break;
+    case 'd': start_poly(-ms0, 0.0);
+              cont_poly(0.0, -ms1);
+              cont_poly(ms0, 0.0);
+              cont_poly(0.0, ms1);
+              end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg);
+              break;
+    case 'g': p = first(c->general_marks);
+              if (p == nil(c->general_marks)) break;
+              if (next(p) == nil(c->general_marks)) break;
+              start_poly(p->x*ms0, p->y*ms1);
+              for(p = next(p); p != nil(c->general_marks); p = next(p))
+                cont_poly(p->x*ms0, p->y*ms1);
+              end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg);
+              break;
+    case 'G': i = 0;
+              for (p = first(c->general_marks);
+                   p != nil(c->general_marks);
+                   p = next(p)) {
+                if (i == 0) {
+                  printf("%f %f moveto ", p->x*ms0, p->y*ms1);
+                } else {
+                  printf("%f %f lineto\n", p->x*ms0, p->y*ms1);
+                }
+                if (i == 100) {
+                  printf("stroke\n");
+                  p = prev(p);
+                  i = 0;
+                } else i++;
+              }
+              if (i != 0) printf("stroke\n");
+              break;
+    case 'B': i = 0;
+              j = 0;
+              for (p = first(c->general_marks);
+                   p != nil(c->general_marks);
+                   p = next(p)) {
+                if (j == 0 && i == 0) {
+                  printf("%f %f moveto ", p->x*ms0, p->y*ms1);
+                  j++;
+                } else if (i != 0) {
+                  printf("%f %f ", p->x*ms0, p->y*ms1);
+                } else {
+                  printf("%f %f curveto\n", p->x*ms0, p->y*ms1);
+                  j++;
+                }
+                if (j == 30 && i == 0) {
+                  printf(" stroke\n");
+                  p = prev(p);
+                  j = 0;
+                  i = 0;
+                } else i = (i + 1) % 3;
+              }
+              if (j != 0) printf(" stroke\n");
+              if (! ((i == 1) || (i == 0 && j == 0))) {
+                fprintf(stderr, "Error: curve %d, %s\n", c->num,
+                        "wrong number of points for bezier marktype\n");
+                exit(1);
+              }
+              break;
+
+    case 'Z': i = 0;
+              j = 0;
+              for (p = first(c->general_marks);
+                   p != nil(c->general_marks);
+                   p = next(p)) {
+                if (i == 0 && j == 0) {
+                  printf("newpath %f %f moveto ", p->x*ms0, p->y*ms1);
+                  j++;
+                } else if (i != 0) {
+                  printf("%f %f ", p->x*ms0, p->y*ms1);
+                } else {
+                  printf("%f %f curveto\n", p->x*ms0, p->y*ms1);
+                }
+                i = (i + 1) % 3;
+              }
+              printf("closepath ");
+              setfill(x, y, c->filltype, c->fill, c->pattern, c->parg);
+              printf("stroke\n");
+
+              if (i != 1) {
+                fprintf(stderr, "Error: curve %d, %s\n", c->num,
+                        "wrong number of points for bezier marktype\n");
+                exit(1);
+              }
+              break;
+
+    case 'x': printline(-ms0, -ms1, ms0, ms1, 'x');
+              printline(-ms0, ms1, ms0, -ms1, 'x');
+              break;
+    case 'o': printellipse(x, y, ms0, ms0, 
+                           c->filltype, c->fill, c->pattern, c->parg);
+              break;
+    case 'e': printellipse(x, y, ms0, ms1,
+                           c->filltype, c->fill, c->pattern, c->parg);
+              break;
+    case 't': start_poly(ms0, -ms1);
+              cont_poly(0.0, ms1);
+              cont_poly(-ms0, -ms1);
+              end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg);
+              break;
+    case 'X': start_poly(ms0, 0.0);
+              cont_poly(-ms0, 0.0);
+              cont_poly(-ms0, g->x_axis->draw_at - y);
+              cont_poly(ms0, g->x_axis->draw_at - y);
+              end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg);
+              break;
+    case 'Y': start_poly(0.0, ms1);
+              cont_poly(0.0, -ms1);
+              cont_poly(g->y_axis->draw_at - x, -ms1);
+              cont_poly(g->y_axis->draw_at - x, ms1);
+              end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg);
+              break;
+    case 'l': draw_label(c->lmark);
+              break;
+    default: error_header(); 
+             fprintf(stderr, "Unknown mark: %c\n", c->marktype);
+             break;
+  }
+  grestore();
+}
+
+draw_arrow(x1, y1, x2, y2, c)
+float x1, y1, x2, y2;
+Curve c;
+{
+  float dx, dy;
+  float ms0;
+  float theta, ct, st;
+  
+  
+  if (c->marktype == 'o') {
+    dx = x1 - x2;
+    dy = y1 - y2;
+    if (dx == 0.0 && dy == 0.0) return;
+
+    ms0 = c->marksize[0] / 2.0;
+    if (dx == 0.0) theta = asin(1.0); else theta = atan(dy/dx);
+    if (theta < 0.0) theta = -theta;
+    ct = cos(theta)*ms0;
+    st = sin(theta)*ms0;
+    x1 = x1 + ct*(dx > 0.0 ? -1.0 : 1.0);
+    y1 = y1 + st*(dy > 0.0 ? -1.0 : 1.0);
+
+    if ( ((x1 - x2 > 0) != (dx > 0)) || 
+         ((y1 - y2 > 0) != (dy > 0)) ) return;
+  }
+
+  dx = x1 - x2;
+  dy = y1 - y2;
+  if (dx == 0.0 && dy == 0.0) return;
+
+  gsave();
+  printf("%f %f translate %f %f atan rotate\n", x1, y1, dy, dx);
+  start_poly(0.0, 0.0);
+  cont_poly(-(c->asize[0]), (c->asize[1]));
+  cont_poly(-(c->asize[0]), -(c->asize[1]));
+  end_poly(0.0, 0.0, c->afilltype, c->afill, c->apattern, c->aparg);
+  grestore();
+  printf("\n");
+}
+
+draw_legend(g)
+Graph g;
+{
+  Curve c;
+  Legend l;
+  float x, y;
+  char tmpmktype;
+
+  l = g->legend;
+  comment("Drawing legend");
+  if (l->type == 'n' || l->anylines < 0) return;
+  gsave();
+  if (l->type == 'u') {
+    printf("%f %f translate %f rotate\n", l->l->x, l->l->y, l->l->rotate);
+  }
+  for (c = first(g->curves); c != nil(g->curves); c = next(c)) {
+    if (c->l->label != CNULL) {
+      gsave();
+      setgray(c->graytype, c->gray);
+      y = (c->l->ymax + c->l->ymin) / 2.0;
+      if (l->anylines) {
+        if (c->linetype != '0' && l->linelength != 0) {
+          if (l->type == 'c' && c->l->hj == 'r') {
+            x = c->l->x + l->midspace;
+          } else {
+            x = c->l->x - l->midspace - l->linelength;
+          }
+          start_line(x, y, c); 
+          cont_line(x+l->linelength, y);
+          end_line();
+        }
+        tmpmktype = c->marktype;
+        c->marktype = 'n';
+        if (c->larrows || c->larrow) draw_arrow(x, y, x+l->linelength, y, c);
+        if (c->rarrows || c->rarrow) draw_arrow(x+l->linelength, y, x, y, c);
+        c->marktype = tmpmktype;
+        if (l->type == 'c' && c->l->hj == 'r') {
+          x = c->l->x + l->midspace + l->linelength / 2.0;
+        } else {
+          x = c->l->x - l->midspace - l->linelength / 2.0;
+        }
+      } else if (l->type == 'c' && c->l->hj == 'r') {
+        x = c->l->x + l->midspace;
+      } else {
+        x = c->l->x - l->midspace;
+      }
+      if (c->marktype == 'X' || c->marktype == 'Y') {
+        char old;
+        old = c->marktype;
+        c->marktype = 'b'; 
+        draw_mark(x, y, c, g); 
+        c->marktype = old;
+      } else {
+        draw_mark(x, y, c, g);
+      }
+      grestore();
+      printf("\n");
+      draw_label(c->l);
+    }
+  }
+  grestore();
+  printf("\n");
+}
+
+draw_strings(g)
+Graph g;
+{
+  String s;
+
+  comment("Drawing strings");
+  for (s = first(g->strings); s != nil(g->strings); s = next(s))
+    draw_label(s->s);
+}
+
+draw_graph(g)
+Graph g;
+{
+  comment("Drawing New Graph");
+  printf("%f %f translate\n", g->x_translate, g->y_translate);
+  if (g->border) {
+    printline(0.0, 0.0, 0.0, g->y_axis->psize, 'x');
+    printline(0.0, 0.0, 0.0, g->x_axis->psize, 'y');
+    printline(g->x_axis->psize, 0.0, g->x_axis->psize, g->y_axis->psize, 'x');
+    printline(g->y_axis->psize, 0.0, g->y_axis->psize, g->x_axis->psize, 'y');
+  }
+  draw_axis(g->x_axis, g->y_axis);
+  draw_axis(g->y_axis, g->x_axis);
+  draw_label(g->title);
+  draw_curves(g);
+  draw_legend(g);
+  draw_strings(g);
+  printf("%f %f translate\n", - g->x_translate, - g->y_translate);
+
+}
+
+draw_graphs(gs, pp, landscape)
+Graphs gs;
+int pp;
+int landscape;
+{
+  Graphs gs_p;
+  Graph g;
+
+  for (gs_p = first(gs); gs_p != nil(gs); gs_p = next(gs_p)) {
+    draw_header(gs_p, pp, landscape);
+    for (g = first(gs_p->g); g != nil(gs_p->g); g = next(g)) {
+      draw_graph(g);
+    }
+    draw_footer(gs_p, pp);
+  }
+}
+
+draw_header(gs, pp, landscape)
+Graphs gs;
+int pp;
+int landscape;
+{
+  FILE *f;
+  char c;
+
+  if (gs->page == 1) printf("%%!PS-Adobe-2.0 EPSF-1.2\n");
+  printf("%%%%Page: %d %d\n", gs->page, gs->page);
+  if (landscape) {
+    printf("%%%%BoundingBox: %d %d %d %d\n", gs->bb[1], gs->bb[0], 
+            gs->bb[3], gs->bb[2]);
+  } else {
+    printf("%%%%BoundingBox: %d %d %d %d\n", gs->bb[0], gs->bb[1], 
+            gs->bb[2], gs->bb[3]);
+  }
+
+  printf("%%%%EndComments\n");
+  if (landscape) {
+    printf("-90 rotate\n");
+  }
+  if (pp) {
+    if (landscape) {
+      printf("%f 0 translate\n", -(11.0 * FCPI));
+      printf("%f %f translate\n",
+        (((11.0 * FCPI) - (gs->bb[2] - gs->bb[0])) / 2.0) - gs->bb[0],     
+        (((8.5 * FCPI) - (gs->bb[3] - gs->bb[1])) / 2.0) - gs->bb[1]);     
+    } else {
+      printf("%f %f translate\n",
+        (((8.5 * FCPI) - (gs->bb[2] - gs->bb[0])) / 2.0) - gs->bb[0],     
+        (((11.0 * FCPI) - (gs->bb[3] - gs->bb[1])) / 2.0) - gs->bb[1]);     
+    }
+  } else if (landscape) {
+    printf("%f 0 translate\n", -gs->bb[2] - gs->bb[0]);
+  }
+  printf("1 setlinecap 1 setlinejoin\n");
+  printf("0.700 setlinewidth\n");
+  printf("0.00 setgray\n");
+
+  printf("\n");
+  printf("/Jrnd { exch cvi exch cvi dup 3 1 roll idiv mul } def\n");
+
+  printf("/JDEdict 8 dict def\n");
+  printf("JDEdict /mtrx matrix put\n");
+  printf("/JDE {\n");
+  printf("  JDEdict begin\n");
+  printf("  /yrad exch def\n");
+  printf("  /xrad exch def\n");
+  printf("  /savematrix mtrx currentmatrix def\n");
+  printf("  xrad yrad scale\n");
+  printf("  0 0 1 0 360 arc\n");
+  printf("  savematrix setmatrix\n");
+  printf("  end\n");
+  printf("} def\n");
+
+  printf("/JSTR {\n");
+  printf("  gsave 1 eq { gsave 1 setgray fill grestore } if\n");
+  printf("    exch neg exch neg translate \n");
+  printf("    clip                        \n");
+  printf("    rotate                      \n");
+  printf("    4 dict begin\n");
+  printf("      pathbbox  /&top exch def\n");
+  printf("                /&right exch def\n");
+  printf("                /&bottom exch def\n");
+  printf("                &right sub /&width exch def\n");
+  printf("      newpath\n");
+  printf("      currentlinewidth mul round dup               \n");
+  printf("      &bottom exch Jrnd exch &top             \n");
+  printf("      4 -1 roll currentlinewidth mul setlinewidth  \n");
+  printf("      { &right exch moveto &width 0 rlineto stroke } for    \n");
+  printf("    end\n");
+  printf("  grestore\n");
+  printf("  newpath\n");
+  printf("} bind def\n");
+
+  gsave();
+  setfont("Times-Roman", 9.00);
+  if (gs->preamble != CNULL) {
+    if (gs->prefile) {
+      f = fopen(gs->preamble, "r");
+      if (f == NULL) {
+        fprintf(stderr, "Error: preamble file %s couldn't be opened\n",
+                gs->preamble);
+        exit(1);
+      }
+      for (c = getc(f); c != real_eof; c = getc(f)) putchar(c);
+      putchar('\n');
+      fclose(f);
+    } else {
+      printf("%s\n", gs->preamble);
+    }
+  }
+}
+
+draw_footer(gs, pp)
+Graphs gs;
+int pp;
+{
+  FILE *f;
+  char c;
+
+  if (gs->epilogue != CNULL) {
+    if (gs->epifile) {
+      f = fopen(gs->epilogue, "r");
+      if (f == NULL) {
+        fprintf(stderr, "Error: epilogue file %s couldn't be opened\n",
+                gs->epilogue);
+        exit(1);
+      }
+      for (c = getc(f); c != real_eof; c = getc(f)) putchar(c);
+      putchar('\n');
+      fclose(f);
+    } else {
+      printf("%s\n", gs->epilogue);
+    }
+  }
+  grestore();
+  if (pp) printf("showpage\n"); else printf("\n");
+}
+
Index: /trunk/Jgraph/ebars.jgr
===================================================================
--- /trunk/Jgraph/ebars.jgr	(revision 418)
+++ /trunk/Jgraph/ebars.jgr	(revision 418)
@@ -0,0 +1,24 @@
+(* This graph shows the use of y_epts to get error bars onto the graph.
+   It plots the curve y = 2x plus or minus x/2 for integer x values
+   from from 1 to 10 *)
+
+newgraph
+xaxis min 0 max 10 label : x
+yaxis min 0 max 25 label : y = 2x +- x/2
+
+newcurve marktype circle linetype dotted
+  (* These points could equally be generated by: 
+     y_epts shell : echo "" |\
+      awk '{ for (i = 1; i < 11; i++) print i, 2*i, 2*i-i/2.0, 2*i+i/2.0}'
+   *)
+  y_epts
+   1 2 1.5 2.5
+   2 4 3 5
+   3 6 4.5 7.5
+   4 8 6 10
+   5 10 7.5 12.5
+   6 12 9 15
+   7 14 10.5 17.5
+   8 16 12 20
+   9 18 13.5 22.5
+   10 20 15 25
Index: /trunk/Jgraph/edit.c
===================================================================
--- /trunk/Jgraph/edit.c	(revision 418)
+++ /trunk/Jgraph/edit.c	(revision 418)
@@ -0,0 +1,1139 @@
+/* 
+ * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/edit.c,v $
+ * $Revision: 8.3 $
+ * $Date: 92/11/30 11:42:12 $
+ * $Author: jsp $
+ */
+
+
+#include <stdio.h>
+
+#include "jgraph.h"
+
+#define MAX(a,b) ((a > b) ? a : b)
+#define MIN(a,b) ((a < b) ? a : b)
+
+edit_label(l)
+Label l;
+{
+  char *txt, inp_str[80];
+  float f;
+  int i;
+
+  while ( getstring(inp_str) ) {
+    if (strcmp(inp_str, ":") == 0) {
+      if ((txt = getlabel()) == CNULL) return;
+      l->label = txt;
+    } else if (strcmp(inp_str, "x") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else l->x = f;
+    } else if (strcmp(inp_str, "y") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else l->y = f;
+    } else if (strcmp(inp_str, "fontsize") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else l->fontsize = f;
+    } else if (strcmp(inp_str, "linesep") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else l->linesep = f;
+    } else if (strcmp(inp_str, "hjl") == 0) {
+      l->hj = 'l';
+    } else if (strcmp(inp_str, "hjc") == 0) {
+      l->hj = 'c';
+    } else if (strcmp(inp_str, "hjr") == 0) {
+      l->hj = 'r';
+    } else if (strcmp(inp_str, "vjc") == 0) {
+      l->vj = 'c';
+    } else if (strcmp(inp_str, "vjt") == 0) {
+      l->vj = 't';
+    } else if (strcmp(inp_str, "vjb") == 0) {
+      l->vj = 'b';
+    } else if (strcmp(inp_str, "font") == 0) {
+      if (!getstring(inp_str)) return;
+      txt = (char *) malloc (sizeof(char)*strlen(inp_str)+2);
+      strcpy(txt, inp_str);
+      l->font = txt;
+    } else if (strcmp(inp_str, "rotate") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else l->rotate = f;
+    } else if (strcmp(inp_str, "lgray") == 0) {
+        if (!getfloat(&f)) rejecttoken(); else {
+          l->graytype = 'g';
+          l->gray[0] = f;
+        }
+    } else if (strcmp(inp_str, "lcolor") == 0) {
+        l->graytype = 'c';
+        for( i = 0 ; i < 3 ; i++ )  {
+          if(!getfloat(&f)) {
+            rejecttoken();
+            l->graytype = 'n';
+            break ;
+          } else l->gray[i] = f ;
+        }
+    } else {
+      rejecttoken();
+      return;
+    }
+  }
+}
+
+copy_curve(c1, c2) /* Copies curve c2 to c1 */
+Curve c1, c2;
+{
+  Flist f, newf;
+  Point p, newp;
+
+  copy_label(c1->l, c2->l);
+  copy_label(c1->lmark, c2->lmark);
+  c1->l->label = CNULL;
+  c1->clip = c2->clip;
+  for (f = first(c2->gen_linetype); 
+       f != nil(c2->gen_linetype); 
+       f = next(f)) {
+    newf = (Flist) get_node(c1->gen_linetype);
+    newf->f = f->f;
+    insert(newf, c1->gen_linetype);
+  }
+  c1->pattern = c2->pattern;
+  c1->apattern = c2->apattern;
+  c1->ppattern = c2->ppattern;
+  c1->parg = c2->parg;
+  c1->aparg = c2->aparg;
+  c1->pparg = c2->pparg;
+  c1->marktype = c2->marktype;
+  c1->linetype = c2->linetype;
+  c1->linethick = c2->linethick;
+  c1->marksize[0] = c2->marksize[0];
+  c1->marksize[1] = c2->marksize[1];
+  c1->mrotate = c2->mrotate;
+  for (p = first(c2->general_marks); 
+       p != nil(c2->general_marks); 
+       p = next(p)) {
+    newp = (Point) get_node(c1->general_marks);
+    newp->x = p->x;
+    newp->y = p->y;
+    insert(newp, c1->general_marks);
+  }
+  c1->graytype = c2->graytype;
+  c1->gray[0] = c2->gray[0];
+  c1->gray[1] = c2->gray[1];
+  c1->gray[2] = c2->gray[2];
+  c1->filltype = c2->filltype;
+  c1->fill[0] = c2->fill[0];
+  c1->fill[1] = c2->fill[1];
+  c1->fill[2] = c2->fill[2];
+  c1->poly = c2->poly;
+  c1->pfilltype = c2->pfilltype;
+  c1->pfill[0] = c2->pfill[0];
+  c1->pfill[1] = c2->pfill[1];
+  c1->pfill[2] = c2->pfill[2];
+  c1->afilltype = c2->afilltype;
+  c1->afill[0] = c2->afill[0];
+  c1->afill[1] = c2->afill[1];
+  c1->afill[2] = c2->afill[2];
+  c1->postscript = c2->postscript;
+  c1->postfile = c2->postfile;
+  c1->eps = c2->eps;
+  c1->rarrow = c2->rarrow;
+  c1->larrow = c2->larrow;
+  c1->rarrows = c2->rarrows;
+  c1->larrows = c2->larrows;
+  c1->asize[0] = c2->asize[0];
+  c1->asize[1] = c2->asize[1];
+  c1->bezier = c2->bezier;
+}
+
+copy_label(l1, l2) /* Copies label l2 to l1 */
+Label l1, l2;
+{
+  l1->label = l2->label;
+  l1->x = l2->x;
+  l1->y = l2->y;
+  l1->rotate = l2->rotate;
+  l1->font = l2->font;
+  l1->fontsize = l2->fontsize;
+  l1->hj = l2->hj;
+  l1->vj = l2->vj;
+  l1->graytype = l2->graytype;
+  l1->gray[0] = l2->gray[0];
+  l1->gray[1] = l2->gray[1];
+  l1->gray[2] = l2->gray[2];
+  l1->linesep = l2->linesep;
+}
+
+copy_axis(a1, a2) /* Copies axis a2 to a1 */
+Axis a1, a2;
+{
+  copy_label(a1->label, a2->label);
+  copy_label(a1->hl, a2->hl);
+  a1->max = a2->max;
+  a1->min = a2->min;
+  a1->pmax = a2->pmax;
+  a1->pmin = a2->pmin;
+  a1->size = a2->size;
+  a1->hash_interval = a2->hash_interval;
+  a1->hash_start = a2->hash_start;
+  a1->log_base = a2->log_base;
+  a1->draw_hash_marks_at = a2->draw_hash_marks_at;
+  a1->draw_hash_labels_at = a2->draw_hash_labels_at;
+  a1->draw_at = a2->draw_at;
+  a1->draw_hash_labels = a2->draw_hash_labels;
+  a1->draw_axis_line = a2->draw_axis_line;
+  a1->draw_hash_marks = a2->draw_hash_marks;
+  a1->draw_axis_label = a2->draw_axis_label;
+  a1->auto_hash_labels = a2->auto_hash_labels;
+  a1->auto_hash_marks = a2->auto_hash_marks;
+  a1->minor_hashes = a2->minor_hashes;
+  a1->hash_scale = a2->hash_scale;
+  a1->hash_format = a2->hash_format;
+  a1->graytype = a2->graytype;
+  a1->gray[0] = a2->gray[0];
+  a1->gray[1] = a2->gray[1];
+  a1->gray[2] = a2->gray[2];
+  a1->mgr_graytype = a2->mgr_graytype;
+  a1->mgr_gray[0] = a2->mgr_gray[0];
+  a1->mgr_gray[1] = a2->mgr_gray[1];
+  a1->mgr_gray[2] = a2->mgr_gray[2];
+  a1->gr_graytype = a2->gr_graytype;
+  a1->gr_gray[0] = a2->gr_gray[0];
+  a1->gr_gray[1] = a2->gr_gray[1];
+  a1->gr_gray[2] = a2->gr_gray[2];
+  a1->grid_lines = a2->grid_lines;
+  a1->mgrid_lines = a2->mgrid_lines;
+  a1->precision = a2->precision;
+  a1->start_given = a2->start_given;
+  a1->is_lg = a2->is_lg;
+  a1->is_x = a2->is_x;
+}
+
+Curve do_copy_curve(g, gs, all_gs)
+Graph g;
+Graphs gs;
+Graphs all_gs;
+{
+  Curve lastc, newc;
+  Graph oldg;
+  Graphs oldgs;
+  int num;
+
+  if (!getint(&num)) {
+    rejecttoken();
+    oldg = g;
+    oldgs = gs;
+    while(gs != nil(all_gs)) {
+      if (gs != oldgs) g = last(gs->g);
+      while(g != nil(gs->g)) {
+        if (first(g->curves) == nil(g->curves)) g = prev(g);
+        else {
+          lastc = last(g->curves);
+          if (first(oldg->curves) == nil(oldg->curves))
+            newc = new_curve(oldg->curves, 0);
+          else newc = new_curve(oldg->curves, last(oldg->curves)->num + 1);
+          copy_curve(newc, lastc);
+          return newc;
+        }
+      }
+      gs = prev(gs);
+    }
+    error_header(); 
+    fprintf(stderr, "Cannot perform copycurve on first curve\n");
+    exit(1);
+  } else {
+    if (first(g->curves) == nil(g->curves))
+      newc = new_curve(g->curves, 0);
+    else newc = new_curve(g->curves, last(g->curves)->num + 1);
+    lastc = g->curves; 
+    while(1) {
+      lastc = prev(lastc);
+      if (lastc == nil(g->curves) || lastc->num < num) {
+        error_header(); 
+        fprintf(stderr, "copycurve: curve #%d not found\n", num);
+        exit(1);
+      }
+      if (lastc->num == num) {
+        copy_curve(newc, lastc);
+        return newc;
+      }
+    }
+  }
+  return newc; /* To shut lint up */
+}
+
+Label do_copy_string(g, gs, all_gs)
+Graph g;
+Graphs gs;
+Graphs all_gs;
+{
+  String lastl, newl;
+  Graph oldg;
+  Graphs oldgs;
+  int num;
+
+  if (!getint(&num)) {
+    rejecttoken();
+    oldgs = gs;
+    oldg = g;
+    while(gs != nil(all_gs)) {
+      if (gs != oldgs) g = last(gs->g);
+      while(g != nil(gs->g)) {
+        if (first(g->strings) == nil(g->strings)) g = prev(g);
+        else {
+          lastl = last(g->strings);
+          if (first(oldg->strings) == nil(oldg->strings))
+            newl = new_string(oldg->strings, 0);
+          else newl = new_string(oldg->strings, last(oldg->strings)->num + 1);
+          copy_label(newl->s, lastl->s);
+          return newl->s;
+        }
+      }
+      gs = prev(gs);
+    }
+    error_header(); 
+    fprintf(stderr, "Cannot perform copystring on first string\n");
+    exit(1);
+    return newl->s; /* To shut lint up */
+  } else {
+    if (first(g->strings) == nil(g->strings))
+      newl = new_string(g->strings, 0);
+    else newl = new_string(g->strings, last(g->strings)->num + 1);
+    lastl = g->strings; 
+    while(1) {
+      lastl = prev(lastl);
+      if (lastl == nil(g->strings) || lastl->num < num) {
+        error_header(); 
+        fprintf(stderr, "copystring: string #%d not found\n", num);
+        exit(1);
+      }
+      if (lastl->num == num) {
+        copy_label(newl->s, lastl->s);
+        return newl->s;
+      }
+    }
+  }
+}
+
+Graph last_graph(g, gs, all_gs)
+Graph g;
+Graphs gs;
+Graphs all_gs;
+{
+  Graph lastg;
+
+
+  lastg = prev(g);
+  while(lastg == nil(gs->g)) {
+    if (prev(gs) == nil(all_gs)) {
+      error_header(); 
+      fprintf(stderr, "First graph cannot inherit axes\n");
+      exit(1);
+    } else {
+      gs = prev(gs);
+      lastg = last(gs->g);
+    }
+  }
+  return lastg;
+}
+
+copy_legend(l1, l2)
+Legend l1, l2;
+{
+  l1->linelength = l2->linelength;
+  l1->linebreak = l2->linebreak;
+  l1->midspace = l2->midspace;
+  l1->type = l2->type;
+  copy_label(l1->l, l2->l);
+}
+
+inherit_axes(g, lastg)
+Graph g;
+Graph lastg;
+{
+  char *s;
+  copy_axis(g->x_axis, lastg->x_axis);
+  copy_axis(g->y_axis, lastg->y_axis);
+  g->x_translate = lastg->x_translate;
+  g->y_translate = lastg->y_translate;
+  g->clip = lastg->clip;
+  g->border = lastg->border;
+  copy_legend(g->legend, lastg->legend);
+  s = g->title->label;
+  copy_label(g->title, lastg->title);
+  g->title->label = s;
+}
+
+getpattern(inp_str, key, p, a)
+char *inp_str, *key, *p;
+float *a;
+{
+  int i;
+  float f;
+
+  if (!getstring(inp_str)) return;
+  for (i = 0; i < NPATTERNS; i++) {
+    if (strcmp(inp_str, PATTERNS[i]) == 0) {
+      *p = PTYPES[i];
+      if (getfloat(&f)) {
+        *a = f;
+      } else {
+        rejecttoken();
+      }
+      i = NPATTERNS + 1;
+    } 
+  }
+  if (i == NPATTERNS) {
+    error_header(); fprintf(stderr, "Bad %s: %s\n", key, inp_str);
+    error_header(); fprintf(stderr, "             Valid %ss are:", key);
+    for (i = 0; i < NPATTERNS; i++) fprintf(stderr, " %s", PATTERNS[i]);
+    fprintf(stderr, "\n");
+    exit(1);
+  }
+  return;
+}
+
+edit_curve(c, g)
+Curve c;
+Graph g;
+{
+  char inp_str[256], *txt;
+  float x, y, f, e1, e2;
+  float xh, yh, xl, yl;
+  Point p, p1, p2;
+  Flist fl;
+  FILE *fi;
+  int i;
+  char e;
+
+  while ( getstring(inp_str) ) {
+    if (strcmp(inp_str, "y_epts") == 0 ||
+        strcmp(inp_str, "pts") == 0    ||
+        strcmp(inp_str, "x_epts") == 0) {
+      e = inp_str[0];
+      while (getfloat(&x)) {
+        if (e == 'p') {
+          if (!getfloat(&y)) {
+            error_header(); 
+            fprintf(stderr, "Reading Points, no y value for x=%f\n", x);
+            exit(1);
+          }
+        } else {
+          if (!getfloat(&y) || !getfloat(&e1) || !getfloat(&e2)) {
+            error_header();
+              fprintf(stderr, 
+                      "Reading %s, need 4 values per data point\n", inp_str);
+              exit(1);
+          }
+        }
+        p = (Point) get_node(c->pts);
+        p->x = x;
+        p->y = y;
+        p->e = e;
+	insert(p, c->pts);
+        c->npts++;
+        if (e == 'x') {
+          p1 = (Point) get_node(c->xepts);
+          p1->x = e1;
+          p1->y = y;
+          p2 = (Point) get_node(c->xepts);
+          p2->x = e2;
+          p2->y = y;
+	  insert(p1, c->xepts);
+	  insert(p2, c->xepts);
+          xh = MAX(e1, e2); xh = MAX(xh, x);
+          xl = MIN(e1, e2); xl = MIN(xl, x);
+          yh = y; yl = y;
+        } else if (e == 'y') {
+          p1 = (Point) get_node(c->yepts);
+          p1->y = e1;
+          p1->x = x;
+          p2 = (Point) get_node(c->yepts);
+          p2->y = e2;
+          p2->x = x;
+	  insert(p1, c->yepts);
+	  insert(p2, c->yepts);
+          yh = MAX(e1, e2); yh = MAX(yh, y);
+          yl = MIN(e1, e2); yl = MIN(yl, y);
+          xh = x; xl = x;
+        } else {
+          xh = x; xl = x; yh = y; yl = y;
+        }
+        if (g->x_axis->pmax == FSIG) {
+          g->x_axis->pmax = xh;
+          g->x_axis->pmin = xl;
+          g->y_axis->pmax = yh;
+          g->y_axis->pmin = yl;
+        } else {
+          g->x_axis->pmax = MAX(g->x_axis->pmax, xh);
+          g->x_axis->pmin = MIN(g->x_axis->pmin, xl);
+          g->y_axis->pmax = MAX(g->y_axis->pmax, yh);
+          g->y_axis->pmin = MIN(g->y_axis->pmin, yl);
+        }
+      }
+      rejecttoken();
+
+    } else if (strcmp(inp_str, "label") == 0) {
+      edit_label(c->l);
+    } else if (strcmp(inp_str, "marksize") == 0) {
+      if (!getfloat(&f)) rejecttoken(); 
+      else {
+        c->marksize[0] = f;
+        if (!getfloat(&f)) rejecttoken(); 
+        else c->marksize[1] = f;
+      }
+    } else if (strcmp(inp_str, "gmarks") == 0) {
+      while (getfloat(&x)) {
+        if (!getfloat(&y)) {
+          error_header(); 
+          fprintf(stderr, "Reading GMarks, no y value for x=%f\n", x);
+          exit(1);
+        }
+        p =  (Point) get_node(c->general_marks);
+        p->x = x;
+        p->y = y;
+        insert(p, c->general_marks);
+      }
+      rejecttoken();
+    } else if (strcmp(inp_str, "pfill") == 0) {
+        if (!getfloat(&f)) rejecttoken(); else {
+          /* grey fill */
+          c->pfilltype = 'g';
+          c->pfill[0] = f;
+        }
+    } else if (strcmp(inp_str, "pcfill") == 0) {
+         /* color fill */
+        c->pfilltype = 'c';
+        for( i = 0 ; i < 3 ; i++ )  {
+          if(!getfloat(&f)) {
+            rejecttoken();
+            c->pfilltype = 'n';
+            break ;
+          } else c->pfill[i] = f ;
+        }
+    } else if (strcmp(inp_str, "fill") == 0) {
+        if (!getfloat(&f)) rejecttoken(); else {
+          /* grey fill */
+          c->filltype = 'g';
+          c->fill[0] = f;
+        }
+    } else if (strcmp(inp_str, "cfill") == 0) {
+         /* color fill */
+        c->filltype = 'c';
+        for( i = 0 ; i < 3 ; i++ )  {
+          if(!getfloat(&f)) {
+            rejecttoken();
+            c->filltype = 'n';
+            break ;
+          } else c->fill[i] = f ;
+        }
+    } else if (strcmp(inp_str, "afill") == 0) {
+	if (!getfloat(&f)) rejecttoken(); else {
+	  c->afilltype = 'g';
+          c->afill[0] = f;
+	}
+    } else if (strcmp(inp_str, "acfill") == 0) {
+	c->afilltype = 'c';
+	for( i = 0 ; i < 3 ; i++ )  {
+	  if(!getfloat(&f)) { 
+	    rejecttoken(); 
+ 	    c->afilltype = 'n';
+            break ;
+	  } else c->afill[i] = f ;
+	}
+    } else if (strcmp(inp_str, "marktype") == 0) {
+      if (!getstring(inp_str)) return;
+      for (i = 0; i < NMARKTYPES && strcmp(inp_str, MARKTYPESTRS[i]) != 0; i++) ;
+      if (i == NMARKTYPES) {
+        error_header(); fprintf(stderr, "Bad mark: %s\n", inp_str);
+        fprintf(stderr, "             Valid marks are:");
+        for (i = 0; i < NMARKTYPES; i++) {
+          fprintf(stderr, " %s", MARKTYPESTRS[i]);
+        }
+        fprintf(stderr, "\n");
+        exit(1);
+      } else {
+        c->marktype = MARKTYPES[i];
+        if (c->marktype == 'l') edit_label(c->lmark);
+      }
+    } else if (strcmp(inp_str, "glines") == 0) {
+      while (getfloat(&f)) {
+        fl = (Flist) get_node (c->gen_linetype);
+        fl->f = f;
+        insert(fl, c->gen_linetype);
+      } 
+      rejecttoken();
+    } else if (strcmp(inp_str, "pattern") == 0) {
+      getpattern(inp_str, "pattern", &(c->pattern), &(c->parg));
+    } else if (strcmp(inp_str, "apattern") == 0) {
+      getpattern(inp_str, "apattern", &(c->apattern), &(c->aparg));
+    } else if (strcmp(inp_str, "ppattern") == 0) {
+      getpattern(inp_str, "ppattern", &(c->ppattern), &(c->pparg));
+
+    } else if (strcmp(inp_str, "linetype") == 0) {
+      if (!getstring(inp_str)) return;
+      if (strcmp(inp_str, "none") == 0) c->linetype = '0';
+      else if (strcmp(inp_str, "solid") == 0) c->linetype = 's';
+      else if (strcmp(inp_str, "dotted") == 0) c->linetype = '.';
+      else if (strcmp(inp_str, "dashed") == 0) c->linetype = '-';
+      else if (strcmp(inp_str, "longdash") == 0) c->linetype = 'l';
+      else if (strcmp(inp_str, "dotdash") == 0) c->linetype = 'd';
+      else if (strcmp(inp_str, "dotdotdash") == 0) c->linetype = 'D';
+      else if (strcmp(inp_str, "dotdotdashdash") == 0) c->linetype = '2';
+      else if (strcmp(inp_str, "general") == 0) c->linetype = 'g';
+      else {
+        error_header(); fprintf(stderr, "Bad line type: %s\n", inp_str);
+        error_header(); fprintf(stderr, "             Valid marks are %s\n", 
+          "solid, dotted, dashed, longdash, dotdash,"); 
+        error_header(); fprintf(stderr, "             %s.\n", 
+          "dotdotdash, dotdotdashdash, none");
+        exit(1);
+      }
+    } else if (strcmp(inp_str, "linethickness") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else c->linethick = f;
+    } else if (strcmp(inp_str, "gray") == 0) {
+        if (!getfloat(&f)) rejecttoken(); else {
+          c->graytype = 'g';
+          c->gray[0] = f;
+        }
+    } else if (strcmp(inp_str, "color") == 0) {
+        c->graytype = 'c';
+        for( i = 0 ; i < 3 ; i++ )  {
+          if(!getfloat(&f)) {
+            rejecttoken();
+            c->graytype = 'n';
+            break ;
+          } else c->gray[i] = f ;
+        }
+    } else if (strcmp(inp_str, "mrotate") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else {
+        c->mrotate = f;
+      }
+    } else if (strcmp(inp_str, "eps") == 0) {
+      if (!getstring(inp_str)) {
+        error_header();
+        fprintf(stderr, "eps token must be followed by an %s\n",
+                "encapsulated postscript file\n");
+        exit(1);
+      }
+      c->marktype = 'E';
+      c->eps = (char *) malloc ((strlen(inp_str)+1)*sizeof(char));
+      strcpy(c->eps, inp_str);
+      fi = fopen(c->eps, "r");
+      if (fi == NULL) {
+        error_header();
+        fprintf(stderr, "couldn't open eps file '%s'\n", c->eps);
+        exit(1);
+      }
+      fclose(fi);
+    } else if (strcmp(inp_str, "postscript") == 0) {
+      if (!getstring(inp_str)) return;
+      c->marktype = 'p';
+      if (strcmp(inp_str, ":") == 0) {
+        c->postfile = 0;
+        if ((txt = getmultiline()) == CNULL) return;
+        c->postscript = txt;
+      } else {
+        c->postfile = 1;
+        c->postscript = (char *) malloc ((strlen(inp_str)+1)*sizeof(char));
+        strcpy(c->postscript, inp_str);
+        fi = fopen(c->postscript, "r");
+        if (fi == NULL) {
+          error_header();
+          fprintf(stderr, "couldn't open postscript file '%s'\n", 
+                  c->postscript);
+          exit(1);
+        }
+        fclose(fi);
+      }
+    } else if (strcmp(inp_str, "poly") == 0) {
+      c->poly = 1;
+    } else if (strcmp(inp_str, "nopoly") == 0) {
+      c->poly = 0;
+    } else if (strcmp(inp_str, "larrow") == 0) {
+      c->larrow = 1;
+    } else if (strcmp(inp_str, "nolarrow") == 0) {
+      c->larrow = 0;
+    } else if (strcmp(inp_str, "rarrow") == 0) {
+      c->rarrow = 1;
+    } else if (strcmp(inp_str, "norarrow") == 0) {
+      c->rarrow = 0;
+    } else if (strcmp(inp_str, "larrows") == 0) {
+      c->larrows = 1;
+    } else if (strcmp(inp_str, "nolarrows") == 0) {
+      c->larrows = 0;
+    } else if (strcmp(inp_str, "rarrows") == 0) {
+      c->rarrows = 1;
+    } else if (strcmp(inp_str, "norarrows") == 0) {
+      c->rarrows = 0;
+    } else if (strcmp(inp_str, "bezier") == 0) {
+      c->bezier = 1;
+    } else if (strcmp(inp_str, "nobezier") == 0) {
+      c->bezier = 0;
+    } else if (strcmp(inp_str, "asize") == 0) {
+      if (!getfloat(&f)) rejecttoken(); 
+      else {
+        c->asize[0] = f;
+        if (!getfloat(&f)) rejecttoken(); 
+        else c->asize[1] = f;
+      }
+    } else if (strcmp(inp_str, "clip") == 0) {
+      c->clip = 1;
+    } else if (strcmp(inp_str, "noclip") == 0) {
+      c->clip = 0;
+    } else {
+      rejecttoken();
+      return;
+    }
+  }
+}
+
+edit_hash_label(a)
+Axis a;
+{
+  float at, f;
+  char *s;
+  char inp_str[256];
+  String st;
+  int done;
+
+  s = CNULL;
+
+  at = (first(a->hash_lines) == nil(a->hash_lines)) ? FSIG
+          : first(a->hash_lines)->loc;
+  while(1) {
+    done = 0;
+    if (getstring(inp_str)) {
+      if (strcmp(inp_str, ":") == 0) {
+        if ((s = getlabel()) == CNULL) return;
+      } else if (strcmp(inp_str, "at") == 0) {
+        if (getfloat(&f)) {
+          at = f;  
+        } else {
+          rejecttoken();
+          done = 1;
+        }
+      } else {
+        rejecttoken();
+        done = 1;
+      }
+    } else {
+      done = 1;
+    }
+    if (done) {
+      if (s == CNULL) return;
+      if (at == FSIG) {
+        error_header();
+        fprintf(stderr, 
+          "hash_label either needs \"at\" or an associated \"hash_at\"\n");
+        exit(1);
+      }
+      st = (String) get_node(a->hash_labels);
+      st->s = new_label();
+      st->s->label = s;
+      st->s->x = at;
+      st->s->y = at;
+      insert(st, a->hash_labels);
+      return;
+    }
+  }
+}
+
+edit_axis(a)
+Axis a;
+{
+  char inp_str[256];
+  float f;
+  int i;
+  Hash h;
+
+  while ( getstring(inp_str) ) {
+
+    if (strcmp(inp_str, "size") == 0) {
+      if ( getfloat(&f)) a->size = f; else rejecttoken();
+    } else if (strcmp(inp_str, "max") == 0) {
+      if ( getfloat(&f)) a->max = f; else rejecttoken();
+    } else if (strcmp(inp_str, "min") == 0) {
+      if ( getfloat(&f)) a->min = f; else rejecttoken();
+    } else if (strcmp(inp_str, "hash") == 0) {
+      if ( getfloat(&f)) a->hash_interval = f; else rejecttoken();
+    } else if (strcmp(inp_str, "shash") == 0) {
+      if ( getfloat(&f)) {
+        a->hash_start = f;
+        a->start_given = 1;
+        } 
+      else rejecttoken();
+    } else if (strcmp(inp_str, "mhash") == 0) {
+      if (getint(&i)) a->minor_hashes = i; else rejecttoken();
+    } else if (strcmp(inp_str, "precision") == 0) {
+      if (getint(&i)) a->precision = i; else rejecttoken();
+    } else if (strcmp(inp_str, "label") == 0) {
+      edit_label(a->label);
+    } else if (strcmp(inp_str, "hash_format") == 0) {
+      if (!getstring(inp_str)) return;
+      if (strcmp(inp_str, "g") == 0) {
+        a->hash_format = 'g';
+      } else if (strcmp(inp_str, "G") == 0) {
+        a->hash_format = 'G';
+      } else if (strcmp(inp_str, "E") == 0) {
+        a->hash_format = 'E';
+      } else if (strcmp(inp_str, "e") == 0) {
+        a->hash_format = 'e';
+      } else if (strcmp(inp_str, "f") == 0) {
+        a->hash_format = 'f';
+      } else {
+        error_header();
+        fprintf(stderr, "Invalid hash_style %s.  Must be f, g, G, e or E\n",
+                inp_str);
+        exit(1);
+      }
+    } else if (strcmp(inp_str, "hash_labels") == 0) {
+      edit_label(a->hl);
+    } else if (strcmp(inp_str, "log_base") == 0) {
+      if (getfloat(&f)) {
+        if (f <= 1.0) {
+          error_header();
+          fprintf(stderr, "\"log_base %f\": log_base must be > 1.0\n", f);
+          exit(1);
+        } else a->log_base = f; 
+      } else rejecttoken();
+    } else if (strcmp(inp_str, "draw_at") == 0) {
+      if ( getfloat(&f)) a->draw_at = f; else rejecttoken();
+    } else if (strcmp(inp_str, "log") == 0) {
+      a->is_lg = 1;
+    } else if (strcmp(inp_str, "linear") == 0) {
+      a->is_lg = 0;
+    } else if (strcmp(inp_str, "nodraw") == 0) {
+      a->draw_hash_labels = 0;
+      a->draw_axis_line = 0;
+      a->draw_hash_marks = 0;
+      a->draw_axis_label = 0;
+    } else if (strcmp(inp_str, "draw") == 0) {
+      a->draw_hash_labels = 1;
+      a->draw_axis_line = 1;
+      a->draw_hash_marks = 1;
+      a->draw_axis_label = 1;
+    } else if (strcmp(inp_str, "hash_at") == 0 ||
+               strcmp(inp_str, "mhash_at") == 0) {
+      if (getfloat(&f)) {
+        h = (Hash) get_node (a->hash_lines);
+        h->loc = f;
+        h->major = (inp_str[0] == 'h');
+        h->size = h->major ? HASH_SIZE : MHASH_SIZE;
+        insert(h, a->hash_lines);
+      } else rejecttoken();
+    } else if (strcmp(inp_str, "hash_label") == 0) {
+      edit_hash_label(a);       
+    } else if (strcmp(inp_str, "hash_scale") == 0) {
+      if ( getfloat(&f)) a->hash_scale = f; else rejecttoken();
+    } else if (strcmp(inp_str, "auto_hash_marks") == 0) {
+      a->auto_hash_marks = 1;
+    } else if (strcmp(inp_str, "no_auto_hash_marks") == 0) {
+      a->auto_hash_marks = 0;
+    } else if (strcmp(inp_str, "auto_hash_labels") == 0) {
+      a->auto_hash_labels = 1;
+    } else if (strcmp(inp_str, "no_auto_hash_labels") == 0) {
+      a->auto_hash_labels = 0;
+    } else if (strcmp(inp_str, "draw_hash_labels_at") == 0) {
+      if (getfloat(&f)) a->draw_hash_labels_at = f; else rejecttoken();
+    } else if (strcmp(inp_str, "draw_hash_marks_at") == 0) {
+      if (getfloat(&f)) a->draw_hash_marks_at = f; else rejecttoken();
+    } else if (strcmp(inp_str, "no_draw_hash_labels") == 0) {
+      a->draw_hash_labels = 0;
+    } else if (strcmp(inp_str, "draw_hash_labels") == 0) {
+      a->draw_hash_labels = 1;
+    } else if (strcmp(inp_str, "no_draw_axis_line") == 0) {
+      a->draw_axis_line = 0;
+    } else if (strcmp(inp_str, "draw_axis_line") == 0) {
+      a->draw_axis_line = 1;
+    } else if (strcmp(inp_str, "no_draw_axis") == 0) {
+      a->draw_axis_line = 0;
+    } else if (strcmp(inp_str, "draw_axis") == 0) {
+      a->draw_axis_line = 1;
+    } else if (strcmp(inp_str, "no_draw_hash_marks") == 0) {
+      a->draw_hash_marks = 0;
+    } else if (strcmp(inp_str, "draw_hash_marks") == 0) {
+      a->draw_hash_marks = 1;
+    } else if (strcmp(inp_str, "no_draw_axis_label") == 0) {
+      a->draw_axis_label = 0;
+    } else if (strcmp(inp_str, "draw_axis_label") == 0) {
+      a->draw_axis_label = 1;
+    } else if (strcmp(inp_str, "no_grid_lines") == 0) {
+      a->grid_lines = 0;
+    } else if (strcmp(inp_str, "grid_lines") == 0) {
+      a->grid_lines = 1;
+    } else if (strcmp(inp_str, "no_mgrid_lines") == 0) {
+      a->mgrid_lines = 0;
+    } else if (strcmp(inp_str, "mgrid_lines") == 0) {
+      a->mgrid_lines = 1;
+    } else if (strcmp(inp_str, "gray") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else {
+        a->graytype = 'g';
+        a->gray[0] = f;
+      }
+    } else if (strcmp(inp_str, "color") == 0) {
+      a->graytype = 'c';
+      for( i = 0 ; i < 3 ; i++ )  {
+        if(!getfloat(&f)) {
+          rejecttoken();
+          a->graytype = 'n';
+          break ;
+        } else a->gray[i] = f ;
+      }
+    } else if (strcmp(inp_str, "grid_gray") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else {
+        a->gr_graytype = 'g';
+        a->gr_gray[0] = f;
+      }
+    } else if (strcmp(inp_str, "grid_color") == 0) {
+      a->gr_graytype = 'c';
+      for( i = 0 ; i < 3 ; i++ )  {
+        if(!getfloat(&f)) {
+          rejecttoken();
+          a->gr_graytype = 'n';
+          break ;
+        } else a->gr_gray[i] = f ;
+      }
+    } else if (strcmp(inp_str, "mgrid_gray") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else {
+        a->mgr_graytype = 'g';
+        a->mgr_gray[0] = f;
+      }
+    } else if (strcmp(inp_str, "mgrid_color") == 0) {
+      a->mgr_graytype = 'c';
+      for( i = 0 ; i < 3 ; i++ )  {
+        if(!getfloat(&f)) {
+          rejecttoken();
+          a->mgr_graytype = 'n';
+          break ;
+        } else a->mgr_gray[i] = f ;
+      }
+    } else {
+      rejecttoken(); 
+      return;
+    }
+  }
+}
+
+edit_legend(l)
+Legend l;
+{
+  char inp_str[256];
+  float f;
+
+  while ( getstring(inp_str) ) {
+    if (strcmp(inp_str, "x") == 0) {
+      if (!getfloat(&f)) rejecttoken(); 
+      else {
+        l->l->x = f; 
+        l->l->hj = 'l';
+        l->l->vj = 't';
+        l->type = 'u';
+      }
+    } else if (strcmp(inp_str, "y") == 0) {
+      if (!getfloat(&f)) rejecttoken(); 
+      else {
+        l->l->y = f; 
+        l->l->hj = 'l';
+        l->l->vj = 't';
+        l->type = 'u';
+      }
+    } else if (strcmp(inp_str, "right") == 0 ||
+               strcmp(inp_str, "on") == 0) {
+      l->type = 'u';
+      l->l->y = FSIG; 
+      l->l->x = FSIG; 
+      l->l->hj = 'l';
+      l->l->vj = 'c';
+    } else if (strcmp(inp_str, "left") == 0) {
+      l->type = 'u';
+      l->l->y = FSIG; 
+      l->l->x = FSIG; 
+      l->l->hj = 'r';
+      l->l->vj = 'c';
+    } else if (strcmp(inp_str, "off") == 0) {
+      l->type = 'n';
+    } else if (strcmp(inp_str, "top") == 0) {
+      l->type = 'u';
+      l->l->y = FSIG; 
+      l->l->x = FSIG; 
+      l->l->hj = 'l';
+      l->l->vj = 'b';
+    } else if (strcmp(inp_str, "bottom") == 0) {
+      l->type = 'u';
+      l->l->y = FSIG; 
+      l->l->x = FSIG; 
+      l->l->hj = 'l';
+      l->l->vj = 't';
+    } else if (strcmp(inp_str, "custom") == 0) {
+      l->type = 'c';
+    } else if (strcmp(inp_str, "linelength") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else l->linelength = f;
+    } else if (strcmp(inp_str, "linebreak") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else l->linebreak = f;
+    } else if (strcmp(inp_str, "midspace") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else l->midspace = f;
+    } else if (strcmp(inp_str, "defaults") == 0) {
+      edit_label(l->l);
+    } else {
+      rejecttoken();
+      return;
+    }
+  }
+}
+
+edit_graph(g, gs, all_gs)
+Graph g;
+Graphs gs;
+Graphs all_gs;
+{
+  char inp_str[80];
+  int num;
+  String s;
+  float f;
+
+  while ( getstring(inp_str) ) {
+    if (strcmp(inp_str, "xaxis") == 0)
+      edit_axis(g->x_axis);
+    else if (strcmp(inp_str, "yaxis") == 0)
+      edit_axis(g->y_axis);
+    else if (strcmp(inp_str, "curve") == 0) {
+      if (!getint(&num)) {
+        error_header(); fprintf(stderr, "\"curve\" not followed by number\n");
+        exit(1);
+      }
+      edit_curve(get_curve(g->curves, num), g);
+    } else if (strcmp(inp_str, "newcurve") == 0) {
+      if (first(g->curves) == nil(g->curves))
+        edit_curve(new_curve(g->curves, 0), g);
+      else edit_curve(new_curve(g->curves, last(g->curves)->num + 1), g);
+    } else if (strcmp(inp_str, "copycurve") == 0) {
+      edit_curve(do_copy_curve(g, gs, all_gs), g);
+    } else if (strcmp(inp_str, "newline") == 0) {
+      if (first(g->curves) == nil(g->curves))
+        edit_curve(new_line(g->curves, 0), g);
+      else edit_curve(new_line(g->curves, last(g->curves)->num + 1), g);
+    } else if (strcmp(inp_str, "title") == 0) {
+      edit_label(g->title);
+    } else if (strcmp(inp_str, "legend") == 0) {
+      edit_legend(g->legend);
+    } else if (strcmp(inp_str, "x_translate") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else g->x_translate = f;
+    } else if (strcmp(inp_str, "y_translate") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else g->y_translate = f;
+    } else if (strcmp(inp_str, "string") == 0) {
+      if (!getint(&num)) {
+        error_header(); fprintf(stderr, "\"string\" not followed by number\n");
+        exit(1);
+      }
+      s = get_string(g->strings, num);
+      edit_label(s->s);
+    } else if (strcmp(inp_str, "newstring") == 0) {
+      if (first(g->strings) == nil(g->strings))
+        s = new_string(g->strings, 0);
+      else s = new_string(g->strings, last(g->strings)->num + 1);
+      edit_label(s->s);
+    } else if (strcmp(inp_str, "copystring") == 0 ||
+               strcmp(inp_str, "copyline") == 0) {
+      edit_label(do_copy_string(g, gs, all_gs));
+    } else if (strcmp(inp_str, "inherit_axes") == 0) {
+      inherit_axes(g, last_graph(g, gs, all_gs));
+    } else if (strcmp(inp_str, "Y") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else gs->height = f;
+    } else if (strcmp(inp_str, "X") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else gs->width = f;
+    } else if (strcmp(inp_str, "border") == 0) {
+      g->border = 1;
+    } else if (strcmp(inp_str, "noborder") == 0) {
+      g->border = 0;
+    } else if (strcmp(inp_str, "clip") == 0) {
+      g->clip = 1;
+    } else if (strcmp(inp_str, "noclip") == 0) {
+      g->clip = 0;
+    } else {
+      rejecttoken();
+      return;
+    } 
+  }
+}
+
+edit_graphs(gs)
+Graphs gs;
+{
+  Graphs the_g;
+  Graph g, tmp_g;
+  char inp_str[80];
+  float f;
+  int num, i, ok, j;
+
+  the_g = first(gs);
+  while ( getstring(inp_str) ) {
+    if (strcmp(inp_str, "graph") == 0) {
+      if (!getint(&num)) {
+        error_header(); fprintf(stderr, "\"graph\" not followed by number\n");
+        exit(1);
+      }
+      edit_graph(get_graph(the_g->g, num), the_g, gs);
+    } else if (strcmp(inp_str, "newgraph") == 0) {
+      if (first(the_g->g) == nil(the_g->g))
+        edit_graph(new_graph(the_g->g, 0), the_g, gs);
+      else edit_graph(new_graph(the_g->g, last(the_g->g)->num + 1), the_g, gs);
+    } else if (strcmp(inp_str, "copygraph") == 0) {
+      if (first(the_g->g) == nil(the_g->g))
+        g = new_graph(the_g->g, 0);
+      else g = new_graph(the_g->g, last(the_g->g)->num + 1);
+      if (!getint(&num)) {
+        rejecttoken();
+        inherit_axes(g, last_graph(g, the_g, gs));
+      } else {
+        ok = 0;
+        tmp_g = the_g->g;
+        while(!ok) {
+          tmp_g = prev(tmp_g);
+          if (tmp_g == nil(the_g->g) || tmp_g->num < num) {
+            error_header();
+            fprintf(stderr, "copygraph: no graph #%d\n", num);
+            exit(1);
+          }
+          ok = (tmp_g->num == num);
+        }
+        inherit_axes(g, tmp_g);
+      }
+      edit_graph(g, the_g, gs);
+    } else if (strcmp(inp_str, "Y") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else the_g->height = f;
+    } else if (strcmp(inp_str, "X") == 0) {
+      if (!getfloat(&f)) rejecttoken(); else the_g->width = f;
+    } else if (strcmp(inp_str, "newpage") == 0) {
+      new_graphs(gs);
+      the_g = last(gs);
+    } else if (strcmp(inp_str, "bbox") == 0) {
+      for (i = 0; i < 4; i++) {
+        if (!getint(&j)) {
+          error_header();
+          fprintf(stderr, "Bbox definition must have four integers\n");
+          exit(1);
+        } else {
+          the_g->bb[i] = j;
+        }
+      }
+    } else if (strcmp(inp_str, "preamble") == 0) {
+      if (!getstring(inp_str)) return;
+      if (strcmp(inp_str, ":") != 0) {
+        the_g->prefile = 1;
+        the_g->preamble = (char *) malloc (sizeof(char)*(strlen(inp_str)+1));
+        strcpy(the_g->preamble, inp_str);
+      } else {
+        the_g->prefile = 0;
+        the_g->preamble = getmultiline();
+        if (the_g->preamble == CNULL) return;
+      }
+    } else if (strcmp(inp_str, "epilogue") == 0) {
+      if (!getstring(inp_str)) return;
+      if (strcmp(inp_str, ":") != 0) {
+        the_g->epifile = 1;
+        the_g->epilogue = (char *) malloc (sizeof(char)*(strlen(inp_str)+1));
+        strcpy(the_g->epilogue, inp_str);
+      } else {
+        the_g->epifile = 0;
+        the_g->epilogue = getmultiline();
+        if (the_g->epilogue == CNULL) return;
+      }
+    } else {
+      error_header(); fprintf(stderr, "Bad token: %s\n", inp_str);
+      exit(1);
+    } 
+  }
+}
Index: /trunk/Jgraph/ex1.jgr
===================================================================
--- /trunk/Jgraph/ex1.jgr	(revision 418)
+++ /trunk/Jgraph/ex1.jgr	(revision 418)
@@ -0,0 +1,36 @@
+(* This is a graph for Figure 1 of the USENIX jgraph abstract.  It shows
+   three simple curves plotted with jgraph.
+
+   There are two graphs plotted -- the first is the actual jgraph.  The
+   second is a text string showing the input for the graph.  Print it 
+   out -- you'll see what I mean.
+   *)
+
+newgraph
+xaxis size 2 
+yaxis size 1.5 
+
+newcurve pts 0 6  1 9  2 11  3 14  4 18 5 20
+newcurve marktype triangle linetype solid
+         pts 0 3  1 4  2 7  3 9  4 10 5 13
+newcurve marktype none linetype dashed
+         pts 0 0  1 2  2 3  3 5  4 6  5 9
+
+copygraph
+x_translate -3.5
+border
+xaxis nodraw min 0 max 1 size 2.8
+yaxis nodraw min 0 max 1
+
+newstring hjl vjc x .05 y .5 font Courier fontsize 7 :
+newgraph\
+  newcurve \
+    pts 0 6  1 9  2 11  3 14  4 18 5 20\
+  newcurve \
+    marktype triangle \
+    linetype solid\
+    pts 0 3  1 4  2 7  3 9  4 10 5 13\
+  newcurve \
+    marktype none \
+    linetype dashed\
+    pts 0 0  1 2  2 3  3 5  4 6  5 9
Index: /trunk/Jgraph/ex2.jgr
===================================================================
--- /trunk/Jgraph/ex2.jgr	(revision 418)
+++ /trunk/Jgraph/ex2.jgr	(revision 418)
@@ -0,0 +1,58 @@
+(* This is a graph for Figure 2 of the USENIX jgraph abstract.  It shows
+   how to extract points from a data file with awk, and how to use awk
+   to plot a function to match the data (the function that is plot here
+   is (n/k)log(n), where k is expermentally chosen to be 35000.
+
+   There are two graphs plotted -- the first is the actual jgraph.  The
+   second is a text string showing the input for the graph.  Print it 
+   out -- you'll see what I mean.
+
+   *)
+
+newgraph
+xaxis size 2.5 
+  hash_labels font Helvetica
+  label : Number of indexed Records (N)
+yaxis size 2.1 
+  label : Running time (seconds)
+  hash_labels font Helvetica
+
+newcurve 
+  marktype cross
+  label : Data
+  pts shell : awk '{print $5, $8}' data.txt
+
+newcurve
+  marktype none linetype solid
+  label : N log N / 35000
+   pts shell : nawk \
+     ' $5 != 0 { \
+       print $5,  $5 * log($5) / 35000}' \
+     data.txt
+
+copygraph
+x_translate -3.1
+border
+xaxis nodraw min 0 max 1 size 2.3
+yaxis nodraw min 0 max 1
+
+newstring hjl vjc x .03 y .5 font Courier fontsize 6 :
+xaxis size 2.5 \
+  hash_labels font Helvetica\
+  label : Number of indexed Records (N)\
+yaxis size 2.1 \
+  label : Running time (seconds)\
+  hash_labels font Helvetica\
+\
+newcurve \
+  marktype cross\
+  label : Data\
+  pts shell : awk '{print $5, $8}' data.txt\
+\
+newcurve\
+  marktype none linetype solid\
+  label : N log N / 35000\
+   pts shell : nawk \\
+     ' $5 != 0 { \\
+       print $5,  $5 * log($5) / 35000}' \\
+     data.txt\
Index: /trunk/Jgraph/exit.c
===================================================================
--- /trunk/Jgraph/exit.c	(revision 418)
+++ /trunk/Jgraph/exit.c	(revision 418)
@@ -0,0 +1,49 @@
+/*
+**++
+**  FUNCTIONAL DESCRIPTION:
+**
+**      Exit is a VMS replacement for the standard Unix exit function
+**
+**  FORMAL PARAMETERS:
+**
+**      error_code	integer passed by value (optional)
+**
+**  SIDE EFFECTS:
+**
+**      Exit will never return to calling program
+**	VMS exit status ($STATUS) will be set
+**--
+**/
+#include <varargs.h>
+
+exit(va_alist)
+va_dcl
+{
+	int		nargs;
+	va_list		va;
+	int		exit_code = 0;
+	/*
+	 * Pick up the argument, if present
+	 */
+	va_count(nargs);
+	va_start(va);
+	if (nargs > 0) exit_code = va_arg(va,int);
+	/*
+	 * Set the VMS $STATUS to the appropriate value:
+	 *	if exit_code == 0 then $STATUS := success
+	 *	if exit_code >  0 then $STATUS := error
+	 *	if exit_code <  0 then $STATUS := severe_error
+	 * and perform exit.
+	 *
+	 * Note:
+	 *	the %X10000000 added to the actual success/error indicator
+	 *	will prevent DCL from printing a message.
+	 *	A 'on error' will be obeyed however.
+	 */
+	if (exit_code == 0)		/* success	*/
+		sys$exit(0x10000001);
+	else if (exit_code > 0)		/* error	*/
+		sys$exit(0x10000002);
+	else				/* severe error	*/
+		sys$exit(0x10000004);
+}
Index: /trunk/Jgraph/g8.jgr
===================================================================
--- /trunk/Jgraph/g8.jgr	(revision 418)
+++ /trunk/Jgraph/g8.jgr	(revision 418)
@@ -0,0 +1,67 @@
+(* $Log:	g8.jgr,v $
+ * Revision 1.1  90/10/12  17:33:33  jsp
+ * Initial revision
+ * 
+ *)
+
+Y 3
+
+(* Graph #8: Frequency of Traps.   This graph shows examples of plotting
+ * character strings. *) 
+
+newgraph
+
+yaxis size 1.9 min 0 max 10 hash 1 mhash 0
+  hash_labels fontsize 7
+  label fontsize 8 : Traps per 0.1 second Interval
+
+xaxis size 2.14 min 0 max 2.6001 hash .5 mhash 4 precision 1
+  hash_labels fontsize 7
+  label fontsize 8 : Starting Time of 0.1 second interval (sec)
+
+title fontsize 10 : Graph 8: Frequency of Traps.
+
+newcurve
+  marktype circle fill 0
+  linetype none
+  pts 
+    0.0 9
+    0.1 3
+    0.2 5
+    0.3 6
+    0.4 6
+    0.5 5
+    0.6 6
+    0.7 6
+    0.8 6 
+    0.9 6
+    1.0 6
+    1.1 4 
+    1.2 5
+    1.3 3
+    1.4 4
+    1.5 5
+    1.6 3
+    1.7 5
+    1.8 5
+    1.9 4
+    2.0 3
+    2.1 4
+    2.2 5
+    2.3 5
+    2.4 4
+    2.5 0
+    2.6 0
+
+newstring 
+  : Average Trap Time = 0.015 seconds
+  x 2.6 y 10
+  hjr vjc
+  fontsize 7
+
+newstring
+  : ...
+  x 2.7 y 0
+  hjl vjb
+  fontsize 7
+
Index: /trunk/Jgraph/g8col.jgr
===================================================================
--- /trunk/Jgraph/g8col.jgr	(revision 418)
+++ /trunk/Jgraph/g8col.jgr	(revision 418)
@@ -0,0 +1,72 @@
+(* $Log:	g8.jgr,v $
+ * Revision 1.1  90/10/12  17:33:33  jsp
+ * Initial revision
+ * 
+ *)
+
+Y 3
+
+(* Graph #8: Frequency of Traps.   This graph shows examples of plotting
+ * character strings. *) 
+
+newgraph 
+
+yaxis size 1.9 min 0 max 10 hash 1 mhash 0
+  hash_labels fontsize 7
+  label fontsize 8 : Traps per 0.1 second Interval
+
+xaxis size 2.14 min 0 max 2.6001 hash .5 mhash 4 precision 1
+  hash_labels fontsize 7
+  label fontsize 8 : Starting Time of 0.1 second interval (sec)
+
+newcurve marktype box cfill 1 1 0 marksize 11 60 pts 1.3 5
+
+copygraph 
+
+title fontsize 10 : Graph 8: Frequency of Traps.
+
+
+newcurve
+  marktype circle fill 0
+  linetype none
+  pts 
+    0.0 9
+    0.1 3
+    0.2 5
+    0.3 6
+    0.4 6
+    0.5 5
+    0.6 6
+    0.7 6
+    0.8 6 
+    0.9 6
+    1.0 6
+    1.1 4 
+    1.2 5
+    1.3 3
+    1.4 4
+    1.5 5
+    1.6 3
+    1.7 5
+    1.8 5
+    1.9 4
+    2.0 3
+    2.1 4
+    2.2 5
+    2.3 5
+    2.4 4
+    2.5 0
+    2.6 0
+
+newstring 
+  : Average Trap Time = 0.015 seconds
+  x 2.6 y 10
+  hjr vjc
+  fontsize 7
+
+newstring
+  : ...
+  x 2.7 y 0
+  hjl vjb
+  fontsize 7
+
Index: /trunk/Jgraph/g9n10.jgr
===================================================================
--- /trunk/Jgraph/g9n10.jgr	(revision 418)
+++ /trunk/Jgraph/g9n10.jgr	(revision 418)
@@ -0,0 +1,152 @@
+(* This file plots two graphs side by side with a tricky legend format:
+ * There are 5 legend entries, one of which is of a curve containing a
+ * line.  The desire is to make the legend have two columns, the first
+ * with the first three legend entries, and the second with the last
+ * two.
+ * 
+ * The way that this is done is to actually plot four graphs -- two sets
+ * of two graphs superimposed on each other.  The first of the two
+ * graphs has the first three curves, and the second has the last two. 
+ * Thus, the first can set its legend to be the first column, and the
+ * second can set its legend to be the second column.
+ * 
+ * To get the two columns is pretty simple.  In each graph, the 
+ * x and y coordinates of the legends are explicitly set.  For the
+ * first column, the x coordinate is 0, and for the second column,
+ * the x coordinate is 5.5.
+ *
+ * A potential problem with this graph is that in the first set of
+ * legends, there is a line (the "Merge Sort" curve), while in the
+ * second set there is not.  Thus, if nothing is done with the midspace
+ * and linelength paramters, the second columns marks will appear closer
+ * to the text than in the first column.  The solution to this was to 
+ * explicitly set the linelength and midspace in the first legend to
+ * be .80 and .25 respectively.  This means that in the first legend, the
+ * marks are 0.65 units away from the text (in the presence of a line,
+ * the marks are (midspace + linelength/2) away from the text.  In 
+ * the absence of a line, the marks are simply (midspace) away from the
+ * text.  Thus, midspace is set to be 0.65 in the second legend column.
+ *)
+
+(* Set up the axes of the first graph.  Translate it to the left of the 
+ * page *)
+
+newgraph
+x_translate -1.37
+yaxis size 1.9 min 0 max 40 precision 0 hash 10 mhash 1
+  label : Time (sec)
+    fontsize 8
+xaxis size 2.14 min 0 max 10 hash 2 mhash 1
+  label : Heap Size (MBytes)
+    fontsize 8
+title : Graph 9: Checkpoint Time of Other Benchmarks.
+  fontsize 10
+
+(* Draw the first three curves *)
+newcurve
+  label : Merge Sort
+  marktype circle fill 0.0 
+  linetype solid
+  pts 
+    .789 5.5414
+   2.985 13.9958
+   3.962 17.2362
+   4.938 21.0804
+   7.868 32.4082
+   9.821 39.8312
+newcurve
+  label : Travelling Salesman
+  marktype triangle fill 0 
+  linetype none
+  pts 
+.064 2.359
+newcurve
+  label : Pattern Match
+  marktype diamond fill 1.0 
+  linetype none
+  pts 
+1.233 6.374
+
+(* set the legend *)
+legend linelength .8 midspace .25 x 0 y 47.5 defaults fontsize 7
+
+(* Now make a second graph for the second curve with the same axes *)
+copygraph
+xaxis nodraw
+yaxis nodraw
+
+(* Draw the last two curves *)
+newcurve
+  label : Bubble Sort
+  marktype cross fill 1.0 
+  linetype none
+  pts 
+.513 3.91
+newcurve
+  label : Matrix Multiplication
+  marktype box fill 1 
+  linetype none
+  pts 
+3 14.71
+
+(* set the second legend to be a second column from the first  *)
+legend x 5.5 midspace .65
+
+(* The second of these graphs is just like the first only it is translated
+to the right *)
+
+copygraph
+x_translate 1.7
+xaxis draw
+yaxis draw
+yaxis min 0 max 5 hash 1 mhash 1
+title : Graph 10: Checkpoint Overhead of Other Benchmarks.
+  fontsize 10
+
+newcurve
+  label : Merge Sort
+  marktype circle fill 0.0 
+  linetype solid
+  pts 
+    .789 0.5954
+   2.985 3.8368
+   3.962 3.3598
+   4.938 3.6288
+   7.868 4.3096
+   9.821 4.377
+
+newcurve
+  label : Travelling Salesman
+  marktype triangle fill 0 
+  linetype none
+  pts 
+.064 0.17
+
+newcurve
+  label : Pattern Match
+  marktype diamond fill 1.0 
+  linetype none
+  pts 
+1.233 0.07
+
+legend linelength .8 midspace .25 x 0 y 5.9 defaults fontsize 7
+
+copygraph
+xaxis nodraw
+yaxis nodraw
+
+newcurve
+  label : Bubble Sort
+  marktype cross fill 1.0 
+  linetype none
+  pts 
+.513 0.07
+
+newcurve
+  label : Matrix Multiplication
+  marktype box fill 1 
+  linetype none
+  pts 
+3 0.75
+
+legend x 5.5 midspace .65
Index: /trunk/Jgraph/gpaper.jgr
===================================================================
--- /trunk/Jgraph/gpaper.jgr	(revision 418)
+++ /trunk/Jgraph/gpaper.jgr	(revision 418)
@@ -0,0 +1,9 @@
+newgraph
+
+xaxis size 7 min 0 max 7 hash 1 mhash 9
+yaxis size 9 min 0 max 9 hash 1 mhash 9
+
+copygraph
+
+xaxis hash_scale 1 grid_lines mgrid_lines mgrid_gray .5
+yaxis hash_scale 1 grid_lines mgrid_lines mgrid_gray .5
Index: /trunk/Jgraph/hypercube.jgr
===================================================================
--- /trunk/Jgraph/hypercube.jgr	(revision 418)
+++ /trunk/Jgraph/hypercube.jgr	(revision 418)
@@ -0,0 +1,70 @@
+(* 
+ * $Source: /n/fs/vd/jsp/papers/dckp/RCS/hypercube.jgr,v $
+ * $Revision: 4.4 $
+ * $Date: 91/10/03 13:56:21 $
+ * $Author: jsp $
+ * 
+ * Jgraph file containing a picture of a 3-D hypercube.
+ *)
+
+Y 2.3
+newgraph
+xaxis size 2.5 min 0 max 2.5 nodraw
+yaxis size 2 min 0 max 2 nodraw
+legend x 2.8 y 1.25
+   linelength 0.5
+
+(* The links are drawn first, so that the nodes will be drawn over them. *)
+
+newline linethickness 2 pts 0 0 1.5 0
+copycurve pts 0 1.5 1.5 1.5
+copycurve pts .5 .5 2.0 .5
+copycurve pts 2 2 .5 2
+  label fontsize 12 : Dimension 0 links
+
+newline linethickness 2 linetype dotted pts 0 0 0 1.5
+copycurve pts 1.5 0 1.5 1.5
+copycurve pts .5 .5 .5 2.0
+copycurve pts 2 2 2 .5
+  label fontsize 12 : Dimension 1 links
+
+newline linethickness 2 linetype dashed pts 0 0 .5 .5
+copycurve pts 0 1.5 .5 2
+copycurve pts 1.5 0 2.0 .5
+copycurve pts 1.5 1.5 2 2
+  label fontsize 12 : Dimension 2 links
+
+
+(* Now draw the nodes with fill 0 so that they will draw white over the 
+ * link overlap *)
+
+newcurve pts 
+  0 0
+  0 1.5
+  1.5 0
+  1.5 1.5
+  marksize .35
+  marktype circle
+  fill 1
+newcurve pts
+  .5 .5
+  .5 2
+  2 .5
+  2 2
+  marksize .27
+  marktype circle
+  fill 1
+
+(* Now draw the node labels inside the nodes *)
+
+newstring   x 0   y 0   fontsize 12 hjc vjc : 000
+copystring  x 1.5 y 0   : 001
+copystring  x 0   y 1.5 : 010
+copystring  x 1.5 y 1.5 : 011
+
+copystring  x 0.5 y 0.5 fontsize 10 : 100
+copystring  x 2.0 y 0.5 : 101
+copystring  x 0.5 y 2.0 : 110
+copystring  x 2.0 y 2.0 : 111
+
+
Index: /trunk/Jgraph/jgraph.1
===================================================================
--- /trunk/Jgraph/jgraph.1	(revision 418)
+++ /trunk/Jgraph/jgraph.1	(revision 418)
@@ -0,0 +1,1663 @@
+.\" SCCSID: @(#)jgraph.1	1.1	10/23/89
+.\" SCCSID: @(#)jgraph.1	1.1	10/23/89
+.TH jgraph 1
+.SH NAME
+jgraph \- filter for graph plotting to postscript
+.SH SYNTAX
+.B jgraph 
+[\-\fIp\fR\|]
+[\-\fIP\fR\|]
+[\-\fIL\fR\|]
+[\-\fIcomments\fR\|]
+[\fIfilename\fR ...\|]
+.SH DESCRIPTION
+\fBJgraph\fR
+takes the description of a graph or graphs
+and produces a postscript file on the standard output.  
+\fBJgraph\fR
+is ideal for plotting any mixture of scatter point graphs, line
+graphs, and/or bar graphs, and embedding the output into LaTeX, or
+any other text processing system which can read postscript.
+.sp
+\fBJgraph\fR reads its input from the specified files.  If no
+files are specified, then it reads from standard input.
+.sp
+The graph description language is simple enough to get nice looking
+graphs with a minimum of effort, yet powerful enough to give the user
+the flexibility to tailor the appearance of the graph to his or her
+individual preferences.  This includes plotting multiple graphs and
+laying them out separately on the page (or pages).
+.sp
+As an example, if the user wanted to simply plot the points (2,3),
+(4,5), (1,6), the following would be enough of a specification file:
+.PP
+.nf
+	newgraph
+	newcurve pts 2 3 4 5 1 6
+.fi
+.PP
+Now, if the user wanted to spruce the graph up by adding labels to
+the axes, connecting the points, and titling the graph, then the
+input could change to:
+.PP
+.nf
+	newgraph
+	newcurve pts 2 3 4 5 1 6 linetype solid
+	xaxis label : X axis
+	yaxis label : Y axis
+	title : This is an example graph
+.fi
+.PP
+If the user instead wanted this to be a bar graph with different
+endpoints on the axes, he/she could simply change the input to:
+.PP
+.nf
+	newgraph
+	xaxis min 0 max 5 label : X axis
+	yaxis min 0 max 6 label : Y axis
+	newcurve pts 2 3 4 5 1 6 marktype xbar
+	title : This is an example bar graph
+.fi
+.PP
+There are many more features of the description language, which are
+described below in the next section.  Features which are not embedded
+within the description language are: line and function interpolation,
+function plotting, and pie graphs.  The latter is impossible to do
+with the aid of 
+\fBjgraph, \fR
+however, the others can be effected with
+\fBjgraph \fR
+mixed with awk or c.  See 
+FUNCTION PLOTTING AND OTHER NON-INHERENT FEATURES 
+below.
+.sp
+Also below is a section 
+HINTS AND EXAMPLE GRAPHS, which may give good
+ideas on how to use 
+\fBjgraph \fR
+more effectively.
+.SH OPTIONS
+.TP
+.B \-P
+The 
+\fB\-P\fR
+option produces postscript which can be piped directly to 
+\fBlpr,\fR  
+which can be displayed in an Xwindows environment with
+\fBgs\fR
+(ghostscript).
+Without this option, the output should be embedded within 
+\fBLaTeX\fR
+or a similar text processing system.
+.TP
+.B \-L
+The 
+\fB\-L\fR
+option produces a landscape plot.
+.TP
+.B \-p
+The 
+\fB\-p\fR
+option re-prints the input on the standard output, only
+with all the defaults made explicit.  This is useful for letting the
+user do his/her own special formatting, as it shows the explicit
+values that the defaults assume, so that they can be manipulated.
+.TP
+.B \-comments
+This option makes jgraph put comments into the output postscript.  These
+make it easier for the user to wade through the final postscript if 
+necessary. 
+.SH THE DESCRIPTION LANGUAGE
+The description language is essentially keywords followed by
+attributes.  All keywords and attributes except for string attributes
+are tokens -- non-white-space characters surrounded by white-space. 
+Special tokens are 
+``(*'', ``*)'', ``include'', ``:'', and ``shell'', which denote
+comments, include-file statements, string identifiers, and shell-include
+statements:
+.TP 
+.B Comments
+Comments are surrounded by the tokens ``(*'' ``*)'' as in
+Modula-2 (except that here, the tokens must be surrounded by white-
+space).  Comments may be nested.  If the comment runs to the end of a
+file, the last ``*)'' may be omitted.
+.TP 
+.B Include\-file statements
+The token following an ``include'' token is
+expected to be a file name.  The result of the statement is to
+include the contents of the file at that point.  Include-file
+statments can be nested within included files, and within shell
+includes.
+.TP 
+.B Strings
+In places where strings are required (as in graph and
+curve labels), they are denoted by the token ``:''.  The second
+character after the ``:'' starts the string, and the next newline
+character terminates it.  
+Thus, the string ``Graph #1'' can be denoted as:
+.nf
+
+	: Graph #1<newline>
+
+or
+
+	:<newline>
+	Graph #1<newline>
+
+.fi
+One can get multiline strings by making
+a backslash the last character before the newline on all but the
+last line.  Notice that in strings white-space is not ignored.  
+This way of denoting strings allows the user to embed leading and
+trailing spaces, as well as the null string.  For example, the
+null string ``'' is represented by:
+.nf
+
+	: <newline>
+
+.fi
+Once a string has been started, it may contain any character.
+Specifically, it may contain the sequence ``(*'', ``shell'', 
+or ``include'' without starting a comment or including a file.
+Each line of a string must contain less than 1000 characters.  Otherwise
+string sizes are limited only by the size of memory.
+.TP
+.B Shell\-include statements
+Shell include statements are of the form ``shell'', ``:'', and then
+a string.  The result of the statement is that the string is executed
+(using popen, which passes the string to sh), and the standard
+output is included at that point.  Shell-includes can be freely
+nested within include-files and other shell-includes.  Shell 
+commands may be more than one line, but must not exceed 1000 characters.
+The shell statement is not (yet) available on VMS.
+.TP
+.B Notation
+In the descriptions below: 
+.RS
+.TP
+\fBtk \|{\fIinteger\fB\|}\fR
+means that token
+\fBtk \fR
+must be followed by an integer.  
+.TP
+\fBtk \|[\fIinteger\fB\|]\fR
+means that 
+\fBtk\fR
+may be followed by an integer, but doesn't have to.  In most cases, if
+\fBtk\fR
+is not followed by an integer, then the command denoted by
+\fBtk \fR
+is ignored.  
+.TP
+\fBtk \|[\|{\fIinteger\fB\|} \|{\fIinteger\fB\|}\|]*
+means that 
+\fBtk\fR
+must be
+followed by an even number of integers.  
+.PD
+.LP
+Supported types other than
+integer are: 
+\fB\|{\fIfloat\fB\|} \fR
+for floating point entries, 
+\fB\|{\fItoken\fB\|} \fR
+for any
+token, and 
+\fB\|{\fIstring\fB\|} \fR
+for a string as defined above.
+.RE
+.TP
+.B TOP-LEVEL DESCRIPTION COMMANDS
+.RS
+.TP
+.B newgraph
+This starts editing a new graph (see GRAPH EDITING
+COMMANDS).  Note that multiple graphs may be drawn on the same page.
+.TP
+\fBgraph \|{\fIinteger\fB\|}\fR
+This edits the graph denoted by 
+\fB\|{\fIinteger\fB\|}.  \fR
+If the graph doesn't exist, then this command creates it and starts
+editing it.  
+\fBNewgraph\fR
+is simply an abbreviation for 
+\fB\fIgraph\fB \fIn\fB\fR
+where n=0 if this is the first graph, otherwise n=m+1, where m is the
+largest number of any graph so far.
+.TP
+\fBcopygraph \|[\fIinteger\fB\|]\fR
+This creates a new graph, and copies all the attributes from the
+graph
+\fB\|[\fIinteger\fB\|]'s\fR
+x and y axes, as well as its 
+\fB\fIx_translate\fB\fR
+and 
+\fB\fIy_translate\fB\fR
+values, the clipping, the legend defaults, and 
+the title defaults.   If the
+\fB\|[\fIinteger\fB\|]\fR
+is omitted, then it copies its values from the ``previous''
+graph, which is 
+defined to be the graph with the largest number 
+less than the currrent graph's number.  If the current 
+graph has the smallest number, then it will take the last graph from 
+the previous page of graphs.  If there is no previous page, then an 
+error will be flagged.
+(copygraph does not copy the values of the 
+\fB\fIhash_at\fB, \fImhash_at\fB,\fR
+and 
+\fB\fI\fIhash_label\fB\fR 
+attributes). 
+.TP
+.B newpage
+This command is for plotting graphs on multiple pages.  After a 
+\fBnewpage,\fR
+the graphs that the user enters will be plotted on a new page.
+New graphs and strings will be numbered starting with 0.  
+Essentially, 
+\fB\fInewpage\fB\fR
+is the same as appending together the output of separate calls of
+jgraph on the text before the 
+\fB\fInewpage,\fB\fR
+and on the text after the 
+\fB\fInewpage.\fB\fR
+\fB\fINewpage\fB\fR
+will most likely produce bizarre results if the
+\fB\-P\fR
+option is not specified.
+.TP
+\fBX \|[\fIfloat\fB\|]\fR
+.br
+.ns
+.TP
+\fBY \|[\fIfloat\fB\|]\fR
+Postscript files to be embedded in LaTeX (and some other programs)
+contain a ``bounding box''
+which defines the area which LaTeX will allocate for the postscript.
+Other programs use this bounding box as well, sometimes using it
+to define where to clip the postscript image.
+\fBJgraph \fR
+uses the axis lines and labels, and the title to generate its 
+bounding box.  Most of the time that's good enough to work in 
+LaTeX.  The 
+\fB\fIY\fB\fR
+and
+\fB\fIX\fB\fR
+commands say to make the height and width of the bounding box at least
+\fB\fIY\fB\fR
+and
+\fB\fIX\fB\fR
+inches, respectively, but to maintain the current centering of the 
+graph.  If you still need further control over the
+bounding box (e.g. to change the centering), try the
+\fB\fIbbox\fB\fR
+command.  If there's more than one page in the jgraph file, 
+\fB\fIY,\fB\fR
+\fB\fIX\fB\fR
+and
+\fB\fIbbox\fB\fR
+values can be given for each graph.
+.TP
+\fBbbox \fIfloat\fB \fIfloat\fB \fIfloat\fB \fIfloat\fB\fR
+If the 
+\fB\fIY\fB\fR
+and
+\fB\fIX\fB\fR
+commands aren't enough to help you define a good bounding box, this
+command lets you explicitly enter one which will go directly into the 
+jgraph output.  Its units are the 
+final postscript units.  It's probably best to use the 
+\fB\-p\FR 
+option
+to see what the bounding box is that jgraph produces, and then
+alter that accordingly with
+\fB\fIbbox.\fB\fR
+The main use for this is to change the automatic centering that jgraph
+performs:  Usually the center of the bounding box that jgraph computes 
+is put at the center of the page.  Changing the bbox changes this 
+center.
+.TP
+\fBpreamble : \|{\fIstring\fB\|}\fR   
+.br
+.ns
+.TP
+\fBpreamble {\fItoken\fB\|}\fR   
+.br
+.ns
+.TP
+\fBepilogue : \|{\fIstring\fB\|}\fR   
+.br
+.ns
+.TP
+\fBepilogue {\fItoken\fB\|}\fR   
+These two commands allow the user to include strings or
+files (the token specifies the filename) which will be copied directly 
+into jgraph's output.
+The \fIpreamble\fB is included at the beginning of the output
+(after some initial postscript to set things up for jgraph), 
+and the \fIepilogue\fB is included at the end.  A good use for
+the \fIpreamble\fB is to set up a postscript dictionary if you're
+using postscript marks.
+.PD
+.RE
+.LP
+.TP
+.B GRAPH EDITING COMMANDS
+These commands act on the current graph. 
+Graph editing is terminated when one of the top-level description
+commands is given.
+.RS
+.TP
+\fBxaxis\fR
+.br
+.ns
+.TP
+\fByaxis\fR
+Edit the x or y axis (see AXIS EDITING COMMANDS)
+.TP
+\fBnewcurve\fR  
+This starts editing a new curve of the graph (see CURVE
+EDITING COMMANDS).
+.TP
+\fBcurve \|{\fIinteger\fB\|}\fR   
+This edits the curve denoted by 
+\fB\|{\fIinteger\fB\|}.  \fR
+If the curve doesn't exist, then this command creates it and starts
+editing it.  
+\fINewcurve\fB
+and 
+\fIcurve\fB
+interact as 
+\fInewgraph\fB
+and
+\fIgraph\fB
+do.
+.TP
+\fBnewline\fR  
+This is an abbreviation for:
+.PP
+.nf
+	  newcurve marktype none linetype solid
+.fi
+.PP
+.TP
+\fBcopycurve \|[\fIinteger\fB\|]\fR
+This starts editing a new curve of the graph, and copies all its 
+values except for the points from curve 
+\fB\|[\fIinteger.\fB\|]\fR
+If the 
+\fB\|[\fIinteger\fB\|]\fR
+is omitted, then it copies its values from the 
+last curve in this graph.  If this graph currently has
+no curves, then it searches backwards from the previous graph.
+.TP
+\fBtitle\fR   
+This edits the title of the graph (see LABEL EDITING
+COMMANDS).  The title is given a default location centered beneath
+the graph, and a default font size of 12, however, as with all
+labels, this can be changed.
+.TP
+\fBlegend\fR   
+The edits the legend of the graph (see LEGEND EDITING
+COMMANDS).  As a default, the graph will contain a legend
+if any of its curves have labels.
+.TP
+\fBnewstring\fR   
+This edits a new text string (see LABEL EDITING
+COMMANDS).  This is useful as it allows the user to plot text on the
+graph as well as curves.
+.TP
+\fBstring \|{\fIinteger\fB\|}\fR   
+.br
+.ns
+.TP
+\fBcopystring \|[\fIinteger\fB\|]\fR
+\fIString\fB
+and
+\fIcopystring\fB
+are to 
+\fInewstring\fB
+as
+\fIcurve\fB
+and
+\fIcopycurve\fB
+are to
+\fInewcurve.\fB
+.TP
+\fBborder\fR
+.br
+.ns
+.TP
+\fBnoborder\fR
+\fIBorder\fR\fB
+draws a square border around the area defined by the axes.
+\fINoborder\fB
+specifies no border.
+\fINoborder\fB
+is the default.  
+.TP
+\fBclip\fR
+.br
+.ns
+.TP
+\fBnoclip\fR
+\fIClip\fB
+specifies that all curves in the graph will be clipped -- that is,
+no points outside of the of axes will be plotted.  Clipping can also be
+specified on a per-curve basis.  The default is
+\fInoclip.\fB
+.TP
+\fBinherit_axes\fR   
+This is an old command which is kept for backward compatibility.
+\fICopycurve.\fB
+is equivalent to:
+.PP
+.nf
+	  newgraph inherit_axes
+.fi
+.PP
+.TP
+\fBx_translate \|[\fIfloat\fB\|]\fR   
+.br
+.ns
+.TP
+\fBy_translate \|[\fIfloat\fB\|]\fR   
+By default, the bottom left-hand corner of each graph is at point
+(0,0) (final postscript units).
+\fIX_translate\fB
+and
+\fIY_translate\fB
+translate the bottom left-hand corner of the graph 
+\fB\|[\fIfloat\fB\|] \fR
+inches.  The main use of this is to draw more than one graph on 
+a page.  Note that jgraph considers all the graphs drawn on the
+page when it computes its bounding box for centering.  Thus, if
+only one graph is drawn, it will always be centered on the page, 
+regardless of its 
+\fIX_translate\fB
+and
+\fIY_translate\fB
+values.  These values are used for relative placement of the graphs.
+   To change the centering of the graphs, use
+\fIbbox.\fB
+.TP
+\fBX \|[\fIfloat\fB\|]\fR
+.br
+.ns
+.TP
+\fBY \|[\fIfloat\fB\|]\fR   
+These are the same as 
+\fIX\fB
+and 
+\fIY\fB
+in the
+Top-level commands, except that they let the user continue editing
+the current graph.
+.PD
+.RE
+.LP
+.TP
+.B SIMPLE AXIS EDITING COMMANDS
+These commands act on the current
+axis as chosen by 
+\fIxaxis\fB
+or
+\fIyaxis\fB
+(see GRAPH EDITING COMMANDS). 
+Axis editing terminates when a graph or top-level command is given. 
+There are more advanced axis editing commands given below which have
+to do with moving the hash marks, adding new hash marks and labels,
+etc.  See ADVANCED AXIS EDITING COMMANDS.
+.RS
+.TP
+\fBlinear\fR
+.br
+.ns
+.TP
+.B log
+Set the axis to be linear or logarithmic. The
+default is linear.  If the axis is set to be logarithmic, then values
+<= 0.0 will be disallowed, as they are at negative infinity on the
+axis.
+.TP
+\fBmin \|[\fIfloat\fB\|]\fR
+.br
+.ns
+.TP
+\fBmax \|[\fIfloat\fB\|]\fR   
+Set the minimum and maximum values of
+this axis.  Defaults depend on the points given.  They can be seen by
+using the 
+\fB\-p \fR
+option.  Unless stated, all units (for example point
+plotting, string plotting, etc.) will be in terms of the
+\fImin\fB
+and
+\fImax\fB
+values of the x and y axes.
+.TP
+\fBsize \|[\fIfloat\fB\|]\fR   
+Set the size of this axis in inches.
+.TP
+\fBlog_base \|[\fIfloat\fB\|]\fR   
+Set the base of the logarithmic axis. Default =
+10.  This is the value which determines which hash
+marks and hash labels are automatically produced.
+.TP
+\fBhash \|[\fIfloat\fB\|]\fR   
+Hash marks will be 
+\fB\|[\fIfloat\fB\|] \fR
+units apart.  Default = -1.  
+If this value equals 0, then there will be no hash marks.  If
+this value is less than 0, then the hash marks will be automatically
+set by 
+\fBjgraph \fR
+(see 
+\fB\-p \fR
+for the value).  By default, each hash mark
+will be labeled with its value.  
+\fIHash\fB
+and 
+\fIshash\fB
+are ignored if
+the axes are logarithmic.
+.TP
+\fBshash \|[\fIfloat\fB\|]\fR   
+Make sure there is a hash mark at the point
+\fB\|[\fIfloat\fB\|] \fR
+along the axis.  The default is set by 
+\fBjgraph\fR
+if
+\fBhash\fR
+= -1.
+If 
+\fIhash\fB
+is set by the user, 
+\fIshash\fB
+is defaulted to the
+\fImin\fB
+value of the axis.
+.TP
+\fBmhash \|[\fIinteger\fB\|]\fR   
+Put 
+\fB\|[\fIinteger\fB\|] \fR
+minor hash marks between the above
+hash marks.  Default = -1.  If this value equals 0, then there will
+be no minor hash marks.  If this value is negative, then the value
+will be chosen by 
+\fBjgraph \fR
+(see 
+\fB\-p\fR
+for the value).
+.TP
+\fBprecision \|[\fIinteger\fB\|]\fR   
+.TP
+\fBhash_format \fItoken\fB\fR   
+These control how jgraph formats the automatic hash labels.
+The user shouldn't have to worry about these values, except in
+extreme cases.  Jgraph uses \fBprintf\fR to format the labels.
+If \fBhash_format\fR is ``f'' (the default), then the 
+value of a hash label is printed with 
+.PP
+.nf
+	printf("%.*f", precision, value).
+.fi
+.PP
+Other valid \fBhash_format\fR values are ``G'', ``g'', ``E'', and ``e''.
+``G'' is a good generic format which converts to scientific notation 
+if the value becomes too big or too small.
+If the precision is negative, then jgraph chooses a default:  For 
+``g'' and ``G'', the default is 6.  For ``e'' and ``E'', the default
+is 0, and for ``f'', jgraph tries to determine a reasonable default.
+Please read the man page of \fBprinf(1)\fR for a complete description
+of how it formats floating point numbers.
+.TP
+\fBlabel\fR   
+Edit the label of this axis (see LABEL EDITING COMMANDS). 
+By default, the label is in font ``Times-Bold'', and has a font size of
+10.  If the user doesn't change any of the plotting attributes of the
+label, 
+\fBjgraph \fR
+chooses an appropriate place for the axis label.
+.TP
+\fBdraw_at \|[\fIfloat\fB\|]\fR   
+Draw the axis line at this point on the other axis. 
+The default is usually the other axis's 
+\fImin, \fB
+however if 
+\fIhash_scale \fB
+is positive (see 
+\fIhash_scale \fB
+under ADVANCED AXIS EDITING), it will be
+the other axis's 
+\fImax.\fB
+.TP
+\fBnodraw\fR   
+Do not draw the axis, the hash marks or any labels.  This
+is useful for plotting points with no axes, and for overlaying graphs
+on top of one another with no clashes.  This is equivalent to
+\fIno_draw_axis,\fB
+\fIno_draw_axis_label,\fB
+\fIno_draw_hash_marks,\fB
+and
+\fIno_draw_hash_labels.\fB
+.TP
+\fBdraw\fR   
+Cancels the effect of 
+\fInodraw.  \fB
+Default = 
+\fIdraw.\fB
+This is
+equivalent to 
+\fIdraw_axis,\fB
+\fIdraw_axis_label,\fB
+\fIdraw_hash_marks,\fB
+and 
+\fIdraw_hash_labels.\fB
+.TP
+\fBgrid_lines\fR
+.br
+.ns
+.TP
+\fBno_grid_lines\fR
+\fIGrid_lines\fB
+specifies to plot a grid line at each major hash
+mark on this axis.  The default is 
+\fIno_grid_lines.\fB
+.TP
+\fBmgrid_lines\fR
+.br
+.ns
+.TP
+\fBno_mgrid_lines\fR
+\fIMgrid_lines\fB
+specifies to plot a grid line at each minor hash
+mark on this axis.  The default is 
+\fIno_mgrid_lines.\fB
+.PD
+.RE
+.LP
+.TP
+.B CURVE EDITING COMMANDS 
+These commands act on the current curve as
+chosen by 
+\fInewcurve\fB
+or 
+\fIcurve\fB
+(see GRAPH EDITING COMMANDS).  Curve
+editing terminates when a graph or top-level command is given.
+.RS
+.TP
+\fBpts \|[\|{\fIfloat\fB\|} \|{\fIfloat\fB\|}\|]*\fR   
+This sets the points to plot in this
+curve.  The first 
+\fIfloat\fB
+is the x value, and the second 
+\fIfloat\fB
+is the y
+value of the point.  Points are plotted in the order specified.
+This command stops reading points when a non-float is given.
+The user can specify this command multiple times within a curve -- 
+each time, simply more points are added to the curve.
+.TP
+\fBx_epts \|[\|{\fIfloat\fB\|} \|{\fIfloat\fB\|} \|{\fIfloat\fB\|} \|{\fIfloat\fB\|}\|]*\fR   
+.br
+.ns
+.TP
+\fBy_epts \|[\|{\fIfloat\fB\|} \|{\fIfloat\fB\|} \|{\fIfloat\fB\|} \|{\fIfloat\fB\|}\|]*\fR   
+This allows the user to specify points and ``confidence values'' (otherwise
+known as ``error bars'').  The first two 
+\fIfloats\fB
+specify the x and y values of
+the point, as above.  If
+\fBx_epts\fR
+is specified,  then the second two
+\fIfloats\fB
+specify range or confidence values
+for the x value of the point.  
+Error bars will be printed to each of these x values (using the 
+original point's y value)
+from the original point.  Similarly,
+\fIy_epts\fB
+specifies range or confidence values for the y value of the point.
+\fIpts\fB
+\fIx_epts\fB
+and
+\fIy_epts\fB
+can all be intermixed. 
+.TP
+\fBmarktype\fR   
+This sets the kind of mark that is plotted for this curve.  Valid
+marks are: \fIcircle\fR, \fIbox\fR, \fIdiamond\fR, \fItriangle\fR,
+\fIx\fR, \fIcross\fR, \fIellipse\fR, \fIxbar\fR, \fIybar\fR,
+\fItext\fR, \fIpostscript\fR, \fIeps\fR, \fInone\fR, and variants of
+\fIgeneral\fR.  Most of these are self-explanatory, except for the
+last few: 
+  \fIXbar\fR makes the curve into a bar graph with the bars going
+to the x axis.  \fIYbar\fR has the bars going to the y axis. 
+  \fIText\fR lets the user plot text instead of a mark.  The text is 
+editted as a label (see LABEL EDITING COMMANDS) immediately following
+the \fItext\fR command.  The x and y fields of the label have special
+meanings here:  They define where the label is to be printed in relation
+to the curve points.  For example, if they are both 0, the label will
+be printed directly on the curve points.  If x is 1.0 and y is -1.0, then
+the label will be printed one unit to the right and one unit below the
+curve points (units are units of the x and y axes).
+Default label values are 0 for x and y, and center justification.
+  \fIPostscript:\fR See the \fIpostscript\fB token below.
+  \fIEps:\fR See the \fIeps\fB token below.
+  \fINone\fR means that no mark will be
+plotted (this is useful for drawing lines).  
+  There are four types of \fIgeneral\fR marks, which work using the 
+\fIgmarks\fB command described below.  The four marktypes are 
+\fIgeneral\fR, \fIgeneral_nf\fR, \fIgeneral_bez\fR, and 
+\fIgeneral_bez_nf\fR.
+  By default, a new mark is chosen for each curve.
+.TP
+\fBmarksize \|[\fIfloat\fB\|] \|[\fIfloat\fB\|]\fR   
+This sets the size of the mark.  The
+first 
+\fB\|[\fIfloat\fB\|] \fR
+is the width of the mark, and the second is the height. 
+Units are those of the x and y axes respectively, unless that axis is
+logarithmic, in which case the units are inches.  Negative marksizes
+are allowed (e.g.  a negative height will flip a \fItriangle\fR mark). 
+The default mark size can be determined using the 
+\fB\-p\fR
+option of
+\fBjgraph\fR
+.TP
+\fBmrotate \|[\fIfloat\fB\|]\fR
+This allows the user to rotate the mark
+\fB\|[\fIfloat\fB\|] \fR
+degrees.  Default is zero.
+.TP
+\fBgray \|[\fIfloat\fB\|]\fR
+.br
+.ns
+.TP
+\fBcolor \|[\fIfloat\fB \fIfloat\fB \fIfloat\fB\|]\fR   
+These specify either the grayness of the curve or its color.  Values 
+for 
+\fIgray\fR
+should be from 0 (black) to 1 (white).  Values for
+\fIcolor\fR\fB
+should also be from 0 to 1.  They are RGB values, and thus define the 
+amount of red, green and blue in the curve respectively.  Specifying
+color nullifies the gray value, and vice versa.  The default is 
+\fIgray 0\fB
+.TP
+\fBfill \|[\fIfloat\fB\|]\fR   
+.br
+.ns
+.TP
+\fBcfill \|[\fIfloat\fB\| \|\fIfloat\fB\| \|\fIfloat\fB\|]\fR   
+This sets the filling of marks which define an area
+to fill (e.g.  \fIbox\fR, \fIcircle\fR, \fIxbar\fR).  
+\fIfill\fB
+defines a gray value, and 
+\fIcfill\fB
+defines a color value (see 
+\fIgray\fB
+and
+\fIcolor\fB
+above for a description of the units).
+The default is 
+\fIfill 0\fB
+(black).
+.TP
+\fBpattern \fItoken\fB \|[\fIfloat\fB\|]\fR   
+This defines the how the mark is to be filled.  \fIToken\fR
+may be \fIsolid\fR (the default), \fIstripe\fR, or \fIestripe\fR.  If 
+\fIsolid\fR, then the \fIfloat\fR is ignored, and the mark is
+completely filled in with either the gray value defined by
+\fIfill\fR or the color value defined by \fIcfill\fR.
+If \fIstripe\fR, then the mark will be filled with stripes of
+either the gray value defined by \fIfill\fR or the color defined
+by \fIcfill\fR.  The stripes will be rotated by \fIfloat\fR 
+degrees.  \fIEstripe\fR differs from \fIstripe\fR only in that 
+\fIstripe\fR draws 
+stripes on a white background, while \fIestripe\fR simply draws the 
+stripes on an empty background.
+.TP
+\fBpoly\fR
+.br
+.ns
+.TP
+\fBnopoly\fR
+.br
+.ns
+.TP
+\fBpfill \|[\fIfloat\fB\|]\fR   
+.br
+.ns
+.TP
+\fBpcfill \|[\fIfloat\fB\| \|\fIfloat\fB\| \|\fIfloat\fB\|]\fR   
+.br
+.ns
+.TP
+\fBppattern \fItoken\fB \|[\fIfloat\fB\|]\fR   
+\fIPoly\fB allows the user to make jgraph treat the curve as a 
+closed polygon (or in the case of a bezier, a closed bezier curve).
+\fIpfill\fB, \fIpcfill\fB and \fIppattern\fB  specify the 
+filling of the polygon,
+and work like \fIfill\fB, \fIcfill\fB and \fIpattern\fB above.  
+The default is \fInopoly\fB.
+.TP
+\fBgmarks \|[\|{\fIfloat\fB\|} \|{\fIfloat\fB\|}\|]*\fR   
+\fIGmarks\fB
+is a way for the user to define custom marks.  For each mark on 
+\fI(x,y),\fB
+Each pair of 
+\fB\|{\fIfloat_x\fB\|}, \|{\fIfloat_y\fB\|}, \fR
+will define a point on the mark (x + 
+\fB(\fIfloat_x\fB * \fImarksize_x\fB / 2), y + (\fIfloat_y\fB * \fImarksize_y\fB / 2)).\fR
+  Thus, for example, the
+\fIbox\fR mark could be defined as 
+.PP
+.nf
+	gmarks -1 -1 -1 1 1 1 1 -1
+	marktype general
+.fi
+.PP
+The marktypes \fIgeneral\fR, \fIgeneral_nf\fR, \fIgeneral_bez\fR,
+and \fIgeneral_bez_nf\fR, allow the gmarks points to define
+a closed polygon, a line, a closed bezier curve and a 
+regular bezier curve respectively (the ``nf'' stands for
+``non-filled'').
+.TP
+\fBpostscript : \|{\fIstring\fB\|}\fR   
+.br
+.ns
+.TP
+\fBpostscript {\fItoken\fB\|}\fR   
+This allows the user to enter direct postscript as a mark.  It 
+automatically sets the marktype to \fIpostscript\fR.  If a string is
+entered, then that string is used as the mark in the jgraph output.
+If a token is entered, then that token must stand for a filename, which
+will be copied to the output once for every mark.  The postscript will
+be set up so that when the string or file is put to the output, (0, 0) of
+the the axes is in the middle of the mark, it is rotated by
+\fImrotate\fB degrees, and scaled by 
+(\fImarksize_x\fB / 2), \fImarksize_y\fB / 2).
+Thus, the \fIbox\fR mark could be defined as:
+.PP
+.nf
+	postscript : 1 setlinewidth -1 -1 moveto -1 1 lineto \\
+                  1 1 lineto 1 -1 lineto -1 -1 lineto stroke
+.fi
+.PP
+If the \fImarksize_x\fB is defined to be (0, 0), then jgraph does no
+scaling.  This is useful when the postscript has strings, and the 
+user does not want the strings to be scaled.
+.TP
+\fBeps {\fItoken\fB\|}\fR   
+This allows the user to include an encapsulated postscript file
+and treat it as a mark.  It automatically sets the marktype to
+\fIeps\fB.  The file will be scaled so that the bounding
+box is \fImarksize\fR units.  Among other things, this allows the
+user to include whole jgraph files as marks.  Please see ad.jgr,
+explained in HINTS AND EXAMPLE GRAPHS below for an example of this feature.
+.TP
+\fBlarrows\fR
+.br
+.ns
+.TP
+\fBrarrows\fR
+.br
+.ns
+.TP
+\fBnolarrows\fR
+.br
+.ns
+.TP
+\fBnorarrows\fR
+\fIRarrows\fB
+specifies to draw an arrow at the end of every line
+segment in the curve.  
+\fILarrows\fB
+specifies to draw an arrow at the beginning of every line segment.
+The size of the arrows can be changed by using
+\fIasize.\fB
+The default is
+\fInolarrows\fB
+and
+\fInorarrows\fB.
+  Arrows always go exactly to the point specified, with the exception 
+of when the marktype is ``circle''.  In this case, the arrow goes to
+the edge of the circle.
+.TP
+\fBlarrow\fR
+.br
+.ns
+.TP
+\fBrarrow\fR
+.br
+.ns
+.TP
+\fBnolarrow\fR
+.br
+.ns
+.TP
+\fBnorarrow\fR
+This is analgous to the above, except that with \fIlarrow\fB, the
+only arrow drawn is to the beginning of the first segment in the
+curve, and with \fIrarrow\fB, the only arrow drawn is to the end
+of the last segment.
+.TP
+\fBasize \|[\fIfloat\fB\|] \|[\fIfloat\fB\|]\fR   
+This sets the size of the arrows.  The first 
+\fB\|[\fIfloat\fB\|] \fR
+controls the arrow's width.  Its units are those of the x-axis.
+The second
+\fB\|[\fIfloat\fB\|] \fR
+controls the arrow's height.  It is in the units of the y-axis.
+Use the -p option of jgraph to see the default values.
+.TP
+\fBafill \|[\fIfloat\fB\|]\fR
+.br
+.ns
+.TP
+\fBafill \|[\fIfloat\fB\|]\fR
+.br
+.ns
+.TP
+\fBapattern \fItoken\fB \|[\fIfloat\fB\|]\fR   
+These control the grayness or color of arrowheads.  
+\fIAfill\fB,
+\fIacfill\fB
+and 
+\fIapattern\fB
+work in the same way as 
+\fIfill\fB,
+\fIcfill\fB
+and
+\fIpattern\fB
+described above.  The default is
+\fIafill 0\fB
+(black).
+.TP
+\fBlinetype \|[\fItoken\fB\|]\fR   
+This defines the type of the line connecting the points.  Valid
+entries are \fIsolid\fR, \fIdotted\fR, \fIdashed\fR, \fIlongdash\fR,
+\fIdotdash\fR, \fIdotdotdash\fR, \fIdotdotdashdash\fR, \fIgeneral\fR, and
+\fInone\fR.  The default is \fInone\fR.  \fIGeneral\fR lets the user define
+his own linetype using the
+\fIglines\fB
+command described below.  Points are connected in the
+order in which they are inserted using the 
+\fIpts\fB
+command.
+.TP
+\fBglines \|[\fIfloat\fB\|]*\fR   
+This lets the user specify the exact dashing of a line.  The format
+is as in postscript -- the first number is the length of the first
+dash, the second is the length of the space after the first dash,
+etc.  For example, \fIdotdash\fB could be defined as ``\fIglines\fB 5 3
+1 3''.  
+.TP
+\fBlinethickness \|[\fIfloat\fB\|]\fR   
+This defines the line thickness (in
+absolute postscript units) of the connecting line.  Default = 1.0.
+.TP
+\fBbezier\fR
+.br
+.ns
+.TP
+\fBnobezier\fR
+.br
+.ns
+\fIBezier\fB
+specifies to use the curve's points to define successive bezier curves.
+The first point is the starting point.  The next two are control points
+for the bezier curve and the next point is the ending point.  If there
+is another bezier, this ending point is also the beginning point of the 
+next curve.  The next two points are again control points, and the next
+point is the ending point.  Thus, a bezier must have a total of (3n + 1)
+points, where n is at least 1.
+  In bezier curves, marks and arrows only apply to every third point.
+\fINobezier\fB is the default.
+
+.TP
+\fBclip\fR
+This specifies that this curve will be clipped -- that is,
+no points outside of the of axes will be plotted.  
+.TP
+\fBnoclip\fR
+This turns off clipping.  If clipping was specified for the 
+entire graph, then 
+\fInoclip\fB
+has no effect.
+\fINoclip\fB
+is the default.
+.TP
+\fBlabel\fR   
+This edits the label of this curve for the purposed of
+drawing a legend.  (see LABEL EDITING COMMANDS and LEGEND EDITING
+COMMANDS).  Unless the legend entry is 
+\fIcustom\fB,
+setting any label attribute except for the text itself
+will have no effect.
+.PD
+.RE
+.LP
+.TP
+.B LABEL EDITING COMMANDS
+The following commands are used for editing
+labels.  Unless stated otherwise, the defaults are written with each
+command.  Label editing terminates when one of these tokens is not
+given.
+.RS
+.TP
+\fB: \|{\fIstring\fB\|}\fR   
+This sets the string of the label.  If no string is
+set, the label will not be printed.
+.TP
+\fBx \|[\fIfloat\fB\|]\fR
+.br
+.ns
+.TP
+\fBy \|[\fIfloat\fB\|]\fR   
+This sets the x or y coordinate of the
+label.  Units are the units of the x and y axes respectively.
+.TP
+\fBfont \|[\fItoken\fB\|]\fR   
+This sets the font.  Default is usually ``Times-Roman''.
+.TP
+\fBfontsize \|[\fIfloat\fB\|]\fR   
+This sets the fontsize in points.  Default is usually 9.
+.TP
+\fBlinesep \|[\fIfloat\fB\|]\fR   
+This sets the distance between lines in multilined labels.  Units are points.
+The default is the fontsize.
+.TP
+\fBhjl\fR
+.br
+.ns
+.TP
+\fBhjc\fR
+.br
+.ns
+.TP
+\fBhjr\fR   
+These set the horizontal justification to left,
+center, and right, respectively.  Default = 
+\fIhjc.\fB
+.TP
+\fBvjt\fR
+.br
+.ns
+.TP
+\fBvjc\fR
+.br
+.ns
+.TP
+\fBvjb\fR   
+These set the vertical justification to top
+center, and bottom, respectively.  Default = 
+\fIvjb.\fB
+.TP
+\fBrotate \|[\fIfloat\fB\|]\fR   
+This will rotate the string 
+\fB\|[\fIfloat\fB\|] \fR
+degrees.  The point of rotation is defined by the
+\fIvj\fB
+and 
+\fIhj\fB
+commands.  For example, to rotate 90 degrees about the center of a string, 
+one would use
+\fIvjc hjc rotate 90.\fB
+.TP
+\fBlgray \|[\fIfloat\fB\|]\fR
+.br
+.ns
+.TP
+\fBlcolor \|[\fIfloat\fB \fIfloat\fB \fIfloat\fB\|]\fR
+These control the color or the grayness of the label.  It works just as
+\fIgray\fB
+and
+\fIcolor\fB
+do for curves and axes.  The default depends on the context.  For example,
+for strings and the title, the default is black.  For axis labels and hash
+labels, the default is the color of the axis.  For text as marks, the
+default is the curve color.
+.PD
+.RE
+.LP
+.TP
+.B LEGEND EDITING COMMANDS
+These commands allow the user to alter the
+appearance of the legend.  Legends are printed out for each curve
+having a non-null label.  The legend entries are printed out 
+in the order of ascending curve numbers.
+Legend editing terminates when a graph command or top level command
+is issued.
+
+In earlier versions of jgraph (before version 8.0), the 
+characteristics of each legend entry were set in the label portion
+of the entry's curve.  Thus, for example, if you wanted each entry's
+fontsize to be 18, you had to set it in each entry's curve.  Now,
+default legend entry characteristics are set using the 
+\fIdefaults\fB
+keyword.  Unless a
+\fIcustom\fB
+legend is specified, these default values override any values set in 
+the entry's curve.  Thus, to get all entries to have a fontsize of
+18, it must be set using 
+\fIdefaults fontsize 18.\fB
+
+If legend editing seems cryptic, try the following example:
+.PP
+.nf
+	newgraph
+	newcurve marktype box linetype solid label : Solid box
+          pts 0 0 1 1 2 1 3 1
+	newcurve marktype circle linetype dotted label : Dotted circle
+          pts 0 1 1 2 2 2 3 2
+	newcurve marktype x linetype dashed label : Dashed x
+          pts 0 2 1 3 2 3 3 3
+        legend defaults 
+          font Times-Italic fontsize 14 x 1.5 y 3.5 hjc vjb
+.fi
+.PP
+The legend of this graph should be centered over the top of the graph,
+and all legend entries should be 14pt Times-Italic.
+.RS
+.TP
+\fBon\fR
+.br
+.ns
+.TP
+\fBoff\R
+These turn printing of the legend on and off.  The default is on
+(but, of course, if there are no curve labels defined, there will
+be no legend).
+.TP
+\fBlinelength \|[\fIfloat\fB\|]\fR   
+This sets the length of the line printed in
+front of legend entries corresponding to curves which have lines. 
+Units are those of the x axis, unless the x axis is logarithmic, in
+which case the units are inches.  The default may be gotten using the
+\fB\-p\fR
+option.
+.TP
+\fBlinebreak \|[\fIfloat\fB\|]\fR   
+This sets the vertical distance between
+individual legend entries.  Units are those of the y axis, unless the
+y axis is logarithmic, in which case the units are inches.  The
+default may be gotten using the 
+\fB\-p\fR
+option.
+.TP
+\fBmidspace \|[\fIfloat\fB\|]\fR   
+This sets one of two things.  If any of the
+legend entries have lines in them, then this sets the distance
+between the end of the line and the legend entry text.  Otherwise,
+this sets the distance between center of the mark and the legend
+entry text.  Units are those of the x axis, unless the x axis is
+logarithmic, in which case the units are inches.  The default may be
+gotten using the 
+\fB\-p\fR
+option.
+.TP
+\fBdefaults\fR
+This lets the user change the attributes of all legend entries.
+The defaults are editted as a label (see LABEL EDITING COMMANDS).
+A few of the label fields have special meanings:  The \fI:\fR field
+is ignored.  The \fIx\fR and \fIy\fR fields define where the label
+will be printed.  The \fIhj\fR and \fIvj\fR fields define the justification
+of the legend about the \fIx\fR and \fIy\fR point.  Thus, if \fIx\fR is 10
+and \fIy\fR is 15, and \fIhjc  vjb\fR are specified, then the legend will
+be centered horizontally about x=10, and the bottom of the legend
+will be placed on y=15.  This is analagous to label plotting.
+The \fIrotate\fR field is also analagous to label plotting.
+
+Defaults are as follows.  \fIRotate\fR is 0.  \fIfont\fR is ``Times-Roman''
+and \fIfontsize\fR is 9.  The color is black.  Default justification is
+\fIhjl\fR and \fIvjc\fR.  The default \fIx\fR and \fIy\fR values are set 
+according to the \fIhj\fR and \fIvj\fR fields.  See the 
+\fB\-p\fR
+option.
+.TP
+\fBleft\fR   
+.br
+.ns
+.TP
+\fIright\fB
+These will automatically produce a legend to the left or
+the right of the graph.  
+\fILeft\fB
+is equivalent to 
+\fIdefaults hjr vjc\fB
+and
+\fIright\fB
+is equivalent to 
+\fIdefaults hjl vjc.\fB
+.TP
+\fBtop\fR   
+.br
+.ns
+.TP
+\fBbottom\fR
+These will automatically produce a legend on the top or
+the bottom of the graph.  
+\fITop\fB
+is equivalent to 
+\fIdefaults hjl vjb\fB
+ and
+\fIbottom\fB
+is equivalent to
+\fIdefaults hjl vjt.\fB
+.TP
+\fBx \|[\fIfloat\fB\|]\fR
+.br
+.ns
+.TP
+\fBy \|[\fIfloat\fB\|]\fR   
+These are included mainly for backward compatability to earlier
+versions of jgraph.  Setting 
+\fIx\fB
+and 
+\fIy\fB
+is equivalent to ``defaults x 
+\fIfloat\fB
+y
+\fIfloat\fB
+hjl vjt''
+.TP
+\fBcustom\fR   
+This lets the user control where each individual legend
+entry goes.  The values of the 
+\fIdefaults\fB
+fields are ignored, and instead, the values of the curve's
+labels are used.  All justifications have defined results, except 
+for 
+\fIhjc\fB.
+Similarly, rotation other than 0 is likely to produce bad effects.
+.PD
+.RE
+.LP
+.TP
+.B ADVANCED AXIS EDITING 
+These are more advanced commands for
+editing an axis.  This includes drawing explicit hash marks and
+labels, moving the hash marks, axes, and labels, not drawing the hash
+marks, labels, axes, etc.
+.RS
+.TP
+\fBgray \|[\fIfloat\fB\|]\fR
+.br
+.ns
+.TP
+\fBcolor \|[\fIfloat\fB \fIfloat\fB \fIfloat\fB\|]\fR
+These specify either the grayness of the axis or its color.  Values
+for
+\fIgray\fB
+should be from 0 (black) to 1 (white).  Values for
+\fIcolor\fB
+should also be from 0 to 1.  They are RGB values, and thus define the
+amount of red, green and blue in the axis respectively.  Specifying
+color nullifies the gray value, and vice versa.  The default is
+\fIgray 0\fB.
+These values affect every part of the axis:  the label,
+the hash marks and labels, the axis line and the grid lines.
+.TP
+\fBgrid_gray \|[\fIfloat\fB\|]\fR
+.br
+.ns
+.TP
+\fBgrid_color \|[\fIfloat\fB \fIfloat\fB \fIfloat\fB\|]\fR
+.br
+.ns
+.TP
+\fBmgrid_gray \|[\fIfloat\fB\|]\fR
+.br
+.ns
+.TP
+\fBmgrid_color \|[\fIfloat\fB \fIfloat\fB \fIfloat\fB\|]\fR
+These allow the user to define the grayness or color of the 
+gridlines and the mgridlines to be different from those of the 
+axis lines.
+The default
+\fIgrid_gray\fB
+and
+\fIgrid_color\fB
+is the same as the axis's
+\fIgray\fB
+and
+\fIcolor\fB.
+The default
+\fImgrid_gray\fB
+and
+\fImgrid_color\fB
+is the same as 
+\fIgrid_gray\fB
+and
+\fIgrid_color\fB.
+.TP
+\fBhash_at \|[\fIfloat\fB\|]\fR   
+Draw a hash mark at this point.  No label is
+made for this hash mark.
+.TP
+\fBmhash_at \|[\fIfloat\fB\|]\fR   
+Draw a minor hash mark at this point.
+.TP
+\fBhash_label\fR   
+Edit a hash label (see HASH LABEL EDITING COMMANDS).
+.TP
+\fBhash_labels\fR   
+Edit the default characteristics of the hash labels. 
+This is so that the user can change the fontsize, justification,
+etc., of the hash labels.  Editing 
+\fIhash_labels \fB
+is just like editing
+normal labels (see LABEL EDITING COMMANDS), except that the 
+\fI:,\fB
+\fIx,\fB
+and
+\fIy\fB
+values are all ignored. Defaults for hash labels are as
+follows: Fontsize=9, Font=``Times-Roman'', Justification is dependent
+on whether it is the x or y axis and whether 
+\fIhash_scale\fB
+is positive or negative.
+.TP
+\fBhash_scale \|[\fIfloat\fB\|]\fR   
+This is to change the size and orientation of
+the hash marks.  Default = -1.0.  Changing this to -2.0 will double
+the length of the hash marks.  Changing this to +1.0 will make the
+hash marks come above or to the right of the axis.
+.TP
+\fBdraw_hash_marks_at \|[\fIfloat\fB\|]\fR   
+By default, the hash marks are drawn
+either above or below the axis.  This command changes where they are
+drawn.  
+\fIHash_scale\fB
+still determines whether they are drawn above or
+below this point, and their size.
+.TP
+\fBdraw_hash_labels_at \|[\fIfloat\fB\|]\fR   
+By default, the hash labels are
+drawn either above or below the hash marks (again, this is dependent
+on 
+\fIhash_scale\fB).
+This command changes where they are drawn. 
+Justification and fontsize, etc., can be changed with the
+\fIhash_labels\fB
+command.
+.TP
+\fBauto_hash_marks\fR
+.br
+.ns
+.TP
+\fBno_auto_hash_marks\fR   
+This toggles whether or
+not 
+\fBjgraph \fR
+will automatically create hash marks according to 
+\fIhash,\fB
+\fImhash\fB
+and
+\fIshash\fB
+(or 
+\fIlog_base\fB
+and
+\fImhash\fB
+for logarithmic axes). 
+The default is 
+\fIauto_hash_marks.\fB
+.TP
+\fBauto_hash_labels\fR
+.br
+.ns
+.TP
+\fBno_auto_hash_labels\fR   
+This toggles whether or
+not 
+\fBjgraph \fR
+will automatically create hash labels for the
+\fIauto_hash_marks\fB.
+Default = 
+\fIauto_hash_labels\fB.
+.TP
+\fBdraw_axis\fR
+.br
+.ns
+.TP
+\fBno_draw_axis\fR   
+This toggles whether or not the axis
+line is drawn.  Default = 
+\fIdraw_axis.\fB
+.TP
+\fBdraw_axis_label\fR
+.br
+.ns
+.TP
+\fBno_draw_axis_label\fR   
+This toggles whether or
+not the axis label (as editted by the 
+\fIlabel\fB
+command) is drawn.
+Default = 
+\fIdraw_axis_label.\fB
+.TP
+\fBdraw_hash_marks\fR
+.br
+.ns
+.TP
+\fBno_draw_hash_marks\fR   
+This toggles whether or
+not the hash marks (both automatic and those created with 
+\fIhash_at\fB
+and 
+\fImhash_at\fB)
+are drawn.  Default = 
+\fIdraw_hash_marks.\fB
+.TP
+\fBdraw_hash_labels\fR
+.br
+.ns
+.TP
+\fBno_draw_hash_labels\fR   
+This toggles whether or
+not the hash labels are drawn.  Default = 
+\fIdraw_hash_labels.\fB
+.PD
+.RE
+.LP
+.TP
+.B HASH LABEL EDITING COMMANDS
+Hash labels are simply strings printed
+along the appropriate axis.  As a default, they are printed at the
+place denoted by the most recent 
+\fIhash_at\fB
+or 
+\fImhash_at\fB
+for this
+axis, but this can be changed by the 
+\fIat\fB
+command.  If there has been
+no 
+\fIhash_at\fB
+or 
+\fImhash_at,\fB
+then an
+\fIat\fB
+command must be given, or
+there will be an error.  Hash editing terminates when either one of
+these commands is not given.
+.RS
+.TP
+\fB: \|{\fIstring\fB\|}\fR   
+This sets the string of the hash label (see 
+\fBStrings\fR
+above under THE DESCRIPTION LANGUAGE).
+.TP
+\fBat \|[\fIfloat\fB\|]\fR   
+This sets the location of the hash label along the
+current axis.
+.PD
+.RE
+.LP
+.SH FUNCTION PLOTTING AND OTHER NON-INHERENT FEATURES
+Although 
+\fBjgraph \fR
+doesn't have any built-in functions for interpolation
+or function plotting, both can be effected in 
+\fBjgraph \fR
+with a little outside help:
+.TP
+\fBFunction plotting\fR
+With the 
+\fIinclude\fB
+and 
+\fIshell\fB
+statement, it's easy to
+create a file of points of a function with a c or awk program, and
+include it into a graph.  See the section HINTS AND EXAMPLE GRAPHS
+for an example of a sin graph produced in this manner.
+.TP
+\fBPoint interpolation\fR
+Point interpolation is essentially the same as
+function plotting, and therefore is left out of 
+\fBjgraph.  \fR
+The UNIX spline(1) routine is a simple way to get interpolation
+between points.  See bailey.jgr described below.
+Maybe in a future release.
+.SH HINTS AND EXAMPLE GRAPHS
+\fBJgraph \fR
+should be able to draw any kind of scatter/line/bar graph that
+a user desires.  To embellish the graph with extra text, axes, lines,
+etc., it is helpful to use 
+\fIcopygraph.\fB
+The following example graphs show a few examples of different features
+of jgraph.  They should be in the directory JGRAPH_DIR.
+.sp
+- acc.jgr is a simple bar graph.  Acc.tex is also included to show
+how one can include the output of jgraph in a LaTeX file.  To get
+this to work, you might have to substitute the entire pathname of
+the file acc.jps in the acc.tex file.
+.sp
+- g8.jgr is a simple graph with some plotted text.
+- g8col.jgr shows how to produce a color background -- it is 
+  the same as g8.jgr only all on a yellow background.
+- ebars.jgr is a simple graph with error bars.
+- sin.jgr shows how a sin function can be plotted using a simple c
+program to produce the sin wave.  Moreover, this file shows a use of
+\fIcopygraph\fB
+to plot an extra x and y axis at the 0 point.
+.sp
+- sin1.jgr is a further extension of sin.jgr only with one x and y
+axis at 0, but with the axis labels at the left and the bottom of the
+graph.
+.sp
+- sin2.jgr is a different sin wave with a logarithmic x axis.
+.sp
+- sin3.jgr shows how a bizarre effect can be gotten by sorting the
+points in a different manner.
+.sp
+- bailey.jgr shows how to use the UNIX spline(1) routine to get
+interpolation between points.
+.sp
+- gpaper.jgr shows how you can get jgraph to easily produce graph paper.
+.sp
+- g9n10.jgr contains two graphs with complicated legends.  It
+contains a description of how the legend was created.
+.sp
+- ex1.jgr and ex2.jgr are two examples which were figures 1 and
+two in an extended abstract for a paper about jgraph.
+.sp
+- mab2.jgr is a graph created by Matt Blaze which shows how a 
+complicated output graph can be quite concisely and simply stated.
+In this graph, the x axis is a time line.  It shows usage of the 
+\fIhash_label\fB
+and
+\fIhash_labels\fB
+commands, as well as displaying how jgraph lets you extract data from
+output files with awk.
+.sp
+- nr.jgr is an example of a rather complicated bar graph with 
+stripe-filled bars.  It was created by Norman Ramsey.
+.sp
+- hypercube.jgr shows an interesting use of jgraph
+for picture-drawing.
+.sp
+- ad.jgr is an example which shows how one can include jgraph 
+output as jgraph input.  The file uses the \fIeps\fR token to 
+include cube.jgr, a jgraph drawing of an Intel hypercube, and disk.jgr,
+a jgraph drawing of a disk, in a picture.
+.sp
+- alb.jgr is another use of jgraph for picture drawing.  This file
+was created by an awk script which Adam Buchsbaum wrote to draw 
+trees and graphs.
+.sp
+- wortman.jgr is a neat graph of processor utilization written 
+by Dave Wortman for SIGPLAN '92.  It was created by an awk script,
+which processed the data and emitted the jgraph.
+.sp
+To view these graphs, use jgraph -P, and view the resulting output
+file with
+\fIgs,\fB
+or a similar postscript viewer.
+To make a hard copy of these graphs, pipe the output of jgraph 
+-P directly to 
+\fIlpr.\fB
+
+.SH USING JGRAPH TO DRAW PICTURES
+As hypercube.jgr and alb.jgr show, jgraph can be used as a postscript
+preprocessor to make drawings.  There are two advantages 
+using jgraph to draw pictures instead of using standard drawing tools like
+\fIxfig\fB,
+\fIfigtool\fB,
+or
+\fIidraw\fB.
+The first is that with jgraph, you know exactly where strings, lines,
+boxes, etc, will end up, because you plot them explicitly.  The second
+advantage is that for iterative drawings, with lots of patters, you
+can combine jgraph with awk or c or any other programming language
+to get complex output in a simple way.  Most what-you-see-is-what-you-get
+(WYSIWYG) drawing tools cannot do this.  
+
+The major disadvantage of using jgraph to draw pictures is that jgraph
+is not WYSIWYG.  You have to set up axes and plot points, lines and 
+strings.  It's all a matter of taste.
+
+If you'd like to see some more complex pictures drawn with jgraph, as
+well as some hints to make picture-drawing easier, send me email
+(jsp@princeton.edu).
+
+.SH EMBEDDING THE OUTPUT IN LATEX
+I haven't read the manuals, but the way I've been loading these files
+into LaTeX has been as follows:
+.PP
+.nf
+1.  Toward the beginning of my LaTeX file, I've had ``\\input{psfig}''
+2.  Where I've wanted my file, I've put:
+
+    \\begin{figure}
+    \\centerline{\\psfig{figure=<path-name>/<filename-of-jgraph-output>}}
+    \\end{figure}
+
+    Some versions of dvips or dvi2ps work without the path-name.  Others
+    require that the path-name be present.
+
+3.  After running latex on the file, do
+
+    lpr -d file.dvi
+
+4.  If that doesn't work, try dvips-ing the file and printing the postscript.
+
+.fi
+.PP
+.SH BUGS
+Logarithmic axes cannot contain points <= 0.  If I have 
+enough complaints to convince me that this is a bug, I'll try to fix it.
+.sp
+There is no real way to make the axes such that they decrease from 
+left to right or low to high -- or at least not without writing your
+own hash labels.  
+.sp
+There may well be loads of other bugs.  Send to jsp@princeton.edu.
+.sp
+
+This is $Revision: 8.3 $.
Index: /trunk/Jgraph/jgraph.c
===================================================================
--- /trunk/Jgraph/jgraph.c	(revision 418)
+++ /trunk/Jgraph/jgraph.c	(revision 418)
@@ -0,0 +1,359 @@
+/* 
+ * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/jgraph.c,v $
+ * $Revision: 8.3 $
+ * $Date: 92/11/30 11:42:21 $
+ * $Author: jsp $
+ */
+
+#include <stdio.h>
+
+#ifdef VMS 
+#include <redexp.VMS>
+#endif
+
+#include "jgraph.h"
+
+int NMARKTYPES = 17;
+int NORMALMARKTYPES = 6;
+
+char *MARKTYPESTRS[] = { "circle", "box", "diamond", "triangle", "x", "cross", 
+                         "ellipse", "general", "general_nf", "general_bez",
+                         "general_bez_nf", "postscript", "eps", 
+                         "xbar", "ybar", "none", "text"};
+char MARKTYPES[] = {     'o',      'b',   'd',       't',        'x', 'c', 
+			 'e',       'g',       'G',          'Z',
+                         'B',              'p',          'E',
+                         'X',    'Y',    'n',    'l' };
+
+int NPATTERNS = 3;
+char *PATTERNS[] = { "solid", "stripe", "estripe" };
+char PTYPES[] = { 's', '/', 'e' };
+
+Label new_label()
+{
+  Label l;
+  int i;
+
+  l = (Label) malloc (sizeof(struct label));
+  l->label = CNULL;
+  l->hj = 'c';
+  l->vj = 'b';
+  l->font = "Times-Roman";
+  l->fontsize = 9.0;
+  l->rotate = 0;
+  l->graytype = 'n';
+  for (i = 0; i < 3; i++) l->gray[i] = 0.0;
+  l->linesep = FSIG;
+
+  return l;
+}
+
+
+Curve new_curve(c, num)
+Curve c;
+int num;
+{
+  Curve new_c;
+  int i;
+
+  new_c = (Curve) get_node(c);
+  new_c->num = num;
+  new_c->l = new_label();
+  new_c->l->vj = 't';
+  new_c->lmark = new_label();
+  new_c->lmark->hj = 'c';
+  new_c->lmark->vj = 'c';
+  new_c->clip = 0;
+  new_c->pattern = 's';
+  new_c->parg = FSIG;
+  new_c->apattern = 's';
+  new_c->aparg = FSIG;
+  new_c->ppattern = 's';
+  new_c->pparg = FSIG;
+  new_c->graytype = 'n';
+  for (i = 0; i < 3; i++) new_c->gray[i] = 0.0;
+  new_c->afilltype = 'g';
+  for (i = 0; i < 3; i++) new_c->afill[i] = 0.0;
+  new_c->pts = (Point) make_list(sizeof(struct point));
+  new_c->yepts = (Point) make_list(sizeof(struct point));
+  new_c->xepts = (Point) make_list(sizeof(struct point));
+  new_c->npts = 0;
+  new_c->gen_linetype = (Flist) make_list(sizeof(struct flist));
+  new_c->marktype = MARKTYPES[num % NORMALMARKTYPES];
+  new_c->linetype = '0';
+  new_c->linethick = 1.0;
+  new_c->marksize[0] = FSIG;
+  new_c->marksize[1] = FSIG;
+  new_c->mrotate = 0.0;
+  new_c->general_marks = (Point) make_list(sizeof(struct point));
+  new_c->filltype = 'n';
+  for (i = 0; i < 3; i++) new_c->fill[i] = 0.0;
+  new_c->pfilltype = 'n';
+  for (i = 0; i < 3; i++) new_c->pfill[i] = 0.0;
+  new_c->poly = 0;
+  new_c->rarrow = 0;
+  new_c->larrow = 0;
+  new_c->rarrows = 0;
+  new_c->larrows = 0;
+  new_c->asize[0] = FSIG;
+  new_c->asize[1] = FSIG;
+  new_c->bezier = 0;
+  new_c->postscript = CNULL;
+  new_c->postfile = 0;
+  new_c->eps = CNULL;
+  prio_insert(new_c, c, 0);
+  return new_c;
+}
+
+Curve new_line(c, num)
+Curve c;
+int num;
+{
+  Curve new_c;
+  new_c = new_curve(c, num);
+  new_c->linetype = 's';
+  new_c->marktype = 'n';
+  return new_c;
+}
+
+
+Curve get_curve(c, num)
+Curve c;
+int num;
+{
+  Curve new_c;
+  for(new_c = last(c); new_c != nil(c) && new_c->num > num; new_c = prev(new_c));
+  if (new_c == nil(c) || new_c->num < num) return new_curve(c, num);
+  return new_c;
+}
+
+Axis new_axis(is_x)
+int is_x;
+{
+  int i;
+  Axis a;
+
+  a = (Axis) malloc (sizeof(struct axis));
+  a->label = new_label();
+  a->label->x = FSIG;
+  a->label->y = FSIG;
+  a->label->font = "Times-Bold";
+  a->label->fontsize = 10.0;
+  a->label->rotate = FSIG;
+  a->label->hj = '0';
+  a->label->vj = '0';
+  a->size = 3.0;
+  a->max = FSIG;
+  a->min = FSIG;
+  a->pmax = FSIG;
+  a->pmin = FSIG;
+  a->hash_interval = -1.0;
+  a->log_base = 10.0;
+  a->minor_hashes = -1;
+  a->precision = -1;
+  a->hl = new_label();
+  a->hl->label = "";
+  a->hl->font = "Times-Roman";
+  a->hl->fontsize = 9.0;
+  a->hl->rotate = 0.0;
+  a->hl->hj = '0';
+  a->hl->vj = '0';
+  a->hash_format = 'f';
+  a->draw_at = FSIG;
+  a->draw_hash_marks_at = FSIG;
+  a->draw_hash_labels_at = FSIG;
+  a->draw_hash_labels = 1;
+  a->draw_axis_line = 1;
+  a->draw_hash_marks = 1;
+  a->draw_axis_label = 1;
+  a->auto_hash_labels = 1;
+  a->auto_hash_marks = 1;
+  a->start_given = 0;
+  a->hash_scale = -1.0;
+  a->grid_lines = 0;
+  a->mgrid_lines = 0;
+  a->graytype = 'n';
+  for (i = 0; i < 3; i++) a->gray[i] = 0.0;
+  a->gr_graytype = '0';
+  for (i = 0; i < 3; i++) a->gr_gray[i] = 0.0;
+  a->mgr_graytype = '0';
+  for (i = 0; i < 3; i++) a->mgr_gray[i] = 0.0;
+  a->is_x = is_x;
+  a->is_lg = 0;
+  a->hash_labels = (String) make_list (sizeof(struct string));
+  a->hash_lines = (Hash) make_list (sizeof(struct hash));
+  return a;
+}
+
+Legend new_legend()
+{
+  Legend l;
+  l = (Legend) malloc (sizeof(struct legend));
+  l->linelength = FSIG;
+  l->linebreak = FSIG;
+  l->midspace = FSIG;
+  l->type = 'u';
+  l->l = new_label();
+  l->l->label = "";
+  l->l->hj = 'l';
+  l->l->vj = 'c';
+  l->l->x = FSIG;
+  l->l->y = FSIG;
+  return l;
+}
+
+Label new_title()
+{
+  Label t;
+
+  t = new_label();
+  t->x = FSIG;
+  t->y = FSIG;
+  t->rotate = 0.0;
+  t->hj = 'c';
+  t->vj = 't';
+  t->fontsize = 12.0;
+  return t;
+}
+
+String new_string(s, num)
+String s;
+int num;
+{
+  String new_s;
+
+  new_s = (String) get_node(s);
+  new_s->num = num;
+  new_s->s = new_label();
+  prio_insert(new_s, s, 0);
+  return new_s;
+}
+
+String get_string(s, num)
+String s;
+int num;
+{
+  String new_s;
+  for(new_s = last(s); new_s != nil(s) && new_s->num > num; new_s = prev(new_s));
+  if (new_s == nil(s) || new_s->num < num) return new_string(s, num);
+  return new_s;
+}
+
+/*
+Default new_default()
+{
+  Default new_d;
+  new_d = (Default) malloc (sizeof(default));
+  new_d->rotate = FSIG;
+  new_d->fontsize = FSIG;
+  new_d->general_marks = GMNULL;
+  new_d->fill = FSIG;
+  new_d->linethick = FSIG;
+  new_d->font = CNULL;
+  new_d->hj = '!';
+  new_d->vj = '!';
+  new_d->marktype = '!';
+  new_d->linetype = '!';
+  new_d->marksize[0] = FSIG;
+  new_d->marksize[1] = FSIG;
+}
+*/
+  
+Graph new_graph(gs, num)
+Graph gs;
+int num;
+{
+  Graph g;
+
+  g = (Graph) get_node(gs);
+  g->num = num;
+  g->xminval = 0.0;
+  g->yminval = 0.0;
+  g->xmaxval = 0.0;
+  g->ymaxval = 0.0;
+  g->x_axis = new_axis(1);
+  g->y_axis = new_axis(0);
+  g->x_translate = 0.0;
+  g->y_translate = 0.0;
+  g->curves = (Curve) make_list(sizeof(struct curve));
+  g->strings = (String) make_list(sizeof(struct string));
+  g->title = new_title();
+  g->clip = 0;
+  g->border = 0;
+  g->legend = new_legend();
+/*  g->def = new_default(); */
+  prio_insert(g, gs, 0);
+  return g;
+}
+
+Graph get_graph(g, num)
+Graph g;
+int num;
+{
+  Graph new_g;
+  for(new_g = last(g); new_g != nil(g) && new_g->num > num; new_g = prev(new_g));
+  if (new_g == nil(g) || new_g->num < num) return new_graph(g, num);
+  return new_g;
+}
+
+new_graphs(gs)
+Graphs gs;
+{
+  Graphs newg;
+
+  newg = (Graphs) get_node(gs);
+  newg->g = (Graph) make_list(sizeof(struct graph));
+  newg->height = 0.0;
+  newg->width = 0.0;
+  newg->bb[0] = ISIG; newg->bb[1] = ISIG;
+  newg->bb[2] = ISIG; newg->bb[3] = ISIG;
+  newg->preamble = CNULL;
+  newg->epilogue = CNULL;
+  newg->prefile = 0;
+  newg->epifile = 0;
+  if (first(gs) == nil(gs)) newg->page = 1; else newg->page = last(gs)->page+1;
+  insert(newg, gs);
+}
+
+main(argc, argv)
+int argc;
+char **argv;
+{
+  Graphs gs;
+  int i;
+  int show, pp;
+  int landscape;
+  int comments;
+  int nfiles;
+
+#ifdef VMS 
+  IOSTREAM = stdin;	/* for token.c -hdd */
+#endif
+  show = 0;
+  pp = 0;
+  comments = 0;
+  landscape = 0;
+  nfiles = 0;
+
+  for (i = 1; i < argc; i++) {
+    if (strcmp(argv[i], "-p") == 0) show = 1;
+    else if (strcmp(argv[i], "-comments") == 0) comments = 1;
+    else if (strcmp(argv[i], "-P") == 0) pp = 1;
+    else if (strcmp(argv[i], "-L") == 0) landscape = 1;
+    else {
+      nfiles++;
+      set_input_file(argv[i]);
+    }
+  }
+  if (nfiles == 0) set_input_file(CNULL);
+  gs = (Graphs) make_list(sizeof(struct graphs));
+  set_comment(comments);
+  new_graphs(gs);
+  edit_graphs(gs);
+  process_graphs(gs);
+  if (show) show_graphs(gs); else draw_graphs(gs, pp, landscape);
+  exit(0);
+  return 0;
+}
+
+
Index: /trunk/Jgraph/jgraph.com
===================================================================
--- /trunk/Jgraph/jgraph.com	(revision 418)
+++ /trunk/Jgraph/jgraph.com	(revision 418)
@@ -0,0 +1,39 @@
+$!  JGRAPH.COM: Execute jgraph on VMS.
+$   SAVE_VER = 'F$VERIFY( F$TRNLNM( "JGRAPH_VERIFY"))'
+$ ! How to use this procedure:
+$ ! (1) define a symbol to execute the command file
+$ !      $ JGRAPH :== @dev:[directory]JGRAPH.COM
+$ !	 We will assume that both this jgraph.com and jgraph.exe reside
+$ !	 in dev:[directory].
+$ ! (2) Then, to run the program with say the HYPERCUBE.JGR file,
+$ !      $ JGRAPH HYPERCUBE      ! (Yes you can leave off the .JGR extension)
+$ !     To generate a stand-alone PostScript file that can be sent directly
+$ !	to the printer, use:
+$ !      $ JGRAPH HYPERCUBE "-P"
+$ !	or simply
+$ !      $ JGRAPH HYPERCUBE -P
+$ !     If you really want lowercase to reprint input in expanded form:
+$ !      $ JGRAPH HYPERCUBE "-p"
+$ !	The resulting output file will have a ".jps" extension.
+$!
+$   ON   ERROR   THEN GOTO EXIT
+$   ON CONTROL_Y THEN GOTO EXIT
+$!
+$L1:
+$   P1 = F$SEARCH( F$PARSE( P1, ".JGR"))
+$   IF P1 .NES. "" THEN GOTO L2
+$   INQUIRE /LOCAL P1 "Input File : "
+$   GOTO L1
+$L2:
+$   JPS_FILE  = F$PARSE( P1,,, "NAME") + ".JPS"
+$   THIS_FILE = F$ENVIRONMENT("PROCEDURE")
+$   HERE = F$PARSE(THIS_FILE,,,"DEVICE",) + F$PARSE(THIS_FILE,,,"DIRECTORY",)
+$   RUN_JGRAPH := $'HERE'JGRAPH
+$!
+$   TMP = F$VERIFY( 1)
+$   RUN_JGRAPH <'p1' >'jps_file' "''P2'"
+$   $status = $STATUS
+$   TMP = 'F$VERIFY( TMP)
+$!
+$EXIT:
+$   EXIT $status + 0*F$VERIFY( SAVE_VER)
Index: /trunk/Jgraph/jgraph.h
===================================================================
--- /trunk/Jgraph/jgraph.h	(revision 418)
+++ /trunk/Jgraph/jgraph.h	(revision 418)
@@ -0,0 +1,242 @@
+/* 
+ * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/jgraph.h,v $
+ * $Revision: 8.3 $
+ * $Date: 92/11/30 11:42:24 $
+ * $Author: jsp $
+ */
+
+#include "list.h"
+#include "prio_list.h"
+#ifdef LCC
+#include <stdlib.h>
+#endif
+
+#define PPI 120
+#define FPPI 120.0
+#define CPI 72.0
+#define FCPI 72.0
+#define CNULL ((char *)0)
+#define GMNULL ((Point)0)
+#define FSIG -10010.0
+#define ISIG -11111111
+#define HASH_SIZE 5.0
+#define MHASH_SIZE 2.0
+
+typedef struct point {
+  struct point *flink;
+  struct point *blink;
+  float x;
+  float y;
+  char e;          /* 'x' for x_ebars, 'y' for y_ebars, 'p' for neither */
+} *Point;
+
+typedef struct flist {
+  struct flist *flink;
+  struct flist *blink;
+  float f;
+} *Flist;
+
+typedef struct label {
+  char *label;
+  float x;
+  float y;
+  float rotate;
+  char *font;
+  float fontsize;
+  char hj;
+  char vj;
+  float gray[3];
+  char graytype;
+  float linesep;
+  float xmin;
+  float xmax;
+  float ymin;
+  float ymax;
+  int nlines;
+} *Label;
+
+typedef struct curve {
+  struct curve *flink;
+  struct curve *blink;
+  int num;
+  Label l;
+  Label lmark;
+  Point pts;
+  Point yepts;
+  Point xepts;
+  int npts;
+  Point general_marks;
+  float marksize[2];
+  float fill[3];
+  float gray[3];
+  float afill[3];
+  float pfill[3];
+  float linethick;
+  float mrotate;
+  Flist gen_linetype;
+  char graytype ;
+  char filltype ;
+  char afilltype;
+  char pfilltype;
+  char pattern;
+  float parg;
+  char apattern;
+  float aparg;
+  char ppattern;
+  float pparg;
+  char marktype;
+  char linetype;
+  char *postscript;
+  char *eps;
+  int postfile;
+  int rarrow;
+  int larrow;
+  int rarrows;
+  int larrows;
+  int bezier;
+  int poly;
+  float asize[2];
+  int clip;
+} *Curve;
+
+typedef struct string {
+  struct string *flink;
+  struct string *blink;
+  int num;
+  Label s;
+} *String;
+
+typedef struct hash {
+  struct hash *flink;
+  struct hash *blink;
+  float loc;
+  float size;
+  int major;
+} *Hash;
+
+typedef struct deflt {
+  float rotate;
+  float fontsize;
+  Point general_marks;
+  float fill;
+  float linethick;
+  float marksize[2];
+  char *font;
+  char hj;
+  char vj;
+  char marktype;
+} *Default;
+  
+typedef struct axis {
+  Label label;
+  Label hl;
+  float max;
+  float min;
+  float pmax;
+  float pmin;
+  float logmin;
+  float logfactor;
+  float size;
+  float psize;
+  float factor;
+  float hash_interval;
+  float hash_start;
+  float hash_scale;
+  float log_base;
+  float draw_hash_marks_at;
+  float draw_hash_labels_at;
+  float draw_at;
+  float gray[3];
+  char graytype;
+  float gr_gray[3];
+  char gr_graytype;
+  float mgr_gray[3];
+  char mgr_graytype;
+  char hash_format;
+  int grid_lines;
+  int mgrid_lines;
+  int draw_hash_labels;
+  int draw_axis_line;
+  int draw_hash_marks;
+  int draw_axis_label;
+  int auto_hash_labels;
+  int auto_hash_marks;
+  int minor_hashes;
+  int precision;
+  int start_given;
+  String hash_labels;
+  Hash hash_lines;
+  int is_x;
+  int is_lg;
+} *Axis;
+
+typedef struct legend {
+  float linelength;
+  float linebreak;
+  int anylines;
+  float midspace;
+  char type; /* 'n' = off, 'u' = userdefined (use Label), 'c' = custom */
+  Label l;
+} *Legend;
+
+typedef struct graph {
+  struct graph *flink;
+  struct graph *blink;
+  int num;
+  float xminval;
+  float yminval;
+  float xmaxval;
+  float ymaxval;
+  float x_translate;
+  float y_translate;
+  Axis x_axis;
+  Axis y_axis;
+  Curve curves;
+  Legend legend;
+  String strings;
+  Label title;
+  int clip;
+  int border;
+  Default def;
+} *Graph;
+
+typedef struct graphs {
+  struct graphs *flink;
+  struct graphs *blink;
+  Graph g;
+  float height;
+  float width;
+  int bb[4]; /* Bounding box */
+  char *preamble; 
+  char *epilogue; 
+  int prefile;
+  int epifile;
+  int page;
+} *Graphs;
+
+extern float ctop();
+extern float disttop();
+extern float intop();
+extern float ptoc();
+extern float ptodist();
+
+extern char *getlabel();
+extern char *getmultiline();
+
+/* Stuff defined in jgraph.c */
+
+extern Curve new_line();
+extern Curve new_curve();
+extern Curve get_curve();
+extern Graph new_graph();
+extern Graph get_graph();
+extern String new_string();
+extern String get_string();
+extern Label new_label();
+extern char *MARKTYPESTRS[];
+extern char MARKTYPES[];
+extern int NMARKTYPES;
+extern int NORMALMARKTYPES;
+extern char *PATTERNS[];
+extern char PTYPES[];
+extern int NPATTERNS;
Index: /trunk/Jgraph/jmalloc.c
===================================================================
--- /trunk/Jgraph/jmalloc.c	(revision 418)
+++ /trunk/Jgraph/jmalloc.c	(revision 418)
@@ -0,0 +1,444 @@
+#include <stdio.h>
+#include <malloc.h>
+
+/* Each memory block has 8 extra 32-bit values associated with it.  If malloc
+   returns the pointer p to you, the state really looks like:
+
+jmal(p)------>  |------------------------------------------------------------|
+                | flink (next malloc block in absolute order)                |
+                |------------------------------------------------------------|
+                | blink (prev malloc block in absolute order)                |
+                |------------------------------------------------------------|
+                | nextfree (next free malloc block - no particular order)    |
+                |------------------------------------------------------------|
+                | prevfree (next free malloc block - no particular order)    |
+                |------------------------------------------------------------|
+                | size (size of memory allocated)                            |
+                |------------------------------------------------------------|
+                | cs2 (pointer to the second checksum, which is right after  |
+                |   the mem block)                                           |
+                |------------------------------------------------------------|
+                | cs (checksum right before mem block.  used to determine if |
+                |   there is an error of writing around the memory block)    |
+p------------>  |------------------------------------------------------------|
+                | space: the memory block                                    |
+                |                  ...                                       |
+                |                  ...                                       |
+                |------------------------------------------------------------|
+	        | the second checksum                                        |
+                |------------------------------------------------------------|
+*/
+
+
+typedef struct jmalloc {
+  struct jmalloc *flink;
+  struct jmalloc *blink;
+  struct jmalloc *nextfree;
+  struct jmalloc *prevfree;
+  int size;
+  int *cs2;
+  int cs;
+  char *space;
+} *Jmalloc;
+
+#define JMSZ (sizeof(struct jmalloc))
+#define PTSZ (sizeof(char *))  /* Also assuming its > sizeof int */
+#define CHUNK_SIZE (16384 - JMSZ)	/* 16K */
+#define MASK 0x17826a9b
+#define JNULL ((Jmalloc) 0)
+
+static struct jmalloc j_head;
+static Jmalloc memlist;
+static int nfree = 0;
+static int nblocks = 0;
+static int init = 0;
+static Jmalloc start;
+static int free_called = 0;
+static int malloc_called = 0;
+static int used_mem = 0;
+static int free_mem = 0;
+static int used_blocks = 0;
+static int free_blocks = 0;
+
+#define cksum(p) (((int) &(p->cs)) - 1)
+#define jloc(l) ((char *) (&l->space))
+#define jmal(l) ((Jmalloc) (((char *)l) - JMSZ + PTSZ))
+#define isfree(l) (l->nextfree != JNULL)
+
+#define do_init() \
+  if (!init) {\
+    memlist = &j_head;\
+    memlist->flink = memlist;\
+    memlist->blink = memlist;\
+    memlist->nextfree = memlist;\
+    memlist->prevfree = memlist;\
+    memlist->size = 0;\
+    memlist->cs = cksum(memlist);\
+    memlist->cs2 = &memlist->cs;\
+    memlist->space = (char *) 0;\
+    start = memlist;\
+    init = 1;\
+  }
+
+dump_core()
+{
+  memlist->space[0] = 0;
+}
+
+char *set_used(l)
+Jmalloc l;
+{
+  start = l->nextfree;
+  l->prevfree->nextfree = l->nextfree;
+  l->nextfree->prevfree = l->prevfree;
+  l->prevfree = JNULL;
+  l->nextfree = JNULL;
+  used_mem += l->size;
+  free_mem -= l->size;
+  used_blocks++;
+  free_blocks--;
+
+  return jloc(l);
+}
+
+void *malloc(size)
+int size;
+{
+  int redo;
+  int done;
+  Jmalloc l;
+  char *tmp;
+  Jmalloc newl;
+  int newsize;
+  
+  do_init();
+  malloc_called++;
+  if (size <= 0) {
+    fprintf(stderr, "Error: Malloc(%d) called\n", size);
+    /* Dump core */
+    dump_core();
+  }
+    
+  if (size % PTSZ != 0) size += PTSZ - (size % PTSZ);
+
+  done = 0;
+  l = start;
+  while(!done) {
+    if (l->size >= size) {
+      done = 1;
+      redo = 0;
+    } else {
+      l = l->nextfree;
+      done = (l == start);
+      redo = done;
+    } 
+  }
+      
+  if (redo) {
+    if (size > CHUNK_SIZE) 
+      newsize = size + JMSZ; 
+      else newsize = CHUNK_SIZE + JMSZ;
+    newl = (Jmalloc) sbrk(newsize);
+    while (newl == (Jmalloc) -1 && newsize > size + JMSZ) {
+      newsize /= 2;
+      if (newsize < size + JMSZ) newsize = size + JMSZ;
+      newl = (Jmalloc) sbrk(newsize);
+    }
+      
+    if (newl == (Jmalloc) -1) {
+/*       fprintf(stderr, "Jmalloc: out of memory\n"); */
+/*       fprintf(stderr, "Used bytes = %d, Free bytes = %d\n",  */
+/*               used_mem, free_mem); */
+/*       fprintf(stderr, "Trying to get %d bytes (chunk of %d)\n",  */
+/*               size, newsize); */
+      return NULL;
+    }
+    newl->flink = memlist;
+    newl->blink = memlist->blink;
+    newl->flink->blink = newl;
+    newl->blink->flink = newl;
+    newl->nextfree = memlist;
+    newl->prevfree = memlist->prevfree;
+    newl->nextfree->prevfree = newl;
+    newl->prevfree->nextfree = newl;
+    newl->size = ((char *) sbrk(0)) - jloc(newl) - PTSZ;
+    free_mem += newl->size;
+    newl->cs = cksum(newl);
+    newl->cs2 = ((int *) (jloc(newl) + newl->size));
+    *(newl->cs2) = cksum(newl);
+    if(newl->size < size) {
+      fprintf(stderr, "Newl->size(%d) < size(%d)\n", newl->size, size);
+      exit(1);
+    }
+    free_blocks++;
+    l = newl;
+  } 
+
+  if (l->size - size < JMSZ) {
+    return set_used(l);
+  } else {
+    tmp = jloc(l);
+    newl = (Jmalloc) (tmp + size + PTSZ);
+    newl->flink = l->flink;
+    newl->blink = l;
+    newl->flink->blink = newl;
+    newl->blink->flink = newl;
+    newl->nextfree = l->nextfree;
+    newl->prevfree = l;
+    newl->nextfree->prevfree = newl;
+    newl->prevfree->nextfree = newl;
+    newl->size = l->size - size - JMSZ;
+    newl->cs = cksum(newl);
+    newl->cs2 = (int *) (jloc(newl) + newl->size);
+    *(newl->cs2) = cksum(newl);
+    free_mem += size + newl->size - l->size;
+    free_blocks++;
+    l->size = size;
+    l->cs2 = ((int *) (jloc(l) + l->size));
+    *(l->cs2) = cksum(l);
+    return set_used(l);
+  }
+}
+
+jmalloc_print_mem()
+{
+  Jmalloc l;
+  int done;
+  char *bufs[100];
+  int sizes[100];
+  int mc;
+  int fc;
+  int i, j;
+
+  do_init();
+  mc = malloc_called;
+  fc = free_called;
+  if (jmal(jloc(memlist)) != memlist) {
+    fprintf(stderr, "TROUBLE: memlist=0x%x, jmal(jloc(memlist))=0x%x)\n",
+            memlist, jmal(jloc(memlist)));
+    exit(1);
+  }
+  done = 0;
+  l = start;
+  i = 0;
+  while (!done) {
+    if (cksum(l) != l->cs) {
+      printf("Memory location 0x%x corrupted\n", jloc(l));
+      exit(1);
+    } else if (cksum(l) != *(l->cs2)) {
+      printf("Memory location 0x%x corrupted\n", jloc(l));
+      exit(1);
+    }
+    
+    bufs[i] = jloc(l);
+    sizes[i] = l->size;
+    if (l->nextfree == 0) sizes[i] = -sizes[i];
+    i++;
+    l = l->flink;
+    done = ((l == start) || i >= 100);
+  }
+  printf("Malloc called %d times\n", mc);
+  printf("Free called %d times\n", fc);
+  for (j = 0; j < i; j++) {
+    printf("Loc = 0x%x, size = %d, free = %d\n", bufs[j], 
+           (sizes[j] > 0) ? sizes[j] : -sizes[j], (sizes[j] >= 0));
+  }
+}
+
+jmalloc_check_mem()
+{
+  Jmalloc l;
+  int done;
+
+  done = 0;
+
+  l = start;
+
+  while (!done) {
+    if (cksum(l) != l->cs) {
+      fprintf(stderr, "Memory chunk violated: 0x%x: %s 0x%x.  %s 0x%x\n", 
+              jloc(l), "Checksum 1 is ", l->cs, "It should be", cksum(l));
+      dump_core();
+    } else if (cksum(l) != *(l->cs2)) {
+      fprintf(stderr, "Memory chunk violated: 0x%x: %s 0x%x.  %s 0x%x\n", 
+              jloc(l), "Checksum 2 is ", *(l->cs2), "It should be", cksum(l));
+      dump_core();
+    }
+    l = l->flink;
+    done = (l == start);
+  }
+}
+
+  
+void free(loc)
+char *loc;
+{
+  Jmalloc l;
+  Jmalloc pl, nl;
+
+  do_init();
+  free_called++;
+  l = jmal(loc); 
+
+  if (cksum(l) != l->cs) {
+    fprintf(stderr, "Error on free: memory chunk violated: 0x%x\n", loc);
+    dump_core();
+  } else if (cksum(l) != *(l->cs2)) {
+    fprintf(stderr, "Error on free: memory chunk violated: 0x%x\n", loc);
+    dump_core();
+  }
+
+  used_mem -= l->size;
+  free_mem += l->size;
+  free_blocks++;
+  used_blocks--;
+
+  pl = l->blink;
+  nl = l->flink;
+  if (isfree(pl) && (jloc(pl)+pl->size + PTSZ == (char *) l)) {
+    free_mem += JMSZ;
+    pl->size += l->size + JMSZ;
+    pl->flink = nl;
+    pl->flink->blink = pl;
+    l = pl;
+    free_blocks--;
+  } else {
+    l->prevfree = start;
+    l->nextfree = start->nextfree;
+    l->nextfree->prevfree = l;
+    l->prevfree->nextfree = l;
+  }
+
+  if (isfree(nl) && jloc(l)+l->size + PTSZ == (char *) nl) {
+    free_mem += JMSZ;
+    l->size += nl->size + JMSZ;
+    l->flink = nl->flink;
+    l->flink->blink = l;
+    free_blocks--;
+    nl->nextfree->prevfree = nl->prevfree;
+    nl->prevfree->nextfree = nl->nextfree;
+  }
+  start = l;
+}
+
+void *realloc(loc, size)
+char *loc;
+int size;
+{
+  Jmalloc l;
+  Jmalloc l2, nl;
+  char *loc2;
+  int i;
+  Jmalloc newl;
+
+
+  do_init();
+
+  if (size <= 0) {
+    fprintf(stderr, "Error: Malloc(%d) called\n", size);
+    /* Dump core */
+    dump_core();
+  }
+    
+  if (size % PTSZ != 0) size += PTSZ - (size % PTSZ);
+
+  l = jmal(loc); 
+
+  if (cksum(l) != l->cs) {
+    fprintf(stderr, "Error on realloc: memory chunk violated: 0x%x\n", loc);
+    dump_core();
+  } else if (cksum(l) != *(l->cs2)) {
+    fprintf(stderr, "Error on realloc: memory chunk violated: 0x%x\n", loc);
+    dump_core();
+  }
+
+  if (size < l->size) {
+    if (l->size - size < JMSZ + 4) return loc;
+    newl = (Jmalloc) (loc + size + PTSZ);
+    newl->flink = l->flink;
+    newl->blink = l;
+    newl->flink->blink = newl;
+    newl->blink->flink = newl;
+    newl->nextfree = start->nextfree;
+    newl->prevfree = start;
+    newl->nextfree->prevfree = newl;
+    newl->prevfree->nextfree = newl;
+    newl->size = l->size - size - JMSZ;
+    newl->cs = cksum(newl);
+    newl->cs2 = (int *) (jloc(newl) + newl->size);
+    *(newl->cs2) = cksum(newl);
+    used_mem += size - l->size;
+    free_mem += newl->size;
+    free_blocks++;
+    l->size = size;
+    l->cs2 = ((int *) (jloc(l) + l->size));
+    *(l->cs2) = cksum(l);
+    start = newl;
+    return loc;
+  }
+
+
+  nl = l->flink;
+
+  if (isfree(nl) && (jloc(l)+l->size + PTSZ == (char *) nl) &&
+      l->size + JMSZ + nl->size >= size) {
+    start = nl;
+    i = size - l->size - JMSZ;
+    if (i < 0) i = 4;
+    loc2 = malloc(i);
+    l2 = jmal(loc2);
+    if (l2 != nl) {
+      fprintf(stderr, "Realloc internal error: l2 != nl\n");
+      dump_core();
+    }
+
+    nl->flink->blink = nl->blink;
+    nl->blink->flink = nl->flink;
+    free_mem -= nl->size;
+    used_mem += nl->size + JMSZ;
+    free_blocks--;
+    l->size += nl->size + JMSZ;
+    l->cs2 = ((int *) (jloc(l) + l->size));
+    *(l->cs2) = cksum(l);
+    return loc;
+  } else {
+    loc2 = malloc(size);
+    for (i = 0; i < l->size; i++) loc2[i] = loc[i];
+    free(loc);
+    return loc2;
+  }
+}
+
+char *calloc(nelem, elsize)
+int nelem, elsize;
+{
+  int *iptr;
+  char *ptr;
+  int sz;
+  int i;
+
+  sz = nelem*elsize;
+  ptr = malloc(sz);
+  iptr = (int *) ptr;
+  
+  for (i = 0; i < sz/sizeof(int); i++) iptr[i] = 0;
+  for (i = i * sizeof(int); i < sz; i++) ptr[i] = 0;
+  return ptr;
+}
+
+int mallopt(cmd, value)
+int cmd, value;
+{
+  fprintf(stderr, "Mallopt is not defined...\n");
+  exit(1);
+}
+
+
+jmalloc_usage()
+{
+  fprintf(stderr, "Jmalloc: %d %s %d block%s. %d %s %d block%s\n",
+                    used_mem, "bytes used in", used_blocks, 
+                    (used_blocks == 1) ? "" : "s", 
+                    free_mem, "bytes free in", free_blocks,
+                    (free_blocks == 1) ? "" : "s");
+}
Index: /trunk/Jgraph/list.c
===================================================================
--- /trunk/Jgraph/list.c	(revision 418)
+++ /trunk/Jgraph/list.c	(revision 418)
@@ -0,0 +1,95 @@
+/* 
+ * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/list.c,v $
+ * $Revision: 8.3 $
+ * $Date: 92/11/30 11:42:25 $
+ * $Author: jsp $
+ */
+
+#include <stdio.h>    /* Basic includes and definitions */
+#include "list.h"
+
+#define boolean int
+#define TRUE 1
+#define FALSE 0
+
+
+/*---------------------------------------------------------------------*
+ * PROCEDURES FOR MANIPULATING DOUBLY LINKED LISTS 
+ * Each list contains a sentinal node, so that     
+ * the first item in list l is l->flink.  If l is  
+ * empty, then l->flink = l->blink = l.            
+ * The sentinal contains extra information so that these operations
+ * can work on lists of any size and type.
+ * Memory management is done explicitly to avoid the slowness of
+ * malloc and free.  The node size and the free list are contained
+ * in the sentinal node.
+ *---------------------------------------------------------------------*/
+
+typedef struct int_list {  /* Information held in the sentinal node */
+  struct int_list *flink;
+  struct int_list *blink;
+  int size;
+  List free_list;
+} *Int_list;
+
+insert(item, list)	/* Inserts to the end of a list */
+List item;
+List list;
+{
+  List last_node;
+
+  last_node = list->blink;
+
+  list->blink = item;
+  last_node->flink = item;
+  item->blink = last_node;
+  item->flink = list;
+}
+
+delete_item(item)		/* Deletes an arbitrary iterm */
+List item;
+{
+  item->flink->blink = item->blink;
+  item->blink->flink = item->flink;
+}
+
+List make_list(size)	/* Creates a new list */
+int size;
+{
+  Int_list l;
+
+  l = (Int_list) malloc(sizeof(struct int_list));
+  l->flink = l;
+  l->blink = l;
+  l->size = size;
+  l->free_list = (List) malloc (sizeof(struct list));
+  l->free_list->flink = l->free_list;
+  return (List) l;
+}
+  
+List get_node(list)   /* Allocates a node to be inserted into the list */
+List list;
+{
+  Int_list l;
+  List to_return;
+
+  l = (Int_list) list;
+  if (l->free_list->flink == l->free_list) {
+    return (List) malloc(l->size);
+  } else {
+    to_return = l->free_list;
+    l->free_list = to_return->flink;
+    return to_return;
+  }
+}
+
+free_node(node, list)    /* Deallocates a node from the list */
+List node;
+List list;
+{
+  Int_list l;
+  
+  l = (Int_list) list;
+  node->flink = l->free_list;
+  l->free_list = node;
+}
Index: /trunk/Jgraph/list.h
===================================================================
--- /trunk/Jgraph/list.h	(revision 418)
+++ /trunk/Jgraph/list.h	(revision 418)
@@ -0,0 +1,33 @@
+/* 
+ * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/list.h,v $
+ * $Revision: 8.3 $
+ * $Date: 92/11/30 11:42:27 $
+ * $Author: jsp $
+ */
+
+/* This is the header file for the list manipulation routines in list.c.
+ * Any struct can be turned into a list as long as its first two fields are
+ * flink and blink. */
+
+typedef struct list {
+  struct list *flink;
+  struct list *blink;
+} *List;
+
+/* Nil, first, next, and prev are macro expansions for list traversal 
+ * primitives. */
+
+#define nil(l) (l)
+#define first(l) (l->flink)
+#define last(l) (l->blink)
+#define next(n) (n->flink)
+#define prev(n) (n->blink)
+
+/* These are the routines for manipluating lists */
+
+/* void insert(node list);     Inserts a node to the end of a list */
+/* void delete_item(node);     Deletes an arbitrary node */
+/* List make_list(node_size);  Creates a new list */
+/* List get_node(list);        Allocates a node to be inserted into the list */
+/* void free_node(node, list); Deallocates a node from the list */
+
Index: /trunk/Jgraph/mab2.jgr
===================================================================
--- /trunk/Jgraph/mab2.jgr	(revision 418)
+++ /trunk/Jgraph/mab2.jgr	(revision 418)
@@ -0,0 +1,20 @@
+newgraph
+legend x 15 y 6000
+newcurve pts
+shell : awk -F'|' '{printf "%d %d\n",NR,($2/2)}' mab2.times
+linetype dotted
+marktype none
+label : Writes
+newcurve pts
+shell : awk -F'|' '{printf "%d %d\n", NR,($3+$4)/2}' mab2.times
+linetype solid
+marktype none
+label : Reads (all)
+yaxis label : Reads/Writes per hour
+xaxis
+size 4.75
+no_auto_hash_labels
+no_auto_hash_marks
+hash_labels rotate -90 vjt hjl
+shell :  awk -F'|' '(NR%3 == 1) {printf "hash_at %d hash_label at %d : %s\n",NR,NR,$1}' mab2.times
+hash_label at 1 : 
Index: /trunk/Jgraph/mab2.times
===================================================================
--- /trunk/Jgraph/mab2.times	(revision 418)
+++ /trunk/Jgraph/mab2.times	(revision 418)
@@ -0,0 +1,85 @@
+Thu 00:00  | 746 | 397 | 787
+Thu 02:00  | 625 | 85 | 1066
+Thu 04:00  | 844 | 170 | 903
+Thu 06:00  | 779 | 169 | 638
+Thu 08:00  | 1168 | 978 | 3219
+Thu 10:00  | 2269 | 1599 | 5515
+Thu 12:00  | 1983 | 1963 | 5478
+Thu 14:00  | 2822 | 2077 | 7526
+Thu 16:00  | 1926 | 1730 | 5588
+Thu 18:00  | 1256 | 904 | 2559
+Thu 20:00  | 1110 | 672 | 2728
+Thu 22:00  | 1699 | 1414 | 4502
+Fri 00:00  | 919 | 418 | 1714
+Fri 02:00  | 793 | 131 | 1778
+Fri 04:00  | 785 | 114 | 1419
+Fri 06:00  | 685 | 84 | 285
+Fri 08:00  | 1382 | 795 | 3309
+Fri 10:00  | 2186 | 1485 | 5984
+Fri 12:00  | 1425 | 1212 | 4021
+Fri 14:00  | 1831 | 1884 | 4378
+Fri 16:00  | 1736 | 1243 | 4205
+Fri 18:00  | 1231 | 506 | 2768
+Fri 20:00  | 915 | 273 | 1224
+Fri 22:00  | 987 | 456 | 1411
+Sat 00:00  | 668 | 138 | 540
+Sat 02:00  | 766 | 120 | 1342
+Sat 04:00  | 781 | 129 | 648
+Sat 06:00  | 725 | 90 | 431
+Sat 08:00  | 687 | 169 | 519
+Sat 10:00  | 768 | 268 | 1013
+Sat 12:00  | 1513 | 977 | 1965
+Sat 14:00  | 1294 | 584 | 2318
+Sat 16:00  | 1337 | 699 | 2491
+Sat 18:00  | 1191 | 479 | 1662
+Sat 20:00  | 1249 | 497 | 1470
+Sat 22:00  | 1056 | 538 | 1467
+Sun 00:00  | 808 | 413 | 627
+Sun 02:00  | 914 | 97 | 1331
+Sun 04:00  | 654 | 60 | 493
+Sun 06:00  | 657 | 51 | 453
+Sun 08:00  | 780 | 216 | 755
+Sun 10:00  | 945 | 429 | 1304
+Sun 12:00  | 698 | 261 | 884
+Sun 14:00  | 345 | 135 | 684
+Sun 16:00  | 1157 | 406 | 1836
+Sun 18:00  | 1231 | 782 | 1710
+Sun 20:00  | 1229 | 386 | 1844
+Sun 22:00  | 1270 | 301 | 1882
+Mon 00:00  | 864 | 442 | 1309
+Mon 02:00  | 783 | 668 | 1444
+Mon 04:00  | 887 | 173 | 895
+Mon 06:00  | 801 | 164 | 756
+Mon 08:00  | 1370 | 682 | 3020
+Mon 10:00  | 1839 | 1083 | 8333
+Mon 12:00  | 1980 | 1205 | 10969
+Mon 14:00  | 1810 | 1546 | 6967
+Mon 16:00  | 2110 | 1793 | 5441
+Mon 18:00  | 2397 | 1763 | 7879
+Mon 20:00  | 1426 | 573 | 2943
+Mon 22:00  | 983 | 467 | 1686
+Tue 00:00  | 701 | 172 | 665
+Tue 02:00  | 998 | 161 | 1765
+Tue 04:00  | 814 | 157 | 892
+Tue 06:00  | 537 | 55 | 354
+Tue 08:00  | 701 | 588 | 3944
+Tue 10:00  | 1248 | 1038 | 3637
+Tue 12:00  | 2089 | 1170 | 4042
+Tue 14:00  | 3054 | 1694 | 7062
+Tue 16:00  | 4524 | 1642 | 8415
+Tue 18:00  | 1380 | 1491 | 2491
+Tue 20:00  | 1845 | 1530 | 2655
+Tue 22:00  | 1504 | 1513 | 2460
+Wed 00:00  | 863 | 467 | 686
+Wed 02:00  | 3833 | 428 | 4074
+Wed 04:00  | 860 | 196 | 767
+Wed 06:00  | 850 | 164 | 1568
+Wed 08:00  | 1574 | 1421 | 3551
+Wed 10:00  | 2692 | 2135 | 6666
+Wed 12:00  | 2041 | 2033 | 4309
+Wed 14:00  | 1882 | 2069 | 4106
+Wed 16:00  | 2403 | 2359 | 4947
+Wed 18:00  | 1632 | 1420 | 2779
+Wed 20:00  | 1984 | 1888 | 3410
+Wed 22:00  | 936 | 640 | 950
+
Index: /trunk/Jgraph/makefile
===================================================================
--- /trunk/Jgraph/makefile	(revision 418)
+++ /trunk/Jgraph/makefile	(revision 418)
@@ -0,0 +1,96 @@
+# If you're running this on a NeXT machine (or with an ansi-c compiler), 
+# you should make sure that
+# cc is run with -DLCC.  This makes sure that macro LCC is defined, and 
+# should make sure that <stdlib.h> is included.
+
+# Also, before installing, you should change the string "JGRAPH_DIR" in 
+# jgraph.1 to be the directory containing the example jgraphs.
+
+CC = gcc -LCC
+
+OBJS = draw.o \
+		edit.o \
+		jgraph.o \
+		list.o \
+		printline.o \
+		prio_list.o \
+		process.o \
+		show.o \
+		token.o
+
+EXAMPLES = \
+	acc.jps		\
+	acc.eps		\
+	alb.jps		\
+	ad.jps		\
+	bailey.jps	\
+	ebars.jps	\
+	ex1.jps		\
+	ex2.jps		\
+	g8.jps		\
+	g8col.jps	\
+	g9n10.jps	\
+	gpaper.jps	\
+	hypercube.jps	\
+	mab2.jps	\
+	nr.jps	\
+	sin.jps		\
+	sin1.jps	\
+	sin2.jps	\
+	sin3.jps	\
+	tree1.jps	\
+	tree2.jps	\
+	wortman.jps
+
+
+all: jgraph
+
+examples: $(EXAMPLES)
+
+.SUFFIXES: .c .o .h .jgr .jps .eps .tex .dvi
+
+.jgr.jps:
+	jgraph -P < $*.jgr > $*.jps
+
+.jgr.eps:
+	jgraph < $*.jgr > $*.eps
+
+.tex.dvi:
+	latex $*.tex
+.c.o: 
+	$(CC)  -c -g $*.c
+
+
+jgraph: $(OBJS)
+	$(CC) -g $(OBJS) -lm -o jgraph
+
+sin:	sin.o
+	cc -o sin sin.o -lm
+
+ad.jps: cube.eps disk.eps
+bailey.jps: bailey.pts
+ex2.jps: data.txt
+mab2.jps: mab2.times
+sin.jps: sin
+sin2.jps: sin2.pts
+sin3.jps: sin3.pts
+tree1.jps: tree.awk
+	( echo "4 3" | nawk -f tree.awk ; echo "xaxis size 5.4" ) | \
+           jgraph -P > tree1.jps
+tree2.jps: tree.awk
+	( echo "5 2" | nawk -f tree.awk ; echo "xaxis size 5.4" ) | \
+           jgraph -P > tree2.jps
+
+
+###
+draw.o: draw.c jgraph.h list.h prio_list.h
+edit.o: edit.c jgraph.h list.h prio_list.h
+jgraph.o: jgraph.c jgraph.h list.h prio_list.h 
+list.o: list.c list.h
+printline.o: printline.c jgraph.h list.h prio_list.h 
+prio_list.o: prio_list.c list.h prio_list.h
+process.o: process.c jgraph.h list.h prio_list.h 
+show.o: show.c jgraph.h list.h prio_list.h 
+token.o: token.c list.h
+clean: 
+	rm -f *.o a.out *.jps
Index: /trunk/Jgraph/nr.jgr
===================================================================
--- /trunk/Jgraph/nr.jgr	(revision 418)
+++ /trunk/Jgraph/nr.jgr	(revision 418)
@@ -0,0 +1,93 @@
+(* Bar graph from Norman Ramsey's PhD dissertation *)
+
+newgraph
+  xaxis size 6.0 min 0 hash 100 label : Number of lines
+  yaxis min -4.625 max -0.375 size 2.5
+  yaxis no_auto_hash_labels no_draw_hash_marks no_draw_axis_label
+
+	(* MIPS *)
+  yaxis hash_label at -1 : MIPS
+    newcurve pts 545 -1 marktype ybar fill 0.3
+      marksize 75 0.75 pattern stripe -45
+    newcurve pts 458 -1 marktype ybar fill 0.75
+      marksize 75 0.75 pattern stripe -45
+    newcurve pts 411 -1 marktype ybar fill 0.1
+      marksize 75 0.75 pattern stripe -45
+    newcurve pts 338 -1 marktype ybar fill 1.0
+      marksize 75 0.75 pattern solid
+    newcurve pts 303 -1 marktype ybar fill 0.2
+      marksize 75 0.75 pattern solid
+    newcurve pts 246 -1 marktype ybar fill 0.85
+      marksize 75 0.75 pattern stripe 45
+    newcurve pts 171 -1 marktype ybar fill 0.5
+      marksize 75 0.75 pattern stripe 45
+    newcurve pts 66 -1 marktype ybar fill 0
+      marksize 75 0.75 pattern stripe 45
+
+	(* SPARC *)
+  yaxis hash_label at -2 : SPARC
+    newcurve pts 535 -2 marktype ybar fill 0.3
+      marksize 75 0.75 pattern stripe -45
+    newcurve pts 386 -2 marktype ybar fill 0.75
+      marksize 75 0.75 pattern stripe -45
+    newcurve pts 330 -2 marktype ybar fill 0.1
+      marksize 75 0.75 pattern stripe -45
+    newcurve pts 208 -2 marktype ybar fill 1.0
+      marksize 75 0.75 pattern solid
+    newcurve pts 190 -2 marktype ybar fill 0.2
+      marksize 75 0.75 pattern solid
+    newcurve pts 174 -2 marktype ybar fill 0.5
+      marksize 75 0.75 pattern stripe 45
+    newcurve pts 74 -2 marktype ybar fill 0
+      marksize 75 0.75 pattern stripe 45
+
+	(* VAX *)
+  yaxis hash_label at -3 : VAX
+    newcurve pts 213 -3 marktype ybar fill 1.0
+      marksize 75 0.75 pattern solid
+    newcurve pts 200 -3 marktype ybar fill 0.2
+      marksize 75 0.75 pattern solid
+    newcurve pts 135 -3 marktype ybar fill 0.5
+      marksize 75 0.75 pattern stripe 45
+    newcurve pts 52 -3 marktype ybar fill 0
+      marksize 75 0.75 pattern stripe 45
+
+	(* 68020 *)
+  yaxis hash_label at -4 : 68020
+    newcurve pts 185 -4 marktype ybar fill 1.0
+      marksize 75 0.75 pattern solid
+    newcurve pts 169 -4 marktype ybar fill 0.2
+      marksize 75 0.75 pattern solid
+    newcurve pts 98 -4 marktype ybar fill 0.5
+      marksize 75 0.75 pattern stripe 45
+    newcurve pts 53 -4 marktype ybar fill 0
+      marksize 75 0.75 pattern stripe 45
+  xaxis max 600
+
+  (* first column of legend *)
+  newcurve marktype ybar fill 0 marksize 50 0.75 pattern stripe 45
+    label : configuration
+  newcurve marktype ybar fill 0.5 marksize 50 0.75 pattern stripe 45
+    label : stack walking
+  newcurve marktype ybar fill 0.85 marksize 50 0.75 pattern stripe 45
+    label : runtime procedure table
+  newcurve marktype ybar fill 0.2 marksize 50 0.75 pattern solid
+    label : nub code
+  legend bottom defaults hjl linelength 75 x 50 y -6.0
+
+copygraph xaxis nodraw yaxis nodraw (* for second legend *)
+  (* second column of legend *)
+  legend bottom defaults hjl x 250.0 y -6.0
+  newcurve marktype ybar fill 1.0 marksize 50 0.75 pattern solid
+    label : PostScript
+  newcurve marktype ybar fill 0.1 marksize 50 0.75 pattern stripe -45
+    label : instruction-set specification
+  newcurve marktype ybar fill 0.75 marksize 50 0.75 pattern stripe -45
+    label : follow sets
+  newcurve marktype ybar fill 0.3 marksize 50 0.75 pattern stripe -45
+    label : disassembler
+
+(* top X axis *)
+copygraph xaxis draw hash -1 hash_scale +1.0 min 0 max 4.457652303
+ label : percentage of total size
+
Index: /trunk/Jgraph/printline.c
===================================================================
--- /trunk/Jgraph/printline.c	(revision 418)
+++ /trunk/Jgraph/printline.c	(revision 418)
@@ -0,0 +1,325 @@
+/* 
+ * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/printline.c,v $
+ * $Revision: 8.3 $
+ * $Date: 92/11/30 11:42:31 $
+ * $Author: jsp $
+ */
+
+#include "jgraph.h"
+#include <stdio.h>
+
+#define LINEWIDTHFACTOR 0.700
+#define MAX(a, b) ((a > b) ? (a) : (b))
+
+typedef struct fontlist {
+  struct fontlist *flink;
+  struct fontlist *blink;
+  int level;
+  float s;
+  char *f;
+} *Fontlist;
+
+static Fontlist Jgraph_fonts;
+static int Jgraph_gsave_level = -100;
+static int Jgraph_comment;
+
+gsave()
+{
+  if (Jgraph_gsave_level == -100) {
+    Jgraph_gsave_level = 0;
+    Jgraph_fonts = (Fontlist) make_list(sizeof(struct fontlist));
+  } 
+  Jgraph_gsave_level++;
+  printf(" gsave ");
+}
+
+grestore()
+{
+  Fontlist l;
+
+  if (last(Jgraph_fonts) != nil(Jgraph_fonts)) {
+    l = last(Jgraph_fonts);
+    if (l->level == Jgraph_gsave_level) {
+      delete_item(l);
+      free_node(l, Jgraph_fonts);
+    }
+  }
+  Jgraph_gsave_level--;
+  printf(" grestore ");
+}
+
+setfont(f, s)
+char *f;
+float s;
+{
+  Fontlist l;
+  int ins;
+
+  if (last(Jgraph_fonts) != nil(Jgraph_fonts)) {
+    l = last(Jgraph_fonts);
+    ins = (strcmp(l->f, f) != 0 || s != l->s);
+    if (ins) {
+      delete_item(l);
+      free_node(l, Jgraph_fonts);
+    }
+  } else {
+    ins = 1;
+  }
+  if (ins) {
+    l = (Fontlist) get_node(Jgraph_fonts);
+    l->level = Jgraph_gsave_level;
+    l->s = s;
+    l->f = f;
+    insert(l, Jgraph_fonts);
+    printf("/%s findfont %f scalefont setfont\n", f, s);
+  }
+}
+  
+setfill( x, y, t, f, p, a)
+char t, p ;
+float x, y;
+float f[], a ;
+{
+/*   fprintf(stderr, "Hello?  %c %f %c %f\n", t, f[0], p, a); */
+  if (t == 'g' && f[0] < 0.0) return;
+  printf("gsave ");
+
+  if ( t == 'g' )  {
+    if( f[0] >= 0.0 ) printf("%f setgray ", f[0] );
+  } else if ( t == 'c' )  {
+    printf("%f %f %f setrgbcolor ", f[0], f[1], f[2] );
+  }
+
+  if (p == 's') {
+    printf(" fill");
+  } else if (p == '/') {
+    printf(" 6.1 10 %f %f %f 1 JSTR", a, x, y);
+  } else if (p == 'e') {
+    printf(" 6.1 10 %f %f %f 0 JSTR", a, x, y);
+  }
+  printf(" grestore\n");
+}
+
+setgray( t, f)
+char t ;
+float f[] ;
+{
+    if ( t == 'g' )  {
+       if( f[0] >= 0.0 ) printf("%f setgray\n", f[0] );
+    } else if ( t == 'c' )  {
+       printf("%f %f %f setrgbcolor\n", f[0], f[1], f[2] );
+    }
+}
+
+printline(x1, y1,x2, y2, orientation)
+float x1, y1, x2, y2;
+char orientation;
+{
+  if (orientation == 'x') 
+    printf("newpath %f %f moveto %f %f lineto stroke\n", x1, y1, x2, y2);
+  else
+    printf("newpath %f %f moveto %f %f lineto stroke\n", y1, x1, y2, x2);
+  fflush(stdout);
+} 
+
+print_ebar(x1, y1, x2, ms, orientation)
+float x1, y1, x2, ms;
+char orientation;
+{
+  printline(x1, y1, x2, y1, orientation);
+  printline(x2, y1-ms, x2, y1+ms, orientation);
+}
+
+start_line(x1, y1, c)
+float x1, y1;
+Curve c;
+{
+  setlinewidth(c->linethick);
+  setlinestyle(c->linetype, c->gen_linetype);
+  printf("%f %f moveto ", x1, y1);
+}
+
+cont_line(x1, y1)
+float x1, y1;
+{
+  printf("  %f %f lineto\n", x1, y1);
+}
+
+end_line()
+{
+  printf("stroke\n");
+  setlinewidth(1.0);
+  setlinestyle('s', (Flist) 0);
+  fflush(stdout);
+
+}
+
+bezier_control(x1, y1)
+float x1, y1;
+{
+  printf("  %f %f ", x1, y1);
+}
+
+bezier_end(x1, y1)
+float x1, y1;
+{
+  printf("  %f %f curveto\n", x1, y1);
+}
+
+
+start_poly(x1, y1)
+float x1, y1;
+{
+  printf(" newpath %f %f moveto", x1, y1);
+}
+
+cont_poly(x1, y1)
+float x1, y1;
+{
+  printf("  %f %f lineto\n", x1, y1);
+}
+
+end_poly(x, y, ftype, fill, pattern, parg)
+float x, y;
+char  ftype, pattern ;
+float fill[], parg;
+{
+  printf("closepath ");
+  setfill( x, y, ftype, fill, pattern, parg );
+  printf("stroke\n");
+  fflush(stdout);
+}
+
+/* Ellipse at 0, 0 -- assumes that you've already translated to x, y */
+
+printellipse(x, y, radius1, radius2, ftype, fill, pattern, parg)
+char ftype, pattern;
+float x, y, radius1, radius2, fill[], parg;
+{
+  printf("newpath %f %f JDE\n", radius1, radius2);
+  setfill( x, y, ftype, fill, pattern, parg );
+  printf("stroke\n");
+  fflush(stdout);
+}
+
+set_comment(c)
+int c;
+{
+  Jgraph_comment = c;
+}
+
+comment(s)
+char *s;
+{
+  if (Jgraph_comment) printf("%% %s\n", s);
+}
+
+printline_c(x1, y1, x2, y2, g)
+float x1, y1, x2, y2;
+Graph g;
+{
+  printline(ctop(x1, g->x_axis), ctop(y1, g->y_axis),
+            ctop(x2, g->x_axis), ctop(y2, g->y_axis), 'x');
+}
+
+print_label(l)
+Label l;
+{
+  int f, i, nlines;
+  float fnl;
+  char *s;
+
+  if (l->label == CNULL) return;
+
+  nlines = 0;
+  for (i = 0; l->label[i] != '\0'; i++) {
+    if (l->label[i] == '\n') {
+      l->label[i] = '\0';
+      nlines++;
+    }
+  }
+  fnl = (float) nlines;
+
+  setfont(l->font, l->fontsize);
+  printf("gsave %f %f translate %f rotate\n", l->x, l->y, l->rotate);
+  if (l->graytype == 'g') {
+    printf("  %f setgray\n", l->gray[0]);
+  } else if (l->graytype == 'c') {
+    printf("  %f %f %f setrgbcolor\n", l->gray[0], l->gray[1], 
+           l->gray[2]);
+  }
+
+  if (l->vj == 'b') {
+    printf("0 %f translate ", fnl * (l->fontsize + l->linesep) * FCPI / FPPI);
+  } else if (l->vj == 'c') {
+    if (nlines % 2 == 0) {
+      printf("0 %f translate ", 
+             (fnl/2.0*(l->fontsize + l->linesep) - l->fontsize/2.0)
+              * FCPI / FPPI);
+    } else {
+      printf("0 %f translate ", 
+             ((fnl-1.0)/2.0*(l->fontsize + l->linesep) + l->linesep/2.0)
+              * FCPI / FPPI);
+    }
+  } else {
+    printf("0 %f translate ", -l->fontsize * FCPI / FPPI);
+  }
+
+  s = l->label;
+  for (i = 0; i <= nlines; i++) {
+    printf("(%s) dup stringwidth pop ", s);
+    if (l->hj == 'c') {
+      printf("2 div neg 0 moveto\n");
+    } else if (l->hj == 'r') {
+      printf("neg 0 moveto\n");
+    } else {
+      printf("pop 0 0 moveto\n");
+    }
+    /* I would put string blanking in here if I had the time... */
+ 
+    if (i != nlines) {
+      f = strlen(s);
+      s[f] = '\n';
+      s = &(s[f+1]);
+      printf("show 0 %f translate\n", 
+              - (l->fontsize + l->linesep) * FCPI / FPPI);
+    } else {
+      printf("show\n");
+    }
+  }
+  printf("grestore\n");
+}
+
+setlinewidth(size)
+float size;
+{
+  printf("%f setlinewidth ", size * LINEWIDTHFACTOR);
+}
+
+setlinestyle(style, glist)
+char style;
+Flist glist;
+{
+  Flist fl;
+
+  switch(style) {
+    case '0': printf(" [0 2] setdash\n"); break;
+    case 's': printf(" [] 0 setdash\n"); break;
+    case '.': printf(" [1 3.200000] 0 setdash\n"); break;
+    case '-': printf(" [4.00000] 0 setdash\n"); break;
+    case 'l': printf(" [7 2] 0 setdash\n"); break;
+    case 'd': printf(" [5 3 1 3] 0 setdash\n"); break;
+    case 'D': printf(" [5 3 1 2 1 3] 0 setdash\n"); break;
+    case '2': printf(" [5 3 5 3 1 2 1 3] 0 setdash\n"); break;
+    case 'g': 
+      printf(" [");
+      for (fl = first(glist); fl != nil(glist); fl = next(fl))
+        printf("%f ", fl->f);
+      printf("] 0 setdash\n");
+      break;
+    default: fprintf(stderr, "Error: Unknown line type: %c\n", style);
+             exit(1);
+             break;
+  }
+}
+
Index: /trunk/Jgraph/prio_list.c
===================================================================
--- /trunk/Jgraph/prio_list.c	(revision 418)
+++ /trunk/Jgraph/prio_list.c	(revision 418)
@@ -0,0 +1,69 @@
+/* 
+ * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/prio_list.c,v $
+ * $Revision: 8.3 $
+ * $Date: 92/11/30 11:42:32 $
+ * $Author: jsp $
+ */
+
+#include "list.h"
+#include "prio_list.h"
+#include <stdio.h>
+
+typedef int Boolean;
+
+/* A prioirity list is any list with the first three fields being flink, 
+ * blink and prio.  Use the routines of list.c to do everything except
+ * insertion */
+ 
+typedef struct prio_list {
+  struct prio_list *flink;
+  struct prio_list *blink;
+  int prio;
+} *Prio_list;
+
+/* Prio_insert inserts nodes into their proper places in priority lists.  It first 
+ * checks for inserting into the head or tail, and then proceeds sequentially.
+ * Thus, it is worst case linear, but for most cases constant time (right). */
+
+prio_insert(node, list, desc)
+Prio_list node;
+Prio_list list;
+Boolean desc;
+{
+  Prio_list p;
+
+  /* Check nil and head of list */
+  if (first(list) == nil(list) || 
+      (!desc && first(list)->prio >= node->prio) ||
+      (desc  && first(list)->prio <= node->prio) ) {
+    node->blink = list;
+    node->flink = list->flink;
+    list->flink->blink = node;
+    list->flink = node;
+    return;
+  }
+  /* Check tail of list */
+  if ((desc  && last(list)->prio >= node->prio) ||
+      (!desc && last(list)->prio <= node->prio) ) {
+    node->flink = list;
+    node->blink = list->blink;
+    list->blink->flink = node;
+    list->blink = node;
+    return;
+  }
+  /* Check the rest of the list sequentially */
+  for(p = next(first(list));  ; p = next(p)) {
+    if (p == nil(list)) fprintf(stderr, "inserting into tail did not work\n");
+    if ((!desc && p->prio >= node->prio) ||
+        (desc  && p->prio <= node->prio)) {
+      node->flink = p;
+      node->blink = p->blink;
+      p->blink->flink = node;
+      p->blink = node;
+      return;
+    }
+  }
+}
+      
+
+  
Index: /trunk/Jgraph/prio_list.h
===================================================================
--- /trunk/Jgraph/prio_list.h	(revision 418)
+++ /trunk/Jgraph/prio_list.h	(revision 418)
@@ -0,0 +1,28 @@
+/* 
+ * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/prio_list.h,v $
+ * $Revision: 8.3 $
+ * $Date: 92/11/30 11:42:34 $
+ * $Author: jsp $
+ */
+
+/* Priority lists are just like normal lists of list.h and list.c, except
+ * that their third field is a (int) prioriy.  The routines of list.c should all
+ * be used except for insert, because it will always put an item at the 
+ * end of a list.  Instead, use prio_insert, which will put the item
+ * into its proper place in the list.  The last argument of prio_insert should
+ * be TRUE if the list is to be kept in descending order; it should be FALSE
+ * for ascending order.
+
+ * Priority list should be:
+
+struct prio_list {
+  struct prio_list *flink;
+  struct prio_list *blink;
+  int prio;
+  ...
+  }
+
+*/
+
+/* void prio_insert(node, list, descending); */
+
Index: /trunk/Jgraph/process.c
===================================================================
--- /trunk/Jgraph/process.c	(revision 418)
+++ /trunk/Jgraph/process.c	(revision 418)
@@ -0,0 +1,849 @@
+/* 
+ * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/process.c,v $
+ * $Revision: 8.3 $
+ * $Date: 92/11/30 11:42:35 $
+ * $Author: jsp $
+ */
+
+#include <stdio.h>
+#include <math.h>
+
+#include "jgraph.h"
+
+#define ABS(a) ((a > 0.0) ? (a) : (-a))
+#define MAX(a, b) ((a > b) ? (a) : (b))
+#define MIN(a, b) ((a < b) ? (a) : (b))
+#define AXIS_CHAR(a) ((a->is_x) ? 'x' : 'y')
+#define HASH_DIR(a) ((a->hash_scale > 0.0) ? 1 : -1)
+
+static double Pi;
+
+process_title(g)
+Graph g;
+{
+
+  float ytitleloc;
+
+  if (g->title->x == FSIG) g->title->x = g->x_axis->psize / 2.0;
+    else g->title->x = ctop(g->title->x, g->x_axis);
+  if (g->title->y != FSIG) g->title->y = ctop(g->title->y, g->y_axis);
+  else {
+    ytitleloc = 0.0;
+    if (g->x_axis->draw_axis_label && g->x_axis->label->label != CNULL) 
+      ytitleloc = MIN(ytitleloc, g->x_axis->label->ymin); 
+    if (g->x_axis->draw_hash_labels)
+      ytitleloc = MIN(ytitleloc, g->x_axis->hl->ymin);
+    if (g->x_axis->draw_hash_marks)
+      ytitleloc = MIN(ytitleloc, g->x_axis->draw_hash_marks_at - HASH_SIZE);
+    if (g->legend->type == 'u')
+      ytitleloc = MIN(ytitleloc, g->legend->l->ymin);
+    
+    g->title->y = ytitleloc - 10.0;
+  }
+  process_label(g->title, g, 0);
+}
+
+process_legend(g)
+Graph g;
+{
+  Legend l;
+  int anything;
+  float height, hdist, y, x, width, maxmark, maxmarky;
+  Curve c;
+  char *s;
+
+  l = g->legend;
+  if (l->type == 'n') return;
+  if (l->l->linesep == FSIG) l->l->linesep = l->l->fontsize;
+  l->anylines = 0;
+  maxmark = 0.0;
+  maxmarky = 0.0;
+  anything = 0;
+  for (c = first(g->curves); c != nil(g->curves); c = next(c)) {
+    if (c->l->label != CNULL) {
+      anything = 1;
+      if (c->marktype == 'l') {
+         maxmark = MAX(maxmark, c->lmark->xmax - c->lmark->xmin); 
+         maxmarky = MAX(maxmarky, c->lmark->ymax - c->lmark->ymin); 
+      } else if (c->marktype != 'n') {
+        maxmark = MAX(maxmark, ABS(c->marksize[0]));
+        maxmarky = MAX(maxmarky, ABS(c->marksize[1]));
+      }
+      if (c->linetype != '0') l->anylines = 1;
+    }
+  }
+  if (l->linelength == FSIG)
+    l->linelength = (l->anylines) ? (MAX(maxmark + 6.0, 24.0)) : 0.0;
+    else l->linelength = disttop(l->linelength, g->x_axis);
+  if (l->midspace == FSIG)
+    l->midspace = (l->anylines) ? 4.0 : (maxmark / 2.0) + 4.0;
+    else l->midspace = disttop(l->midspace, g->x_axis);
+  if (l->linebreak == FSIG)
+    l->linebreak = MAX(l->l->linesep * FCPI / FPPI, maxmarky);
+    else l->linebreak = disttop(l->linebreak, g->y_axis);
+
+  if (l->type == 'c') {
+    for (c = first(g->curves); c != nil(g->curves); c = next(c)) {
+      if (c->l->label != CNULL) process_label(c->l, g, 1);
+    }
+    return;
+  }
+
+  if (!anything) {
+    l->anylines = -1; 
+    return;
+  }
+
+  width = 0.0;
+  height = -l->linebreak;
+  for (c = first(g->curves); c != nil(g->curves); c = next(c)) {
+    if (c->l->label != CNULL) {
+      s = c->l->label;
+      copy_label(c->l, l->l);
+      c->l->x = 0.0;
+      c->l->y = 0.0;
+      c->l->rotate = 0.0;
+      c->l->hj = 'l';
+      c->l->vj = 'b';
+      c->l->label = s;
+      process_label(c->l, g, 0);
+      height += c->l->ymax + l->linebreak;
+      width = MAX(width, c->l->xmax);
+    }
+  }
+  hdist = (l->anylines) ? l->midspace + l->linelength : l->midspace;
+  width += hdist;
+
+  if (l->l->x == FSIG) {
+    if (l->l->hj == 'c') {
+      l->l->x = g->x_axis->psize / 2;
+    } else if (l->l->hj == 'l') {
+      if (l->l->vj == 'c') {
+        l->l->x = g->x_axis->psize;
+        if (g->y_axis->draw_axis_label) 
+          l->l->x = MAX(l->l->x, g->y_axis->label->xmax);
+        if (g->y_axis->draw_hash_labels) 
+          l->l->x = MAX(l->l->x, g->y_axis->hl->xmax);
+        if (g->y_axis->draw_hash_marks) {
+          l->l->x = MAX(l->l->x, g->y_axis->draw_hash_marks_at);
+          l->l->x = MAX(l->l->x, g->y_axis->draw_hash_marks_at + 
+                                 HASH_DIR(g->y_axis) * HASH_SIZE);
+        }
+        l->l->x += 15.0;
+      } else {
+        l->l->x = 0.0;
+      }
+    } else {
+      if (l->l->vj == 'c') {
+        l->l->x = 0.0;
+        if (g->y_axis->draw_axis_label) 
+          l->l->x = MIN(l->l->x, g->y_axis->label->xmin);
+        if (g->y_axis->draw_hash_labels) 
+          l->l->x = MIN(l->l->x, g->y_axis->hl->xmin);
+        if (g->y_axis->draw_hash_marks) {
+          l->l->x = MIN(l->l->x, g->y_axis->draw_hash_marks_at);
+          l->l->x = MIN(l->l->x, g->y_axis->draw_hash_marks_at + 
+                                 HASH_DIR(g->y_axis) * HASH_SIZE);
+        }
+        l->l->x = l->l->x - 15.0;
+      } else {
+        l->l->x = g->x_axis->psize;
+      }
+    }
+  } else {
+    l->l->x = ctop(l->l->x, g->x_axis);
+  }
+  if (l->l->y == FSIG) {
+    if (l->l->vj == 'c') {
+      l->l->y = g->y_axis->psize / 2.0;
+    } else if (l->l->vj == 'b') {
+      l->l->y = g->y_axis->psize;
+      if (g->x_axis->draw_axis_label) 
+        l->l->y = MAX(l->l->y, g->x_axis->label->ymax);
+      if (g->x_axis->draw_hash_labels) 
+        l->l->y = MAX(l->l->y, g->x_axis->hl->ymax);
+      if (g->x_axis->draw_hash_marks) {
+        l->l->y = MAX(l->l->y, g->x_axis->draw_hash_marks_at);
+        l->l->y = MAX(l->l->y, g->x_axis->draw_hash_marks_at + 
+                               HASH_DIR(g->x_axis) * HASH_SIZE);
+      }
+      l->l->y += 15.0;
+    } else {
+      l->l->y = 0.0;
+      if (g->x_axis->draw_axis_label) 
+        l->l->y = MIN(l->l->y, g->x_axis->label->ymin);
+      if (g->x_axis->draw_hash_labels) 
+        l->l->y = MIN(l->l->y, g->x_axis->hl->ymin);
+      if (g->x_axis->draw_hash_marks) {
+        l->l->y = MIN(l->l->y, g->x_axis->draw_hash_marks_at);
+        l->l->y = MIN(l->l->y, g->x_axis->draw_hash_marks_at + 
+                               HASH_DIR(g->x_axis) * HASH_SIZE);
+      }
+      l->l->y -= 15.0;
+    }
+  } else {
+    l->l->y = ctop(l->l->y, g->y_axis);
+  }
+
+  if (l->l->hj == 'l') x = 0.0;
+  else if (l->l->hj == 'c') x = - width/2.0;
+  else x = -width;
+
+  if (l->l->vj == 't') y = 0.0;
+  else if (l->l->vj == 'c') y = height / 2.0;
+  else y = height;
+
+  for (c = first(g->curves); c != nil(g->curves); c = next(c)) {
+    if (c->l->label != CNULL) {
+      c->l->x = hdist + x;
+      c->l->y = y;
+      c->l->vj = 't';
+      c->l->hj = 'l';
+      c->l->rotate = 0.0;
+      process_label(c->l, g, 0);
+      y = c->l->ymin - l->linebreak;
+    }
+  }
+  
+  process_label_max_n_mins(l->l, width, height);
+}
+
+float find_reasonable_hash_interval(a) 
+Axis a;
+{
+  float s, d;
+
+  if (a->is_lg) return 0.0;
+  s = a->max - a->min;
+  d = 1.0;
+  if (s > 5.0) {
+    while(1) {
+      if (s / d < 6.0) return d;
+      d *= 2.0;
+      if (s / d < 6.0) return d;
+      d *= 2.5;
+      if (s / d < 6.0) return d;
+      d *= 2.0;
+    }
+  } else {
+    while(1) {
+      if (s / d > 2.0) return d;
+      d /= 2.0;
+      if (s / d > 2.0) return d;
+      d /= 2.5;
+      if (s / d > 2.0) return d;
+      d /= 2.0;
+    }
+  }
+}
+
+float find_reasonable_hash_start(a)
+Axis a;
+{
+  int i;
+  
+  if (a->is_lg) return 0.0;
+  if (a->max > 0.0 && a->min < 0.0) return 0.0;
+  i = ((int) (a->min / a->hash_interval));
+  return ((float) i) * a->hash_interval;
+}
+
+int find_reasonable_precision(a)
+Axis a;
+{
+  int i, b, b2, done;
+  float x, x2, tolerance;
+
+  if (a->hash_format == 'g' || a->hash_format == 'G') return 6;
+  if (a->hash_format == 'e' || a->hash_format == 'E') return 0;
+  if (a->is_lg) return 0;
+
+  tolerance = 0.000001;
+  b = 0;
+  x = a->hash_interval;
+
+  done = 0;
+  while(b < 6 && !done) {
+    i = (int) (x + 0.4);
+    x2 = i;
+    if (x2 - x < tolerance && x - x2 < tolerance) done = 1;
+    else {
+      b++;
+      x *= 10.0;
+      tolerance *= 10.0;
+    }
+  }
+
+  tolerance = 0.000001;
+  b2 = 0;
+  x = a->hash_start;
+
+  done = 0;
+  while(b2 < 6 && !done) {
+    i = (int) (x + 0.4);
+    x2 = i;
+    if (x2 - x < tolerance && x - x2 < tolerance) done = 1;
+    else {
+      b2++;
+      x *= 10.0;
+      tolerance *= 10.0;
+    }
+  }
+  return MAX(b, b2);
+}
+
+int find_reasonable_minor_hashes(a)
+Axis a;
+{
+  float d;  
+  int i;
+  
+  if (a->is_lg) {
+    d = a->log_base;
+    while(d > 10.0) d /= 10.0;
+    while(d <= 1.0) d *= 10.0;
+    i = (int) d;
+    return MAX((i - 2), 0);
+  } else {
+    d = a->hash_interval;
+    if (d == 0.0) return 0;
+    while(d > 10.0) d /= 10.0;
+    while(d <= 1.0) d *= 10.0;
+    i = (int) d;
+    if (((float) i) != d) return 0;
+    return i-1;
+  }
+}
+
+process_axis1(a, g)
+Axis a;
+Graph g;
+{
+  float tmp;
+  int i;
+
+  if (a->min == FSIG) {
+    if (a->pmin == FSIG) {
+      error_header();
+      fprintf(stderr, 
+              "Graph %d: %c axis has no minimum, and cannot derive one\n",
+              g->num, AXIS_CHAR(a));
+      fprintf(stderr, "  Use %caxis min\n", AXIS_CHAR(a));
+      exit(1);
+    } else if (a->pmin <= 0.0 && a->is_lg) {
+      error_header();
+      fprintf(stderr, "Trying to derive %c axis\n", AXIS_CHAR(a));
+      fprintf(stderr, 
+        "        Minimum value %f will be -infinity with log axes\n", a->pmin);
+      exit(1);
+    } else a->min = a->pmin;
+  }
+  if (a->max == FSIG) {
+    if (a->pmax == FSIG) {
+      error_header();
+      fprintf(stderr, 
+              "Graph %d: %c axis has no maximum, and cannot derive one\n",
+              g->num, AXIS_CHAR(a));
+      fprintf(stderr, "  Use %caxis max\n", AXIS_CHAR(a));
+      exit(1);
+    } else if (a->pmax <= 0.0 && a->is_lg) {
+      error_header();
+      fprintf(stderr, "Trying to derive %c axis\n", AXIS_CHAR(a));
+      fprintf(stderr, 
+        "        Maximum value %f will be -infinity with log axes\n", a->pmax);
+      exit(1);
+    } else a->max = a->pmax;
+  }
+  if (a->max < a->min) {
+    tmp = a->max;  a->max = a->min;  a->min = tmp;
+  } else if (a->max == a->min) {
+    if (!a->is_lg) a->min -= 1;
+    a->max += 1;
+  }
+  a->psize = intop(a->size);
+  if (a->is_lg) {
+    if (a->min <= 0.0) {
+      error_header();
+      fprintf(stderr, 
+        "Graph %d, %c axis: Min value = %f.  This is -infinity with logrhythmic axes\n", 
+        g->num, (a->is_x) ? 'x' : 'y', a->min);
+      exit(1);
+    }
+    a->logfactor = log(a->log_base);
+    a->logmin = log(a->min) / a->logfactor;
+    a->factor = a->psize / (log(a->max) / a->logfactor - a->logmin);
+  } else {
+    a->factor = a->psize / (a->max - a->min);
+  }
+  if (a->gr_graytype == '0') {
+    a->gr_graytype = a->graytype;
+    for (i = 0; i < 3; i++) a->gr_gray[i] = a->gray[i];
+  }
+  if (a->mgr_graytype == '0') {
+    a->mgr_graytype = a->gr_graytype;
+    for (i = 0; i < 3; i++) a->mgr_gray[i] = a->gr_gray[i];
+  }
+}
+
+process_axis2(a, g)
+Axis a;
+Graph g;
+{
+  float t1, t2, t3, minor_hashes, hloc, tmp;
+  float ymin, ymax, xmin, xmax;
+  int prec, i1;
+  Hash h;
+  String s;
+  Axis other;
+
+  other = (a->is_x) ? g->y_axis : g->x_axis;
+  if (a->draw_at == FSIG) 
+    a->draw_at = (HASH_DIR(a) == -1) ? 0.0 : other->psize;
+  else a->draw_at = ctop(a->draw_at, other);
+
+  if (a->hash_interval < 0.0) {
+    a->hash_interval = find_reasonable_hash_interval(a);
+    if (!a->start_given)
+      a->hash_start = find_reasonable_hash_start(a);
+  } else if (!a->start_given) a->hash_start = a->min;
+  if (a->minor_hashes < 0) {
+    a->minor_hashes = find_reasonable_minor_hashes(a);
+  }
+  if (a->precision < 0) a->precision = find_reasonable_precision(a);
+
+  for (h = first(a->hash_lines) ; h != nil(a->hash_lines); h = next(h)) {
+    h->loc = ctop(h->loc, a);
+  }
+  
+  for (s = first(a->hash_labels); s != nil(a->hash_labels); s = next(s)) {
+    s->s->x = ctop(s->s->x, a);
+    s->s->y = ctop(s->s->y, a);
+  }
+
+  if (((a->hash_interval != 0.0 && !a->is_lg) || a->is_lg) && a->auto_hash_marks) {
+    if (a->is_lg) {
+      for (t1 = 1.0; t1 > a->min; t1 /= a->log_base) ;
+      t2 = t1 * a->log_base - t1;
+    } else {
+      for (t1 = a->hash_start; t1 > a->min; t1 -= a->hash_interval) ;
+      t2 = a->hash_interval;
+    }
+    while (t1 <= a->max) {
+      hloc = ctop(t1, a);
+      if (hloc > -.05 && hloc < a->psize + .05) {
+        h = (Hash) get_node(a->hash_lines);
+        h->loc = hloc;
+        h->size = HASH_SIZE;
+        h->major = 1;
+        insert(h, a->hash_lines);
+        if (a->auto_hash_labels) {
+          s = (String) get_node (a->hash_labels);
+          s->s = new_label();
+          s->s->x = hloc;
+          s->s->y = hloc;
+          s->s->label = (char *) malloc (80);
+          if (a->precision >= 0) {
+            prec = a->precision;
+          } else {
+            if (ABS(t1) >= 1.0 || t1 == 0.0) prec = 0;
+            else {
+              tmp = ABS(t1);
+              prec = -1;
+              while(tmp < 1.0) {tmp *= 10.0; prec++;}
+            }
+          }
+	  switch(a->hash_format) {
+            case 'G': sprintf(s->s->label, "%.*G", prec, t1); break;
+            case 'g': sprintf(s->s->label, "%.*g", prec, t1); break;
+            case 'E': sprintf(s->s->label, "%.*E", prec, t1); break;
+            case 'e': sprintf(s->s->label, "%.*e", prec, t1); break;
+            case 'f': sprintf(s->s->label, "%.*f", prec, t1); break;
+            default: fprintf(stderr, "Internal jgraph error: hl_st\n");
+		     exit(1);
+          }
+          insert(s, a->hash_labels);
+        }
+      }
+      minor_hashes = t2 / ((float) (a->minor_hashes + 1));
+      t3 = t1;
+      for (i1 = 1; i1 <= a->minor_hashes; i1++) {
+        t3 += minor_hashes;
+        hloc = ctop(t3, a);
+        if (hloc > -.05 && hloc < a->psize + .05) {
+          h = (Hash) get_node(a->hash_lines);
+          h->loc = hloc;
+          h->size = MHASH_SIZE;
+          h->major = 0;
+          insert(h, a->hash_lines);
+        }
+      }
+      if (a->is_lg) {
+        t1 *= a->log_base;
+        t2 = t1 * a->log_base - t1;
+      } else t1 += t2;
+    }
+  }
+
+  if (a->draw_hash_marks_at == FSIG)
+    a->draw_hash_marks_at = a->draw_at;
+  else a->draw_hash_marks_at = ctop(a->draw_hash_marks_at, other);
+  if (a->draw_hash_labels_at == FSIG)
+    a->draw_hash_labels_at = a->draw_hash_marks_at +
+      a->hash_scale * HASH_SIZE + HASH_DIR(a) * 3.0;
+  else a->draw_hash_labels_at = ctop(a->draw_hash_labels_at, other);
+
+  if (a->is_x) {
+    a->hl->y = a->draw_hash_labels_at; 
+    if (a->hl->hj == '0')
+      a->hl->hj = 'c';
+    if (a->hl->vj == '0')
+      a->hl->vj = (HASH_DIR(a) == -1) ? 't' : 'b';
+  } else {
+    a->hl->x = a->draw_hash_labels_at;
+    if (a->hl->vj == '0') a->hl->vj = 'c';
+    if (a->hl->hj == '0')
+      a->hl->hj = (HASH_DIR(a) == -1) ? 'r' : 'l';
+  }
+
+  ymin = (a->is_x) ? a->hl->y : 0;
+  ymax = (a->is_x) ? a->hl->y : a->psize;
+  xmin = (!a->is_x) ? a->hl->x : 0;
+  xmax = (!a->is_x) ? a->hl->x : a->psize;
+
+  for (s = first(a->hash_labels); s != nil(a->hash_labels); s = next(s)) {
+    if (a->is_x) a->hl->x = s->s->x; else a->hl->y = s->s->y;
+    a->hl->label = s->s->label;
+    process_label(a->hl, g, 0);
+    xmin = MIN(a->hl->xmin, xmin);
+    ymin = MIN(a->hl->ymin, ymin);
+    xmax = MAX(a->hl->xmax, xmax);
+    ymax = MAX(a->hl->ymax, ymax);
+  }
+  a->hl->xmin = xmin;
+  a->hl->ymin = ymin;
+  a->hl->xmax = xmax;
+  a->hl->ymax = ymax;
+
+  /* HERE -- now either test or continue */
+
+  if (a->is_x) {
+    if (a->label->x == FSIG) 
+      a->label->x = a->psize / 2.0;
+      else a->label->x = ctop(a->label->x, g->x_axis);
+    if (a->label->y == FSIG) {
+      ymin = 0.0;
+      ymax = other->psize;
+      if (a->draw_hash_labels) {
+        ymin = MIN(ymin, a->hl->ymin); 
+        ymax = MAX(ymax, a->hl->ymax); 
+      } 
+      if (a->draw_hash_marks) {
+        ymin = MIN(ymin, a->draw_hash_marks_at);
+        ymin = MIN(ymin, a->draw_hash_marks_at + a->hash_scale * HASH_SIZE);
+        ymax = MAX(ymax, a->draw_hash_marks_at);
+        ymax = MAX(ymax, a->draw_hash_marks_at + a->hash_scale * HASH_SIZE);
+      } 
+      a->label->y = (HASH_DIR(a) == -1) ? ymin - 8.0 : ymax + 8.0 ;
+    } else a->label->y = ctop(a->label->y, g->y_axis);
+    if (a->label->hj == '0') a->label->hj = 'c';
+    if (a->label->vj == '0') a->label->vj = (HASH_DIR(a) == -1) ? 't' : 'b' ;
+    if (a->label->rotate == FSIG) a->label->rotate = 0.0;
+  } else {
+    if (a->label->y == FSIG) 
+      a->label->y = a->psize / 2.0;
+      else a->label->y = ctop(a->label->y, g->y_axis);
+    if (a->label->x == FSIG) {
+      xmin = 0.0;
+      xmax = other->psize;
+      if (a->draw_hash_labels) {
+        xmin = MIN(xmin, a->hl->xmin); 
+        xmax = MAX(xmax, a->hl->xmax); 
+      } 
+      if (a->draw_hash_marks) {
+        xmin = MIN(xmin, a->draw_hash_marks_at);
+        xmin = MIN(xmin, a->draw_hash_marks_at + a->hash_scale * HASH_SIZE);
+        xmax = MAX(xmax, a->draw_hash_marks_at);
+        xmax = MAX(xmax, a->draw_hash_marks_at + a->hash_scale * HASH_SIZE);
+      } 
+      a->label->x = (HASH_DIR(a) == -1) ? xmin - 8.0 : xmax + 8.0 ;
+    } else a->label->x = ctop(a->label->x, g->x_axis);
+    if (a->label->hj == '0') a->label->hj = 'c';
+    if (a->label->vj == '0') a->label->vj = 'b';
+    if (a->label->rotate == FSIG) 
+      a->label->rotate = (HASH_DIR(a) == -1) ? 90.0 : -90.0;
+  }
+  process_label (a->label, g, 0);
+}
+
+process_label(l, g, adjust)
+Label l;
+Graph g;
+int adjust;
+{
+  float len, height;
+  int f, i;
+  float fnl, tmp;
+  char *s;
+
+  if (l->label == CNULL) return;
+
+  if (adjust) {
+    l->x = ctop(l->x, g->x_axis);
+    l->y = ctop(l->y, g->y_axis);
+  }
+  if (l->linesep == FSIG) l->linesep = l->fontsize;
+
+  l->nlines = 0;
+  for (i = 0; l->label[i] != '\0'; i++) {
+    if (l->label[i] == '\n') {
+      l->label[i] = '\0';
+      l->nlines++;
+    }
+  }
+  fnl = (float) l->nlines;
+
+  len = 0.0;
+  s = l->label;
+  for (i = 0; i <= l->nlines; i++) {
+    tmp = l->fontsize * FCPI / FPPI * strlen(s) * 0.8;
+    len = MAX(len, tmp);
+    if (i != l->nlines) {
+      f = strlen(s);
+      s[f] = '\n';
+      s = &(s[f+1]);
+    }
+  }
+  height = (l->fontsize * (fnl+1) + l->linesep * fnl) * FCPI / FPPI;
+  process_label_max_n_mins(l, len, height);
+}
+   
+process_label_max_n_mins(l, len, height)
+Label l;
+float len;
+float height;
+{
+  float xlen, ylen, xheight, yheight;
+  float x, y;
+
+  xlen = len * cos(l->rotate * Pi / 180.00);
+  ylen = height * cos((l->rotate + 90.0) * Pi / 180.00);
+  xheight = len * sin(l->rotate * Pi / 180.00);
+  yheight = height * sin((l->rotate + 90.0) * Pi / 180.00);
+  
+  x = l->x;
+  y = l->y;
+
+  if (l->hj == 'c') {
+    x -= xlen / 2.0;
+    y -= xheight / 2.0;
+  } else if (l->hj == 'r') {
+    x -= xlen;
+    y -= xheight;
+  }
+  if (l->vj == 'c') {
+    x -= ylen / 2.0;
+    y -= yheight / 2.0;
+  } else if (l->vj == 't') {
+    x -= ylen;
+    y -= yheight;
+  }
+
+  l->xmin = MIN(x, x + xlen);
+  l->xmin = MIN(l->xmin, x + xlen + ylen);
+  l->xmin = MIN(l->xmin, x + ylen);
+
+  l->ymin = MIN(y, y + xheight);
+  l->ymin = MIN(l->ymin, y + yheight);
+  l->ymin = MIN(l->ymin, y + xheight + yheight);
+
+  l->xmax = MAX(x, x + xlen);
+  l->xmax = MAX(l->xmax, x + xlen + ylen);
+  l->xmax = MAX(l->xmax, x + ylen);
+
+  l->ymax = MAX(y, y + xheight);
+  l->ymax = MAX(l->ymax, y + yheight);
+  l->ymax = MAX(l->ymax, y + xheight + yheight);
+
+}
+
+process_strings(g)
+Graph g;
+{
+  String s;
+
+  for(s = first(g->strings); s != nil(g->strings); s = next(s)) {
+    process_label(s->s, g, 1);
+  }
+}
+
+process_curve(c, g)
+Curve c;
+Graph g;
+{
+  if (c->bezier && (c->npts < 4 || (c->npts % 3 != 1))) {
+    error_header();
+    fprintf(stderr, "  Graph %d Curve %d:\n", g->num, c->num);
+    fprintf(stderr, "  Curve has %d points\n", c->npts);
+    fprintf(stderr, "  Bezier must have 3n + 1 points (n > 0)\n");
+    exit(1);
+  }
+  c->marksize[0] = (c->marksize[0] == FSIG) ? 
+                   4.0 : disttop(c->marksize[0], g->x_axis);
+  c->marksize[1] = (c->marksize[1] == FSIG) ? 
+                   4.0 : disttop(c->marksize[1], g->y_axis);
+  if (c->marktype == 'o') c->marksize[1] = c->marksize[0];
+  c->asize[0] = (c->asize[0] == FSIG) ? 
+                   6.0 : disttop(c->asize[0], g->x_axis);
+  c->asize[1] = (c->asize[1] == FSIG) ? 
+                   2.0 : disttop(c->asize[1], g->y_axis) / 2.0;
+  c->lmark->x = disttop(c->lmark->x, g->x_axis);
+  c->lmark->y = disttop(c->lmark->y, g->y_axis);
+  process_label(c->lmark, g, 0);
+  if (c->parg == FSIG) c->parg = 0.0;
+  if (c->aparg == FSIG) c->aparg = 0.0;
+  if (c->pparg == FSIG) c->pparg = 0.0;
+}
+
+process_curves(g)
+Graph g;
+{
+  Curve c;
+  for(c = first(g->curves); c != nil(g->curves); c = next(c)) {
+    process_curve(c, g);
+  }
+}
+ 
+process_extrema(g)  /* This finds all the minval/maxvals for bbox calc */
+Graph g;
+{
+  Curve c;
+  String s;
+  Axis xa, ya;
+
+  xa = g->x_axis;
+  ya = g->y_axis;
+
+  g->xminval = 0.0;
+  g->yminval = 0.0;
+  g->xmaxval = xa->psize;
+  g->ymaxval = ya->psize;
+  
+  if (xa->draw_axis_label) process_label_extrema(xa->label, g);
+  if (ya->draw_axis_label) process_label_extrema(ya->label, g);
+  if (xa->draw_hash_labels) process_label_extrema(xa->hl, g);
+  if (ya->draw_hash_labels) process_label_extrema(ya->hl, g);
+
+  if (xa->draw_hash_marks) {
+      g->yminval = MIN(g->yminval, xa->draw_hash_marks_at);
+      g->yminval = MIN(g->yminval, 
+                       xa->draw_hash_marks_at + HASH_DIR(xa) * HASH_SIZE);
+      g->ymaxval = MAX(g->ymaxval, xa->draw_hash_marks_at);
+      g->ymaxval = MAX(g->ymaxval, 
+                       xa->draw_hash_marks_at + HASH_DIR(xa) * HASH_SIZE);
+  }
+  if (ya->draw_hash_marks) {
+      g->xminval = MIN(g->xminval, ya->draw_hash_marks_at);
+      g->xminval = MIN(g->xminval, 
+                       ya->draw_hash_marks_at + HASH_DIR(ya) * HASH_SIZE);
+      g->xmaxval = MAX(g->xmaxval, ya->draw_hash_marks_at);
+      g->xmaxval = MAX(g->xmaxval, 
+                       ya->draw_hash_marks_at + HASH_DIR(ya) * HASH_SIZE);
+  }
+  process_label_extrema(g->title, g);  
+
+  if (g->legend->type == 'c') {
+    for (c = first(g->curves); c != nil(g->curves); c = next(c)) {
+      process_label_extrema(c->l, g);
+    }
+  } else if (g->legend->type == 'u' && g->legend->anylines >= 0) {
+    process_label_extrema(g->legend->l, g);
+  }
+  for(s = first(g->strings); s != nil(g->strings); s = next(s)) {
+    process_label_extrema(s->s, g);
+  }
+}
+
+process_label_extrema(l, g)
+Label l;
+Graph g;
+{
+  if (l->label == CNULL) return;
+  g->yminval = MIN(g->yminval, l->ymin);
+  g->ymaxval = MAX(g->ymaxval, l->ymax);
+  g->xminval = MIN(g->xminval, l->xmin);
+  g->xmaxval = MAX(g->xmaxval, l->xmax);
+}
+
+process_graph(g)
+Graph g;
+{
+  g->x_translate = intop(g->x_translate);
+  g->y_translate = intop(g->y_translate);
+  process_axis1(g->x_axis, g);
+  process_axis1(g->y_axis, g);
+  process_axis2(g->x_axis, g);
+  process_axis2(g->y_axis, g);
+  process_curves(g);
+  process_legend(g);
+  process_strings(g);
+  process_title(g);
+  process_extrema(g);
+}
+
+process_graphs(gs)
+Graphs gs;
+{
+  Graphs the_g;
+  Graph g;
+  float diff, max_y, min_y, max_x, min_x;
+  int do_bb, i;
+
+  Pi = acos(-1.0);
+  for (the_g = first(gs); the_g != nil(gs); the_g = next(the_g)) {
+    for (g = first(the_g->g); g != nil(the_g->g); g = next(g)) process_graph(g);
+    max_x = 0.0;
+    min_x = 0.0;
+    max_y = 0.0;
+    min_y = 0.0;
+    for (g = first(the_g->g); g != nil(the_g->g); g = next(g)) {
+      max_y = MAX(max_y, g->y_translate + g->ymaxval);
+      min_y = MIN(min_y, g->y_translate + g->yminval);
+      max_x = MAX(max_x, g->x_translate + g->xmaxval);
+      min_x = MIN(min_x, g->x_translate + g->xminval);
+    }
+
+    if (the_g->height >= 0.00) {
+      the_g->height *= FCPI;
+      if (the_g->height > max_y - min_y) {
+        diff = (the_g->height - max_y + min_y) / 2.0;
+        max_y += diff;
+        min_y -= diff;
+      } else {
+        the_g->height = max_y - min_y;
+      }
+    } else {
+      the_g->height = max_y - min_y;
+    }
+    if (the_g->width >= 0.00) {
+      the_g->width *= FCPI;
+      if (the_g->width > max_x - min_x) {
+        diff = (the_g->width - max_x + min_x) / 2.0;
+        max_x += diff;
+        min_x -= diff;
+      } else {
+        the_g->width = max_x - min_x;
+      }
+    } else {
+      the_g->width = max_x - min_x;
+    }
+
+    do_bb = 1;
+    for (i = 0; i < 4; i++) do_bb = (do_bb && the_g->bb[i] == ISIG);
+    if (do_bb) {
+      the_g->bb[0] = (int) (min_x - 1.0);
+      the_g->bb[1] = (int) (min_y - 1.0);
+      the_g->bb[2] = (int) (max_x + 1.0);
+      the_g->bb[3] = (int) (max_y + 1.0);
+    } 
+  }
+}
Index: /trunk/Jgraph/redexp.vms
===================================================================
--- /trunk/Jgraph/redexp.vms	(revision 418)
+++ /trunk/Jgraph/redexp.vms	(revision 418)
@@ -0,0 +1,526 @@
+/*	--redexp.vms--
+   This 'C' module may be included prior to the ``main'' programs on VMS in
+   order to allow 'C' arguments to contain redirection symbols (<,>,>>) and
+   VMS wild cards (*,%, ...], [-).  By including this module, two programs
+   redirect() and expand() are run prior to turning control over to
+   your main() entry point.
+
+    redirect-- Gregg Townsend circa 1983,
+    expand-- John Campbell circa 1987
+
+   This code is public domain, others may use it freely. Credit, however, to
+   Gregg Townsend (who wrote ``redirect()'') and John Campbell (who followed
+   with ``expand()'') would be appreciated.  If someone writes the next
+   logical successor ``pipe()'', please email a copy to
+   ...!arizona!naucse!jdc (John Campbell) (Gregg works on unix :-).
+
+   HISTORY
+
+*/
+
+#include <rms.h>      /* No easy way to tell if this has already been included. */
+#ifndef ERANGE
+#include <stdlib.h>   /* Include only if missing. */
+#endif
+#ifndef __FILE
+#include <stdio.h>    /* Include only if missing. */
+#endif
+#include <ctype.h>  /* Added for conversion to lower case  */
+#ifndef __STRING_LOADED
+#include <string.h>
+#endif /* !__STRING_LOADED */
+
+/* Expansion of wild cards is done using RMS. */
+        struct NAMBLK { struct NAM nam;         /* VMS nam block structure */
+                 char es[NAM$C_MAXRSS],         /* Extended string         */
+                      rs[NAM$C_MAXRSS];         /* Resultant string        */
+               };
+
+#define ErrorExit 1
+
+/* Allow the user to override _N_FARGS or _E_FLAG if they wish. */
+#ifndef _N_FARGS
+#define _N_FARGS 0 /* no automatic redirection please */
+#endif
+#ifndef _E_FLAG
+#define _E_FLAG 4  /* only include dev and dir if different from default */
+#endif
+/*
+   Since the following will possibly be included in a single module, try
+   hard to avoid name conflicts. (Just being static doesn't cut it if
+   compiled in the same module.)
+*/
+#define redirect     _r_edirect
+#define filearg      _f_ilearg
+#define expand       _e_xpand
+#define wild_found   _w_ild_found
+#define wild_expand  _w_ild_expand
+
+/* forward protypes */
+static void redirect(int *argc, char *argv[], int nfargs);
+char **expand (int *argc, const char *argv[], const int flag);
+
+main(int argc, char *argv[], char *envp[])
+{
+   redirect (&argc, argv, _N_FARGS);
+   argv = expand (&argc, argv, _E_FLAG);
+
+   /* Make the user's main entry point this routine's entry point. */
+#define main _user_main
+   _user_main (argc, argv, envp);
+}
+
+/* ------------------------ REDIRECT code ------------------------ */
+
+/*
+ * redirect(&argc,argv,nfargs) - redirect standard I/O
+ *    int *argc         number of command arguments (from call to main)
+ *    char *argv[]      command argument list (from call to main)
+ *    int nfargs        number of filename arguments to process
+ *
+ * argc and argv will be adjusted by redirect.
+ *
+ * redirect processes a program's command argument list and handles redirection
+ * of stdin, and stdout.  Any arguments which redirect I/O are removed from the
+ * argument list, and argc is adjusted accordingly.  redirect would typically be
+ * called as the first statement in the main program.
+ *
+ * Files are redirected based on syntax or position of command arguments.
+ * Arguments of the following forms always redirect a file:
+ *
+ *    <file     redirects standard input to read the given file
+ *    >file     redirects standard output to write to the given file
+ *    >>file    redirects standard output to append to the given file
+ *
+ * It is often useful to allow alternate input and output files as the
+ * first two command arguments without requiring the <file and >file
+ * syntax.  If the nfargs argument to redirect is 2 or more then the
+ * first two command arguments, if supplied, will be interpreted in this
+ * manner:  the first argument replaces stdin and the second stdout.
+ * A filename of "-" may be specified to occupy a position without
+ * performing any redirection.
+ *
+ * If nfargs is 1, only the first argument will be considered and will
+ * replace standard input if given.  Any arguments processed by setting
+ * nfargs > 0 will be removed from the argument list, and again argc will
+ * be adjusted.  Positional redirection follows syntax-specified
+ * redirection and therefore overrides it.
+ *
+ */
+
+/* forward prototype for local routine */
+static void filearg(int *argc, char *argv[], int n, int i, FILE *fp, char mode[]);
+
+static void redirect(int *argc, char *argv[], int nfargs)
+{
+   int i;
+
+   i = 1;
+   while (i < *argc)  {         /* for every command argument... */
+      switch (argv[i][0])  {            /* check first character */
+         case '<':                      /* <file redirects stdin */
+            filearg(argc,argv,i,1,stdin,"r");
+            break;
+         case '>':                      /* >file or >>file redirects stdout */
+            if (argv[i][1] == '>')
+               filearg(argc,argv,i,2,stdout,"a");
+            else
+               filearg(argc,argv,i,1,stdout,"w");
+            break;
+         default:                       /* not recognized, go on to next arg */
+            i++;
+      }
+   }
+   if (nfargs >= 1 && *argc > 1)        /* if positional redirection & 1 arg */
+      filearg(argc,argv,1,0,stdin,"r"); /* then redirect stdin */
+   if (nfargs >= 2 && *argc > 1)        /* likewise for 2nd arg if wanted */
+      filearg(argc,argv,1,0,stdout,"w");/* redirect stdout */
+}
+
+/* local routine for redirect() */
+/* filearg(&argc,argv,n,i,fp,mode) - redirect and remove file argument
+ *    int *argc         number of command arguments (from call to main)
+ *    char *argv[]      command argument list (from call to main)
+ *    int n             argv entry to use as file name and then delete
+ *    int i             first character of file name to use (skip '<' etc.)
+ *    FILE *fp          file pointer for file to reopen (typically stdin etc.)
+ *    char mode[]       file access mode (see freopen spec)
+ */
+
+static void filearg(int *argc, char *argv[], int n, int i, FILE *fp, char mode[])
+{
+   if (strcmp(argv[n]+i,"-"))           /* alter file if arg not "-" */
+      fp = freopen(argv[n]+i,mode,fp,"mbf=8","mbc=16");
+   if (fp == NULL)  {                   /* abort on error */
+      fprintf(stderr,"%%can't open %s",argv[n]+i);
+      exit(ErrorExit);
+   }
+   for ( ;  n < *argc;  n++)            /* move down following arguments */
+      argv[n] = argv[n+1];
+   *argc = *argc - 1;                   /* decrement argument count */
+}
+
+/* ------------------------ EXPAND code ------------------------ */
+/*-
+   ``expand()'' is a routine to expand wild-cards to file specifications.
+   This routine is often used in conjunction with ``redirect()'' to provide
+   both wild card expansion and standard file redirection prior to doing
+   any real work in a 'C' program.
+
+   Normal usage is to include the following line prior to using argc or
+   argv in main():
+
+     argv = expand (&argc, argv, 0);
+
+   ``argc'' will be adjusted by ``expand()'', the return value from expand
+   will replace ``argv''.
+
+   ``expand()'' processes a program's command argument list and expands any
+   wild cards into zero or more argv entries. Only arguments that posses VMS
+   wild-cards are expanded. Wild cards searched for are ``*'', ``%'',
+   ``...]'', and ``[-''. If the wild-card is found inside a single or double
+   quote ("*" or '%') then they are not counted as wild-cards. Be aware that
+   the expansion of a VMS wild card will match all VMS files, including
+   directory files (".DIR;1").
+
+   NOTE: The use of quotes in VMS requires thinking about how the CLI expands
+   things before handing the argument line over to your program.  Do not
+   expect "*" to avoid expansion, use """*""" instead.  Likewise, expression
+   substitution precludes the use of (') to quote wild cards:
+           $ A := HELLO
+           $ ECHO 'a'   ! 'C' program that calls ``expand()''
+           hello
+   The easiest way to escape a wild-card may be "'*'".  The point is that
+   ``expand()'' will only recognize quotes passed into main().
+   Note: I have added '\' as an escape character -hdd.
+
+   ``expand()'' references the VMS runtime routines, you will need to
+   link with the 'C' RTL whenever expand is used.
+
+   Parameters:
+
+         argc:  Pointer to the number of command arguments (from main),
+                the contents of this parameter are modified.
+
+         argv:  Pointer to the initial command argument list (from main),
+                the contents are copied into a new array which is returned
+                from this routine.
+
+         flag:  Flag indicating how to expand wild-cards:
+                   0 - Complete file name expansion
+                   1 - only file name (no directory or version).
+                   2 - directory info and file name (no version).
+                   3 - file name and version info (no directory).
+		   4 - omit fields that are the same as RMS default.
+ -*/
+
+/* Local prototypes. */
+int wild_found (char *string);
+char **wild_expand (const char *string, char **argv, int *argc,
+                    int extra, int flag);
+/*
+   General note: removing the prototyping and const keywords should
+   allow this code to compile with VMS 'C' compilers prior to version
+   2.3-024.
+*/
+
+char **expand (int *argc, const char *argv[], const int flag)
+{
+   int i, nargc;
+   char **nargv;
+   char *s1;
+
+   /* Get an initial amount of memory for the master nargv array. */
+   if ((nargv = (char **)malloc ((*argc+1) * sizeof (char *))) == NULL) {
+      fprintf (stderr, "Not enough memory to expand argument list\n");
+      exit (ErrorExit);
+   }
+   /* Copy the command name (0th argument), but only the name of the exe */
+   nargv[0] = strchr(argv[0],']');
+   if (nargv[0] != NULL) {
+       nargv[0]++;
+       if ((s1=strrchr(nargv[0],'.')) != NULL) *s1 = '\0';
+   } else {
+       nargv[0] = argv[0];	/* if nothing suitable take original */
+   }      
+
+   /* Copy all other arguments, expanding those that have wild characters. */
+   for (nargc = i = 1; i < *argc; i++) {
+      if (wild_found(argv[i]))
+         nargv = wild_expand(argv[i], nargv, &nargc, *argc-i, flag);
+      else
+         nargv[nargc++] = argv[i];
+   }
+   *argc = nargc;
+   nargv[nargc] = NULL;  /* realloc always 0 fills, but... */
+
+   return nargv;
+}
+
+static int wild_found (char *string)
+/*
+   Routine to search the given string for a VMS wild-card pattern.
+   Returns 1 if "*", "%", "[-", or "...]" is found.  (This may not
+   be all VMS wild-cards but it is enough for now--anyone that wants
+   to recognize others can change this code.)
+
+   Parameter:
+
+      string: '\0' terminated character array.
+*/
+{
+   int state = 0;
+
+   /* State of 0 is "rest" state.  State 1 on our way to [-, states 2-4
+      on our way to ...], negative states indicate the two quotes (' -10,
+      " -1).
+   */
+   for ( ;*string; string++) {
+      switch (*string) {
+      case '*':
+      case '%':
+         if (state >= 0)
+            return 1;                    /* Unquoted % or * found. */
+      break;
+      case '[':
+         if (state >= 0)
+            state = 1;
+      break;
+      case ']':
+         if (state == 4)
+            return 1;                    /* Unquoted ...] found. */
+         else if (state >= 0)
+            state = 0;
+      break;
+      case '-':
+         if (state == 1)
+            return 1;                    /* Unquoted [- found. */
+         else if (state >= 0)
+            state = 0;
+      break;
+      case '.':
+         if (state == 1 || state == 0)
+            state = 2;                   /* First '.' */
+         else if (state > 1 && state < 5)
+            state++;                     /* ... == states 2, 3, 4 */
+         else if (state >= 0)
+            state = 0;
+      break;
+      case '\'':
+         if (state <= -10)
+            state += 10;           /* One ', possibly one " also */
+         else if (state < 0)
+            state -= 10;           /* 0 ', possibly one " */
+         else
+            state = -10;           /* No ' or " prior to this ' */
+      break;
+      case '"':
+         if (state == -11)
+            state = -10;           /* Both " and ' prior to this. */
+         else if (state == -10)
+            state = -11;           /* A ' prior to this. */
+         else if (state == -1)
+            state = 0;             /* A " prior to this. */
+         else
+            state = -1;            /* No ' or " prior to this " */
+      break;
+      case '\\':
+         string = strcpy(string, string+1);
+	 state = 0;
+      break;
+      }
+   }
+   return 0;
+}
+
+
+static char **wild_expand(const char *wild, char **argv,
+			  int *argc, int extra, int flag)
+/*
+   Routine to expand wild into new arguments appended to the end
+   of argv[*argc].  This routine must realloc in order to make room
+   for the individual arguments and malloc for enough space for each
+   of the arguments.  The return value is a new **argv.
+
+   Parameters:
+
+         wild:  '\0' terminated string that needs to be expanded.
+
+         argv:  initial starting address of the argv array.
+
+         argc:  pointer to an integer that tells the current end of the
+                argument list.
+
+        extra:  The number of extra pointers that the returned argv
+                must have available for future assignments.
+
+         flag:  Flag indicating how to expand wild-card:
+                  0 - Complete file name expansion
+                  1 - only file name (no directory or version).
+                  2 - directory info and file name (no version)
+                  3 - file name and version info (no directory).
+		  4 - omit fields that are the same as RMS default.
+*/
+{
+   int more_to_go = 1, err, length, status, len_wild, i, ddev_l, ddir_l;
+   char *namptr;
+   struct FAB fab_blk;
+   struct NAMBLK nam_blk;
+   char path[256];
+   char *ddevice = &path[0];	/* default device and directory */
+   char *ddirectory, *ppath;
+
+   char *env = getenv("PATH");
+   ppath = &path[0];
+   while (*env) {
+       char *p = env++;
+       if ((*ppath++ = _toupper(*p)) == ':') {
+	   ddev_l = ppath - &path[0];
+	   *ppath++ = 0;
+	   ddirectory = ppath;
+       }
+   }
+   *ppath++ = 0;
+   ddir_l = ppath - ddirectory - 1;
+   len_wild = strlen(wild);
+
+   /* Initialize all the fab and nam fields needed for parse and search */
+
+   fab_blk = cc$rms_fab;                   /* Initialize FAB structure */
+
+   nam_blk.nam    = cc$rms_nam;            /* Initialize NAM structure */
+   fab_blk.fab$l_dna = ".*";               /* Default file specif.     */
+   fab_blk.fab$b_dns = 2;                  /* Length of default spec.  */
+   fab_blk.fab$l_nam = &nam_blk.nam;       /* Set address of NAM in FAB*/
+   nam_blk.nam.nam$b_ess = NAM$C_MAXRSS;   /* Set extended  string size*/
+   nam_blk.nam.nam$l_esa = nam_blk.es;     /* and address              */
+   nam_blk.nam.nam$b_rss = NAM$C_MAXRSS;   /* Set resultant string size*/
+   nam_blk.nam.nam$l_rsa = nam_blk.rs;     /* and address              */
+   nam_blk.nam.nam$l_rlf = NULL;           /* No related file address  */
+
+   fab_blk.fab$l_fna = wild;           /* Address of file name string  */
+   fab_blk.fab$b_fns = len_wild;       /* Length of file name string   */
+
+   /* Prepare to enter the search loop, parse fab. */
+   err = SYS$PARSE (&fab_blk);
+
+   /* Catch the directory not found error and return no files found. */
+   if (err != RMS$_NORMAL)
+      exit(err);
+
+   while (more_to_go) {
+      err = SYS$SEARCH (&fab_blk);
+      if (err == RMS$_NMF || err == RMS$_FNF)
+         more_to_go = 0;               /* Done, no more files found */
+      else if (err != RMS$_NORMAL)
+         exit (err);
+      else {
+      /* Count that we now have this many arguments. */
+         (*argc)++;
+
+      /* Make sure there is room for a new pointer. */
+         if ((argv = realloc (argv, (*argc + extra)*sizeof(char *))) == NULL) {
+            fprintf (stderr, "Not enough memory to expand argument list\n");
+            exit(ErrorExit);
+         }
+
+      /* Move the right name into the list. */
+         switch (flag) {
+         case 0:             /* Complete file name */
+            length = nam_blk.nam.nam$b_rsl;
+            namptr = nam_blk.rs;
+            break;
+         case 1:            /* File name only (no directory or version). */
+            length = nam_blk.nam.nam$b_name + nam_blk.nam.nam$b_type;
+            namptr = nam_blk.nam.nam$l_name;
+            break;
+         case 2:            /* directory and file name (no version) */
+            length = nam_blk.nam.nam$b_rsl - nam_blk.nam.nam$b_ver;
+            namptr = nam_blk.rs;
+            break;
+         case 3:            /* File name and version (no directory). */
+            length = nam_blk.nam.nam$b_name +
+                     nam_blk.nam.nam$b_type +
+                     nam_blk.nam.nam$b_ver;
+            namptr = nam_blk.nam.nam$l_name;
+            break;
+	 case 4:	     /* Remove redundant fields, no version */
+            length = nam_blk.nam.nam$b_rsl - nam_blk.nam.nam$b_ver;
+            namptr = nam_blk.rs;
+	    if ((nam_blk.nam.nam$b_dev==ddev_l) &&
+	    	!strncmp(namptr, ddevice, nam_blk.nam.nam$b_dev)) {
+		    length -= nam_blk.nam.nam$b_dev;
+		    namptr += nam_blk.nam.nam$b_dev;
+		    if ((nam_blk.nam.nam$b_dir==ddir_l) &&
+		    	!strncmp(namptr, ddirectory, nam_blk.nam.nam$b_dir)) {
+			    length -= nam_blk.nam.nam$b_dir;
+			    namptr += nam_blk.nam.nam$b_dir;
+			}
+		}
+            break;
+         default:
+            fprintf (stderr, "illegal flag used in VMS expand call\n");
+            exit (ErrorExit);
+	 } /* end of switch */
+	 /* Copy the requested string into the argument array. */
+         if ((argv[*argc-1] = malloc (length+1)) == NULL) {
+            fprintf (stderr, "Not enough memory to expand argument list\n");
+            exit (ErrorExit);
+	 }
+         /* Copy the string, translate to lower case */
+         /* strncpy (argv[*argc-1], namptr, length); */
+         for (i=0; i<length; i++) {
+	     argv[*argc-1][i] = _tolower(*namptr);
+	     namptr++;
+	 }
+         /* End of modification */
+         argv[*argc-1][length] = '\0';
+      }
+   } /* end while (more_to_go) */
+   return (argv);
+}
+
+/* Remove all the defines that might affect the user's code. */
+
+#undef redirect
+#undef filearg
+#undef expand
+#undef wild_found
+#undef wild_expand
+
+#if 0
+/* ------------------------ ECHO sample code ------------------------ */
+
+#include <stdio.h>
+/* here come the 3 lines that make this Unix program into a VMS one: */
+#ifdef VMS
+#include <redexp.vms>
+#endif
+
+/*
+   This main program allows you to run experiments with redexp.vms.
+   Try $ echo *.*, $ echo -f1 [-...]*.*, $ echo -f[0-3] *.*.
+   Questions about using "%", "\", etc. may be answered by testing
+   with this version of echo.
+
+   To use this, cut from the "#if 0" above up to the last #endif,
+   and put the text in echo.c. Assuming you have defined VAXC$INCLUDE
+   to also look in the directory where you put redexp.VMS, you should
+   be able to compile and link echo. Define a symbol echo as
+   	echo :== $sys$disk:[]echo
+   and you are ready to run.
+
+*/
+main(argc, argv)
+int argc;
+char *argv[];
+{
+    int i = 0;
+
+    while (i < argc) {
+	printf("argv[%d]: %s\n", i, argv[i]);
+	i++;	
+    }
+}
+/* ------------------------ ECHO sample code end --------------------- */
+#endif  /* if 0 */
Index: /trunk/Jgraph/show.c
===================================================================
--- /trunk/Jgraph/show.c	(revision 418)
+++ /trunk/Jgraph/show.c	(revision 418)
@@ -0,0 +1,430 @@
+/* 
+ * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/show.c,v $
+ * $Revision: 8.3 $
+ * $Date: 92/11/30 11:42:40 $
+ * $Author: jsp $
+ */ 
+
+#include <stdio.h>
+#include <math.h>
+#include "jgraph.h"
+
+static spaces(nsp)
+int nsp;
+{
+  while(nsp-- > 0) putchar(' ');
+}
+
+float ptoin(p)
+float p;
+{
+  return p / FCPI;
+}
+
+float ptoc(p, a)
+float p;
+Axis a;
+{
+  if (a->is_lg) {
+    return (float) exp((p / a->factor + a->logmin) * a->logfactor);
+  } else {
+    return (p / a->factor) + a->min;
+  }
+}
+
+float ptodist(p, a)
+float p;
+Axis a;
+{
+  if (a->is_lg) {
+    return p  / FCPI;
+  } else {
+    return (p / a->factor);
+  }
+}
+
+static show_mltiline(s)
+char *s;
+{
+  int i;
+
+  if (s != CNULL) {
+    for (i = 0; s[i] != '\0'; i++) {
+      if (s[i] == '\n') putchar('\\');
+      putchar(s[i]);
+    }
+  }
+  putchar('\n');
+}
+
+show_string(s)
+char *s;
+{
+  int i;
+
+  if (s != CNULL) {
+    printf(": ");
+    for (i = 0; s[i] != '\0'; i++) {
+      if (s[i] == '\n') putchar('\\');
+      if (s[i] == '\\') i++;
+      putchar(s[i]);
+    }
+  }
+  putchar('\n');
+}
+    
+   
+show_label(l, nsp, g)
+Label l;
+int nsp;
+Graph g;
+{
+  spaces(nsp); 
+  show_string(l->label);
+  spaces(nsp); printf("x %f ", ptoc(l->x, g->x_axis));
+               printf("y %f\n", ptoc(l->y, g->y_axis));
+  spaces(nsp); printf("hj%c vj%c ", l->hj, l->vj);
+               printf("rotate %f\n", l->rotate);
+  spaces(nsp); printf("font %s ", l->font);
+               printf("fontsize %f ", l->fontsize);
+	       printf("linesep %f\n", l->linesep);
+  if (l->graytype == 'g') {
+    spaces(nsp);
+    printf("lgray %f\n", l->gray[0]);
+  } else if (l->graytype == 'c') {
+    spaces(nsp);
+    printf("lcolor %f %f %f\n", l->gray[0], l->gray[1], l->gray[2]);
+  }
+  return;
+}
+
+show_lmark(l, nsp, g)
+Label l;
+int nsp;
+Graph g;
+{
+  spaces(nsp); show_string(l->label);
+  spaces(nsp); printf("x %f ", ptodist(l->x, g->x_axis));
+               printf("y %f\n", ptodist(l->y, g->y_axis));
+  spaces(nsp); printf("hj%c vj%c ", l->hj, l->vj);
+               printf("rotate %f\n", l->rotate);
+  spaces(nsp); printf("font %s ", l->font);
+               printf("fontsize %f\n", l->fontsize);
+  return;
+}
+
+show_curve(c, nsp, g)
+Curve c;
+int nsp;
+Graph g;
+{
+  Point p;
+  Point px;
+  Point py;
+  int i;
+  Flist fl;
+
+  if (c->l->label != CNULL) {
+    spaces(nsp); printf("label\n");
+    spaces(nsp+2);
+    printf("(* unless <legend custom>, this label\'s x\'s and y\'s will be ignored *)\n");
+    show_label(c->l, nsp+2, g);
+  }
+  
+  px = first(c->xepts);
+  py = first(c->yepts);
+  for(p = first(c->pts); p != nil(c->pts); p = next(p)) {
+    if (p->e == 'p') {
+      spaces(nsp); printf("pts %f %f\n", p->x, p->y);
+    } else if (p->e == 'x') {
+      spaces(nsp); 
+      printf("x_epts %f %f %f %f\n", p->x, p->y, px->x, next(px)->x);
+      px = next(next(px));
+    } else if (p->e == 'y') {
+      spaces(nsp); 
+      printf("y_epts %f %f %f %f\n", p->y, p->y, py->y, next(py)->y);
+      py = next(next(py));
+    } else {
+      fprintf(stderr, "Internal error: p->e == %c\n", p->e);
+      exit(1);
+    }
+  }
+  if (c->eps != CNULL) {
+    spaces(nsp);
+    printf("eps %s\n", c->eps);
+  }
+  if (c->postscript != CNULL) {
+    spaces(nsp);
+    printf("postscript ");
+    if (!c->postfile) printf(": ");
+    show_mltiline(c->postscript);
+  }
+  spaces(nsp); printf("marktype ");
+  for (i = 0; i < NMARKTYPES && c->marktype != MARKTYPES[i]; i++) ;
+  if (i == NMARKTYPES) {
+    error_header();
+    fprintf(stderr, "Unknown mark type %c\n", c->marktype);
+    exit(1);
+  } else printf("%s ", MARKTYPESTRS[i]);
+  if (c->marktype == 'l') {
+    show_lmark(c->lmark, nsp+2, g);
+    spaces(nsp);
+  }
+  printf("marksize %f %f ", ptodist(c->marksize[0], g->x_axis), 
+                            ptodist(c->marksize[1], g->y_axis));
+  printf("mrotate %f ", c->mrotate);
+  if (c->filltype == 'g') {
+     printf("fill %f\n", c->fill[0] );
+  } else if (c->filltype == 'c')  {
+     printf("cfill %f %f %f\n", c->fill[0], c->fill[1], c->fill[2] );
+  }
+  if (first(c->general_marks) != c->general_marks) {
+    spaces(nsp); printf("gmarks");
+    for(p = first(c->general_marks); p != nil(c->general_marks); p = next(p))
+      printf(" %f %f ", p->x, p->y);
+  }
+  printf("\n");
+  spaces(nsp);
+  if(!c->poly) printf("no"); printf("poly ");
+  if (c->pfilltype == 'g') {
+     printf("pfill %f", c->pfill[0] );
+  } else if (c->pfilltype == 'c')  {
+     printf("pcfill %f %f %f", c->pfill[0], c->pfill[1], c->pfill[2] );
+  }
+  printf("\n");
+  
+  spaces(nsp); printf("linetype ");
+  if (c->linetype == '0')  printf("none ");
+  else if (c->linetype == 's') printf("solid ");
+  else if (c->linetype == '.') printf("dotted ");
+  else if (c->linetype == '-') printf("dashed ");
+  else if (c->linetype == 'l') printf("longdash ");
+  else if (c->linetype == 'd') printf("dotdash ");
+  else if (c->linetype == 'D') printf("dotdotdash ");
+  else if (c->linetype == '2') printf("dotdotdashdash ");
+  else if (c->linetype == 'g') {
+    printf("general\n");
+    spaces(nsp+2);
+    printf("glines "); 
+    i = 0;
+    for (fl = first(c->gen_linetype); fl != nil(c->gen_linetype); 
+                                      fl = next(fl)) {
+      if (i == 6) {
+        printf("\n");
+        spaces(nsp + 9);
+        i = 0;
+      }
+      printf("%f ", fl->f);
+      i++;
+    }
+    printf("\n");
+    spaces(nsp);
+  }
+  printf("linethickness %f\n", c->linethick);
+  spaces(nsp); 
+  if (c->graytype == 'g') {
+    printf("gray %f ", c->gray[0]);
+  } else if (c->graytype == 'c') {
+    printf("color %f %f %f ", c->gray[0], c->gray[1], c->gray[2]);
+  }
+  if(!c->clip) printf("no"); printf("clip\n");
+  spaces(nsp);
+  for (i = 0; i < NPATTERNS && PTYPES[i] != c->pattern; i++) ;
+  printf("pattern %s %f ", PATTERNS[i], c->parg);
+  for (i = 0; i < NPATTERNS && PTYPES[i] != c->ppattern; i++) ;
+  printf("ppattern %s %f ", PATTERNS[i], c->pparg);
+  for (i = 0; i < NPATTERNS && PTYPES[i] != c->apattern; i++) ;
+  printf("apattern %s %f\n", PATTERNS[i], c->aparg);
+  spaces(nsp); 
+  if(!c->rarrow) printf("no"); printf("rarrow ");
+  if(!c->larrow) printf("no"); printf("larrow ");
+  if(!c->rarrows) printf("no"); printf("rarrows ");
+  if(!c->larrows) printf("no"); printf("larrows ");
+  if (c->afilltype == 'g') {
+     printf("afill %f\n", c->afill[0] );
+  } else if (c->afilltype == 'c')  {
+     printf("acfill %f %f %f\n", c->afill[0], c->afill[1], c->afill[2] );
+  }
+  spaces(nsp);
+  if(!c->bezier) printf("no"); printf("bezier ");
+  printf("asize %f %f\n", ptodist(c->asize[0], g->x_axis), 
+                          ptodist(c->asize[1], g->y_axis) * 2.0);
+}
+
+show_axis(a, nsp, g)
+Axis a;
+int nsp;
+Graph g;
+{
+  Axis other;
+  Hash h;
+  String s;
+
+  if (a->is_x) other = g->y_axis; else other = g->x_axis;
+  spaces(nsp); printf("size %f\n", a->size);
+  spaces(nsp); printf("min %f max %f %s\n", a->min, a->max,
+                      (a->is_lg) ? "log" : "linear");
+  if (!(a->draw_hash_labels || a->draw_axis_line ||
+        a->draw_hash_marks || a->draw_axis_label)) {
+    spaces(nsp);
+    printf("nodraw\n");
+    return;
+  }
+  spaces(nsp); printf("draw_at %f\n", ptoc(a->draw_at, other));
+  if (a->label->label != CNULL) {
+    spaces(nsp); printf("label\n");
+    show_label(a->label, nsp+2, g);
+  }
+  spaces(nsp); 
+  printf("%sdraw_hash_labels\n", (a->draw_hash_labels) ? "" : "no_");
+  spaces(nsp); 
+  printf("%sdraw_axis_line\n", (a->draw_axis_line) ? "" : "no_");
+  spaces(nsp); 
+  printf("%sdraw_hash_marks\n", (a->draw_hash_marks) ? "" : "no_");
+  spaces(nsp); 
+  printf("%sgrid_lines\n", (a->grid_lines) ? "" : "no_");
+  spaces(nsp); 
+  printf("%smgrid_lines\n", (a->mgrid_lines) ? "" : "no_");
+  spaces(nsp); 
+  printf("%sdraw_axis_label\n", (a->draw_axis_label) ? "" : "no_");
+  spaces(nsp); 
+  if (a->graytype == 'g') {
+    printf("gray %f\n", a->gray[0]);
+  } else if (a->graytype == 'c') {
+    printf("color %f %f %f\n", a->gray[0], a->gray[1], a->gray[2]);
+  }
+  spaces(nsp); 
+  if (a->gr_graytype == 'g') {
+    printf("gr_gray %f ", a->gr_gray[0]);
+  } else if (a->gr_graytype == 'c') {
+    printf("color %f %f %f ", a->gr_gray[0], a->gr_gray[1], a->gr_gray[2]);
+  }
+  if (a->mgr_graytype == 'g') {
+    printf("mgr_gray %f\n", a->mgr_gray[0]);
+  } else if (a->mgr_graytype == 'c') {
+    printf("color %f %f %f\n", a->mgr_gray[0], a->mgr_gray[1], a->mgr_gray[2]);
+  }
+
+  spaces(nsp);
+
+  printf("(* The real settings for generating auto_hash_labels:\n");
+  spaces(nsp+5);
+  printf("%sauto_hash_marks ", (a->auto_hash_marks) ? "" : "no_");
+  printf("%sauto_hash_labels\n", (a->auto_hash_labels) ? "" : "no_");
+  spaces(nsp+5); printf("hash %f shash %f mhash %d hash_format %c\n", 
+                       a->hash_interval, a->hash_start, a->minor_hashes,
+                       a->hash_format);
+  spaces(nsp+5);
+  if (a->is_lg) {
+    printf("log_base %f ", a->log_base);
+  }
+  printf("hash_scale %f ", a->hash_scale);
+  printf("precision %d\n", a->precision);
+  spaces(nsp+3);
+  printf("The following are explicit and implicit hash marks and labels *)\n");
+  
+  spaces(nsp); 
+  printf("hash 0 draw_hash_marks_at %f draw_hash_labels_at %f\n",
+         ptoc(a->draw_hash_marks_at, other), 
+         ptoc(a->draw_hash_labels_at, other));
+  spaces(nsp); printf("hash_labels (* The :, x, and y values are ignored *)\n");
+  show_label(a->hl, nsp + 2, g);
+  
+  for (h = first(a->hash_lines); h != nil(a->hash_lines); h = next(h)) {
+    spaces(nsp);
+    printf("%s %f\n", ((h->size == HASH_SIZE) ? "hash_at" : "mhash_at"),
+           ptoc(h->loc, a));
+  }
+  for (s = first(a->hash_labels); s != nil(a->hash_labels); s = next(s)) {
+    spaces(nsp);
+    printf("hash_label at %f ", ptoc(s->s->x, a));
+    show_string(s->s->label);
+  }
+}
+
+show_legend(l, nsp, g)
+Legend l;
+int nsp;
+Graph g;
+{
+  if (l->type == 'c') {
+    spaces(nsp); printf("custom\n");
+  } else if (l->type == 'n') {
+    spaces(nsp); printf("off\n");
+  }
+
+  spaces(nsp); printf("linelength %f linebreak %f midspace %f\n",
+     ptodist(l->linelength, g->x_axis), ptodist(l->linebreak, g->y_axis),
+     ptodist(l->midspace, g->x_axis));
+  if (l->type == 'u') {
+    spaces(nsp); printf("defaults");
+    show_label(l->l, nsp+2, g);
+  }
+}
+
+show_graph(g, nsp)
+Graph g;
+int nsp;
+{
+
+  Curve c;
+  String s;    
+  spaces(nsp); printf("x_translate %f y_translate %f\n", 
+                       ptoin(g->x_translate), ptoin(g->y_translate));
+  spaces(nsp); printf("xaxis\n"); show_axis(g->x_axis, nsp+2, g);
+  spaces(nsp); printf("yaxis\n"); show_axis(g->y_axis, nsp+2, g);
+  spaces(nsp); if(!g->clip) printf("no"); printf("clip ");
+               if(!g->border) printf("no"); printf("border\n");
+  for (c = first(g->curves); c != nil(g->curves); c = next(c)) {
+    spaces(nsp);
+    printf("curve %d\n", c->num);
+    show_curve(c, nsp+2, g);
+  }
+  spaces(nsp); printf("legend\n");
+  show_legend(g->legend, nsp+2, g);
+  if (g->title->label != CNULL) {
+    spaces(nsp);
+    printf("title\n");
+    show_label(g->title, nsp+2, g);
+  }
+  for (s = first(g->strings); s != nil(g->strings); s = next(s)) {
+    spaces(nsp);
+    printf("string %d\n", s->num);
+    show_label(s->s, nsp+2, g);
+  }
+}
+
+show_graphs(gs)
+Graphs gs;
+{
+  Graphs the_g;
+  Graph g;
+  char started;
+  int i;
+
+  started = 0;
+  for (the_g = first(gs); the_g != nil(gs); the_g = next(the_g)) {
+    if (started) printf("\nnewpage\n");
+    started = 1;
+    printf("X %f Y %f\n", ptoin(the_g->width), ptoin(the_g->height));
+    if (the_g->preamble != CNULL) {
+      printf("preamble ");
+      if (!the_g->prefile) printf(": ");
+      show_mltiline(the_g->preamble);
+    }
+    if (the_g->epilogue != CNULL) {
+      printf("epilogue ");
+      if (!the_g->epifile) printf(": ");
+      show_mltiline(the_g->epilogue);
+    }
+    printf("bbox"); 
+    for (i = 0; i < 4; i++) printf(" %d", the_g->bb[i]);
+    printf("\n");
+    for (g = first(the_g->g); g != nil(the_g->g); g = next(g)) {
+      printf("graph %d\n", g->num);
+      show_graph(g, 2);
+    }
+  }
+}
+
+
Index: /trunk/Jgraph/sin.c
===================================================================
--- /trunk/Jgraph/sin.c	(revision 418)
+++ /trunk/Jgraph/sin.c	(revision 418)
@@ -0,0 +1,7 @@
+#include <math.h>
+     main()
+     {
+       double x;
+       for (x = -10.0; x < 10.0; x += .03)
+         printf("%f %f\n", x, sin(x));
+     }
Index: /trunk/Jgraph/sin.jgr
===================================================================
--- /trunk/Jgraph/sin.jgr	(revision 418)
+++ /trunk/Jgraph/sin.jgr	(revision 418)
@@ -0,0 +1,24 @@
+(* This is a file to draw sin(i) for i going from -10 to 10.  The actual
+ * points were created by a c program which is included below. *) 
+
+newgraph 
+
+yaxis min -1 max 1 label : sin(i)
+xaxis min -10 max 10 label : i
+
+(* Plot the sin curve *)
+curve 1 
+  marktype none
+  linetype solid
+  pts shell : ./sin
+   (* sin is the executable of the following c program:
+
+     #include <math.h>
+     main();
+     {
+       double x;
+       for (x = -10.0; x < 10.0; x += .03)
+         printf("%f %f\n", x, sin(x));
+     }
+     
+   *)
Index: /trunk/Jgraph/sin.pts
===================================================================
--- /trunk/Jgraph/sin.pts	(revision 418)
+++ /trunk/Jgraph/sin.pts	(revision 418)
@@ -0,0 +1,667 @@
+-10.000000 0.544021
+-9.970000 0.518608
+-9.940000 0.492728
+-9.910000 0.466405
+-9.880000 0.439662
+-9.850000 0.412523
+-9.820000 0.385013
+-9.790000 0.357157
+-9.760000 0.328979
+-9.730000 0.300505
+-9.700000 0.271761
+-9.670000 0.242772
+-9.640000 0.213564
+-9.610000 0.184165
+-9.580000 0.154599
+-9.550000 0.124895
+-9.520000 0.095078
+-9.490000 0.065176
+-9.460000 0.035215
+-9.430000 0.005222
+-9.400000 -0.024775
+-9.370000 -0.054751
+-9.340000 -0.084676
+-9.310000 -0.114526
+-9.280000 -0.144273
+-9.250000 -0.173889
+-9.220000 -0.203350
+-9.190000 -0.232627
+-9.160000 -0.261695
+-9.130000 -0.290527
+-9.100000 -0.319098
+-9.070000 -0.347382
+-9.040000 -0.375353
+-9.010000 -0.402987
+-8.980000 -0.430257
+-8.950000 -0.457141
+-8.920000 -0.483613
+-8.890000 -0.509650
+-8.860000 -0.535228
+-8.830000 -0.560325
+-8.800000 -0.584917
+-8.770000 -0.608983
+-8.740000 -0.632501
+-8.710000 -0.655450
+-8.680000 -0.677809
+-8.650000 -0.699557
+-8.620000 -0.720677
+-8.590000 -0.741147
+-8.560000 -0.760951
+-8.530000 -0.780070
+-8.500000 -0.798487
+-8.470000 -0.816185
+-8.440000 -0.833149
+-8.410000 -0.849363
+-8.380000 -0.864813
+-8.350000 -0.879484
+-8.320000 -0.893364
+-8.290000 -0.906440
+-8.260000 -0.918701
+-8.230000 -0.930134
+-8.200000 -0.940731
+-8.170000 -0.950480
+-8.140000 -0.959375
+-8.110000 -0.967406
+-8.080000 -0.974566
+-8.050000 -0.980850
+-8.020000 -0.986251
+-7.990000 -0.990764
+-7.960000 -0.994385
+-7.930000 -0.997112
+-7.900000 -0.998941
+-7.870000 -0.999872
+-7.840000 -0.999902
+-7.810000 -0.999033
+-7.780000 -0.997265
+-7.750000 -0.994599
+-7.720000 -0.991038
+-7.690000 -0.986585
+-7.660000 -0.981244
+-7.630000 -0.975021
+-7.600000 -0.967920
+-7.570000 -0.959947
+-7.540000 -0.951111
+-7.510000 -0.941419
+-7.480000 -0.930880
+-7.450000 -0.919503
+-7.420000 -0.907299
+-7.390000 -0.894278
+-7.360000 -0.880452
+-7.330000 -0.865834
+-7.300000 -0.850437
+-7.270000 -0.834274
+-7.240000 -0.817361
+-7.210000 -0.799712
+-7.180000 -0.781343
+-7.150000 -0.762271
+-7.120000 -0.742513
+-7.090000 -0.722087
+-7.060000 -0.701011
+-7.030000 -0.679305
+-7.000000 -0.656987
+-6.970000 -0.634077
+-6.940000 -0.610597
+-6.910000 -0.586568
+-6.880000 -0.562011
+-6.850000 -0.536948
+-6.820000 -0.511401
+-6.790000 -0.485395
+-6.760000 -0.458951
+-6.730000 -0.432095
+-6.700000 -0.404850
+-6.670000 -0.377240
+-6.640000 -0.349291
+-6.610000 -0.321028
+-6.580000 -0.292476
+-6.550000 -0.263660
+-6.520000 -0.234607
+-6.490000 -0.205344
+-6.460000 -0.175895
+-6.430000 -0.146288
+-6.400000 -0.116549
+-6.370000 -0.086706
+-6.340000 -0.056784
+-6.310000 -0.026811
+-6.280000 0.003185
+-6.250000 0.033179
+-6.220000 0.063143
+-6.190000 0.093051
+-6.160000 0.122874
+-6.130000 0.152587
+-6.100000 0.182163
+-6.070000 0.211574
+-6.040000 0.240795
+-6.010000 0.269800
+-5.980000 0.298562
+-5.950000 0.327055
+-5.920000 0.355254
+-5.890000 0.383133
+-5.860000 0.410667
+-5.830000 0.437832
+-5.800000 0.464602
+-5.770000 0.490955
+-5.740000 0.516865
+-5.710000 0.542311
+-5.680000 0.567269
+-5.650000 0.591716
+-5.620000 0.615630
+-5.590000 0.638991
+-5.560000 0.661776
+-5.530000 0.683966
+-5.500000 0.705540
+-5.470000 0.726480
+-5.440000 0.746765
+-5.410000 0.766379
+-5.380000 0.785303
+-5.350000 0.803520
+-5.320000 0.821014
+-5.290000 0.837769
+-5.260000 0.853771
+-5.230000 0.869004
+-5.200000 0.883455
+-5.170000 0.897111
+-5.140000 0.909959
+-5.110000 0.921989
+-5.080000 0.933189
+-5.050000 0.943549
+-5.020000 0.953060
+-4.990000 0.961713
+-4.960000 0.969501
+-4.930000 0.976416
+-4.900000 0.982453
+-4.870000 0.987605
+-4.840000 0.991869
+-4.810000 0.995240
+-4.780000 0.997715
+-4.750000 0.999293
+-4.720000 0.999971
+-4.690000 0.999749
+-4.660000 0.998628
+-4.630000 0.996608
+-4.600000 0.993691
+-4.570000 0.989880
+-4.540000 0.985178
+-4.510000 0.979589
+-4.480000 0.973119
+-4.450000 0.965773
+-4.420000 0.957558
+-4.390000 0.948481
+-4.360000 0.938551
+-4.330000 0.927776
+-4.300000 0.916166
+-4.270000 0.903732
+-4.240000 0.890484
+-4.210000 0.876435
+-4.180000 0.861597
+-4.150000 0.845984
+-4.120000 0.829609
+-4.090000 0.812488
+-4.060000 0.794636
+-4.030000 0.776068
+-4.000000 0.756802
+-3.970000 0.736856
+-3.940000 0.716246
+-3.910000 0.694991
+-3.880000 0.673111
+-3.850000 0.650625
+-3.820000 0.627554
+-3.790000 0.603918
+-3.760000 0.579738
+-3.730000 0.555037
+-3.700000 0.529836
+-3.670000 0.504159
+-3.640000 0.478027
+-3.610000 0.451466
+-3.580000 0.424498
+-3.550000 0.397148
+-3.520000 0.369441
+-3.490000 0.341401
+-3.460000 0.313054
+-3.430000 0.284426
+-3.400000 0.255541
+-3.370000 0.226427
+-3.340000 0.197108
+-3.310000 0.167612
+-3.280000 0.137966
+-3.250000 0.108195
+-3.220000 0.078327
+-3.190000 0.048388
+-3.160000 0.018406
+-3.130000 -0.011592
+-3.100000 -0.041581
+-3.070000 -0.071532
+-3.040000 -0.101418
+-3.010000 -0.131213
+-2.980000 -0.160890
+-2.950000 -0.190423
+-2.920000 -0.219784
+-2.890000 -0.248947
+-2.860000 -0.277886
+-2.830000 -0.306575
+-2.800000 -0.334988
+-2.770000 -0.363100
+-2.740000 -0.390885
+-2.710000 -0.418318
+-2.680000 -0.445375
+-2.650000 -0.472031
+-2.620000 -0.498262
+-2.590000 -0.524044
+-2.560000 -0.549355
+-2.530000 -0.574172
+-2.500000 -0.598472
+-2.470000 -0.622234
+-2.440000 -0.645435
+-2.410000 -0.668056
+-2.380000 -0.690075
+-2.350000 -0.711473
+-2.320000 -0.732231
+-2.290000 -0.752331
+-2.260000 -0.771753
+-2.230000 -0.790480
+-2.200000 -0.808496
+-2.170000 -0.825785
+-2.140000 -0.842330
+-2.110000 -0.858118
+-2.080000 -0.873133
+-2.050000 -0.887362
+-2.020000 -0.900793
+-1.990000 -0.913413
+-1.960000 -0.925212
+-1.930000 -0.936177
+-1.900000 -0.946300
+-1.870000 -0.955572
+-1.840000 -0.963983
+-1.810000 -0.971527
+-1.780000 -0.978197
+-1.750000 -0.983986
+-1.720000 -0.988890
+-1.690000 -0.992904
+-1.660000 -0.996024
+-1.630000 -0.998248
+-1.600000 -0.999574
+-1.570000 -1.000000
+-1.540000 -0.999526
+-1.510000 -0.998152
+-1.480000 -0.995881
+-1.450000 -0.992713
+-1.420000 -0.988652
+-1.390000 -0.983701
+-1.360000 -0.977865
+-1.330000 -0.971148
+-1.300000 -0.963558
+-1.270000 -0.955101
+-1.240000 -0.945784
+-1.210000 -0.935616
+-1.180000 -0.924606
+-1.150000 -0.912764
+-1.120000 -0.900100
+-1.090000 -0.886627
+-1.060000 -0.872355
+-1.030000 -0.857299
+-1.000000 -0.841471
+-0.970000 -0.824886
+-0.940000 -0.807558
+-0.910000 -0.789504
+-0.880000 -0.770739
+-0.850000 -0.751280
+-0.820000 -0.731146
+-0.790000 -0.710353
+-0.760000 -0.688921
+-0.730000 -0.666870
+-0.700000 -0.644218
+-0.670000 -0.620986
+-0.640000 -0.597195
+-0.610000 -0.572867
+-0.580000 -0.548024
+-0.550000 -0.522687
+-0.520000 -0.496880
+-0.490000 -0.470626
+-0.460000 -0.443948
+-0.430000 -0.416871
+-0.400000 -0.389418
+-0.370000 -0.361615
+-0.340000 -0.333487
+-0.310000 -0.305059
+-0.280000 -0.276356
+-0.250000 -0.247404
+-0.220000 -0.218230
+-0.190000 -0.188859
+-0.160000 -0.159318
+-0.130000 -0.129634
+-0.100000 -0.099833
+-0.070000 -0.069943
+-0.040000 -0.039989
+-0.010000 -0.010000
+0.020000 0.019999
+0.050000 0.049979
+0.080000 0.079915
+0.110000 0.109778
+0.140000 0.139543
+0.170000 0.169182
+0.200000 0.198669
+0.230000 0.227978
+0.260000 0.257081
+0.290000 0.285952
+0.320000 0.314567
+0.350000 0.342898
+0.380000 0.370920
+0.410000 0.398609
+0.440000 0.425939
+0.470000 0.452886
+0.500000 0.479426
+0.530000 0.505533
+0.560000 0.531186
+0.590000 0.556361
+0.620000 0.581035
+0.650000 0.605186
+0.680000 0.628793
+0.710000 0.651834
+0.740000 0.674288
+0.770000 0.696135
+0.800000 0.717356
+0.830000 0.737931
+0.860000 0.757843
+0.890000 0.777072
+0.920000 0.795602
+0.950000 0.813416
+0.980000 0.830497
+1.010000 0.846832
+1.040000 0.862404
+1.070000 0.877201
+1.100000 0.891207
+1.130000 0.904412
+1.160000 0.916803
+1.190000 0.928369
+1.220000 0.939099
+1.250000 0.948985
+1.280000 0.958016
+1.310000 0.966185
+1.340000 0.973485
+1.370000 0.979908
+1.400000 0.985450
+1.430000 0.990105
+1.460000 0.993868
+1.490000 0.996738
+1.520000 0.998710
+1.550000 0.999784
+1.580000 0.999958
+1.610000 0.999232
+1.640000 0.997606
+1.670000 0.995083
+1.700000 0.991665
+1.730000 0.987354
+1.760000 0.982154
+1.790000 0.976071
+1.820000 0.969109
+1.850000 0.961275
+1.880000 0.952576
+1.910000 0.943020
+1.940000 0.932615
+1.970000 0.921371
+2.000000 0.909297
+2.030000 0.896406
+2.060000 0.882707
+2.090000 0.868215
+2.120000 0.852940
+2.150000 0.836899
+2.180000 0.820104
+2.210000 0.802571
+2.240000 0.784316
+2.270000 0.765355
+2.300000 0.745705
+2.330000 0.725384
+2.360000 0.704411
+2.390000 0.682803
+2.420000 0.660581
+2.450000 0.637765
+2.480000 0.614374
+2.510000 0.590431
+2.540000 0.565956
+2.570000 0.540972
+2.600000 0.515501
+2.630000 0.489567
+2.660000 0.463191
+2.690000 0.436399
+2.720000 0.409214
+2.750000 0.381661
+2.780000 0.353764
+2.810000 0.325549
+2.840000 0.297041
+2.870000 0.268266
+2.900000 0.239249
+2.930000 0.210017
+2.960000 0.180596
+2.990000 0.151013
+3.020000 0.121293
+3.050000 0.091465
+3.080000 0.061554
+3.110000 0.031587
+3.140000 0.001593
+3.170000 -0.028404
+3.200000 -0.058374
+3.230000 -0.088292
+3.260000 -0.118131
+3.290000 -0.147863
+3.320000 -0.177462
+3.350000 -0.206902
+3.380000 -0.236155
+3.410000 -0.265196
+3.440000 -0.293998
+3.470000 -0.322536
+3.500000 -0.350783
+3.530000 -0.378715
+3.560000 -0.406306
+3.590000 -0.433531
+3.620000 -0.460366
+3.650000 -0.486787
+3.680000 -0.512769
+3.710000 -0.538291
+3.740000 -0.563327
+3.770000 -0.587857
+3.800000 -0.611858
+3.830000 -0.635308
+3.860000 -0.658186
+3.890000 -0.680473
+3.920000 -0.702146
+3.950000 -0.723188
+3.980000 -0.743579
+4.010000 -0.763301
+4.040000 -0.782336
+4.070000 -0.800667
+4.100000 -0.818277
+4.130000 -0.835151
+4.160000 -0.851273
+4.190000 -0.866630
+4.220000 -0.881206
+4.250000 -0.894989
+4.280000 -0.907967
+4.310000 -0.920128
+4.340000 -0.931461
+4.370000 -0.941955
+4.400000 -0.951602
+4.430000 -0.960392
+4.460000 -0.968319
+4.490000 -0.975373
+4.520000 -0.981550
+4.550000 -0.986844
+4.580000 -0.991249
+4.610000 -0.994763
+4.640000 -0.997381
+4.670000 -0.999102
+4.700000 -0.999923
+4.730000 -0.999845
+4.760000 -0.998867
+4.790000 -0.996990
+4.820000 -0.994216
+4.850000 -0.990547
+4.880000 -0.985986
+4.910000 -0.980538
+4.940000 -0.974208
+4.970000 -0.967001
+5.000000 -0.958924
+5.030000 -0.949984
+5.060000 -0.940189
+5.090000 -0.929548
+5.120000 -0.918070
+5.150000 -0.905767
+5.180000 -0.892648
+5.210000 -0.878725
+5.240000 -0.864012
+5.270000 -0.848522
+5.300000 -0.832267
+5.330000 -0.815264
+5.360000 -0.797527
+5.390000 -0.779073
+5.420000 -0.759917
+5.450000 -0.740077
+5.480000 -0.719572
+5.510000 -0.698418
+5.540000 -0.676637
+5.570000 -0.654246
+5.600000 -0.631267
+5.630000 -0.607719
+5.660000 -0.583625
+5.690000 -0.559005
+5.720000 -0.533882
+5.750000 -0.508279
+5.780000 -0.482218
+5.810000 -0.455724
+5.840000 -0.428819
+5.870000 -0.401529
+5.900000 -0.373877
+5.930000 -0.345888
+5.960000 -0.317589
+5.990000 -0.289003
+6.020000 -0.260157
+6.050000 -0.231078
+6.080000 -0.201790
+6.110000 -0.172321
+6.140000 -0.142697
+6.170000 -0.112944
+6.200000 -0.083089
+6.230000 -0.053160
+6.260000 -0.023183
+6.290000 0.006815
+6.320000 0.036806
+6.350000 0.066765
+6.380000 0.096664
+6.410000 0.126475
+6.440000 0.156173
+6.470000 0.185730
+6.500000 0.215120
+6.530000 0.244316
+6.560000 0.273293
+6.590000 0.302024
+6.620000 0.330482
+6.650000 0.358644
+6.680000 0.386483
+6.710000 0.413973
+6.740000 0.441092
+6.770000 0.467813
+6.800000 0.494113
+6.830000 0.519969
+6.860000 0.545357
+6.890000 0.570254
+6.920000 0.594637
+6.950000 0.618486
+6.980000 0.641778
+7.010000 0.664493
+7.040000 0.686609
+7.070000 0.708108
+7.100000 0.728969
+7.130000 0.749174
+7.160000 0.768705
+7.190000 0.787545
+7.220000 0.805675
+7.250000 0.823081
+7.280000 0.839746
+7.310000 0.855655
+7.340000 0.870794
+7.370000 0.885149
+7.400000 0.898708
+7.430000 0.911458
+7.460000 0.923388
+7.490000 0.934487
+7.520000 0.944745
+7.550000 0.954152
+7.580000 0.962701
+7.610000 0.970384
+7.640000 0.977193
+7.670000 0.983123
+7.700000 0.988168
+7.730000 0.992324
+7.760000 0.995587
+7.790000 0.997954
+7.820000 0.999423
+7.850000 0.999992
+7.880000 0.999662
+7.910000 0.998431
+7.940000 0.996303
+7.970000 0.993277
+8.000000 0.989358
+8.030000 0.984549
+8.060000 0.978853
+8.090000 0.972277
+8.120000 0.964825
+8.150000 0.956506
+8.180000 0.947325
+8.210000 0.937292
+8.240000 0.926415
+8.270000 0.914705
+8.300000 0.902172
+8.330000 0.888827
+8.360000 0.874681
+8.390000 0.859749
+8.420000 0.844043
+8.450000 0.827577
+8.480000 0.810367
+8.510000 0.792427
+8.540000 0.773774
+8.570000 0.754425
+8.600000 0.734397
+8.630000 0.713708
+8.660000 0.692377
+8.690000 0.670422
+8.720000 0.647865
+8.750000 0.624724
+8.780000 0.601021
+8.810000 0.576777
+8.840000 0.552014
+8.870000 0.526755
+8.900000 0.501021
+8.930000 0.474836
+8.960000 0.448224
+8.990000 0.421209
+9.020000 0.393815
+9.050000 0.366066
+9.080000 0.337988
+9.110000 0.309605
+9.140000 0.280944
+9.170000 0.252031
+9.200000 0.222890
+9.230000 0.193549
+9.260000 0.164033
+9.290000 0.134370
+9.320000 0.104586
+9.350000 0.074708
+9.380000 0.044763
+9.410000 0.014777
+9.440000 -0.015221
+9.470000 -0.045207
+9.500000 -0.075151
+9.530000 -0.105028
+9.560000 -0.134810
+9.590000 -0.164471
+9.620000 -0.193984
+9.650000 -0.223323
+9.680000 -0.252460
+9.710000 -0.281371
+9.740000 -0.310028
+9.770000 -0.338406
+9.800000 -0.366479
+9.830000 -0.394223
+9.860000 -0.421612
+9.890000 -0.448621
+9.920000 -0.475227
+9.950000 -0.501405
+9.980000 -0.527132
Index: /trunk/Jgraph/sin1.jgr
===================================================================
--- /trunk/Jgraph/sin1.jgr	(revision 418)
+++ /trunk/Jgraph/sin1.jgr	(revision 418)
@@ -0,0 +1,46 @@
+(* This is an extension of sin.jgr only this time, the axes are at
+x = 0 and y = 0.  The hash labels are printed at the left and bottom. *)
+
+newgraph 
+
+yaxis min -1 max 1 label : sin(i) 
+  no_draw_hash_marks no_draw_axis_line
+
+xaxis min -10 max 10 label : i
+  no_draw_hash_marks no_draw_axis_line
+
+(* Plot the sin curve *)
+curve 1 
+  marktype none
+  linetype solid
+  pts include sin.pts
+   (* sin.pts was created by the following c program:
+
+     #include <math.h>
+     main();
+     {
+       double x;
+       for (x = -10.0; x < 10.0; x += .03)
+         printf("%f %f\n", x, sin(x));
+     }
+     
+   *)
+
+(* Now, create a new graph with the same dimensions, but with the
+ * x & y axes in a different place, and with no axis or hash labels.
+ * Also, make the hash marks smaller. *)
+
+newgraph
+inherit_axes
+xaxis draw draw_at 0 hash_scale -.5 no_draw_hash_labels no_draw_axis_label
+yaxis draw draw_at 0 hash_scale -.5 no_draw_hash_labels no_draw_axis_label
+
+(* Finally, we want the hash marks to be centered around the axes,
+ * so draw them again with a scaling of +5.
+ *)
+
+newgraph
+inherit_axes
+xaxis hash_scale .5
+yaxis hash_scale .5
+
Index: /trunk/Jgraph/sin2.c
===================================================================
--- /trunk/Jgraph/sin2.c	(revision 418)
+++ /trunk/Jgraph/sin2.c	(revision 418)
@@ -0,0 +1,7 @@
+#include <math.h>
+     main()
+     {
+       double x;
+       for (x = 0.1; x < 100.0; x += .03)
+         printf("%f %f\n", x, sin(x));
+     }
Index: /trunk/Jgraph/sin2.jgr
===================================================================
--- /trunk/Jgraph/sin2.jgr	(revision 418)
+++ /trunk/Jgraph/sin2.jgr	(revision 418)
@@ -0,0 +1,28 @@
+(* Now this is a sin wave from 0.1 to 100 with logarithmic axes *)
+
+newgraph 
+
+yaxis min -1 max 1 
+  label : sin(i)
+xaxis log 
+  label : i
+
+title : I vs sin(i);
+
+(* Plot the sin curve *)
+curve 1 
+  marktype none
+  linetype solid
+  pts include sin2.pts
+   (* sin2.pts was created by the following c program:
+
+     #include <math.h>
+     main();
+     {
+       double x;
+       for (x = 0.1; x < 100.0; x += .03)
+         printf("%f %f\n", x, sin(x));
+     }
+     
+   *)
+
Index: /trunk/Jgraph/sin2.pts
===================================================================
--- /trunk/Jgraph/sin2.pts	(revision 418)
+++ /trunk/Jgraph/sin2.pts	(revision 418)
@@ -0,0 +1,3330 @@
+0.100000 0.099833
+0.130000 0.129634
+0.160000 0.159318
+0.190000 0.188859
+0.220000 0.218230
+0.250000 0.247404
+0.280000 0.276356
+0.310000 0.305059
+0.340000 0.333487
+0.370000 0.361615
+0.400000 0.389418
+0.430000 0.416871
+0.460000 0.443948
+0.490000 0.470626
+0.520000 0.496880
+0.550000 0.522687
+0.580000 0.548024
+0.610000 0.572867
+0.640000 0.597195
+0.670000 0.620986
+0.700000 0.644218
+0.730000 0.666870
+0.760000 0.688921
+0.790000 0.710353
+0.820000 0.731146
+0.850000 0.751280
+0.880000 0.770739
+0.910000 0.789504
+0.940000 0.807558
+0.970000 0.824886
+1.000000 0.841471
+1.030000 0.857299
+1.060000 0.872355
+1.090000 0.886627
+1.120000 0.900100
+1.150000 0.912764
+1.180000 0.924606
+1.210000 0.935616
+1.240000 0.945784
+1.270000 0.955101
+1.300000 0.963558
+1.330000 0.971148
+1.360000 0.977865
+1.390000 0.983701
+1.420000 0.988652
+1.450000 0.992713
+1.480000 0.995881
+1.510000 0.998152
+1.540000 0.999526
+1.570000 1.000000
+1.600000 0.999574
+1.630000 0.998248
+1.660000 0.996024
+1.690000 0.992904
+1.720000 0.988890
+1.750000 0.983986
+1.780000 0.978197
+1.810000 0.971527
+1.840000 0.963983
+1.870000 0.955572
+1.900000 0.946300
+1.930000 0.936177
+1.960000 0.925212
+1.990000 0.913413
+2.020000 0.900793
+2.050000 0.887362
+2.080000 0.873133
+2.110000 0.858118
+2.140000 0.842330
+2.170000 0.825785
+2.200000 0.808496
+2.230000 0.790480
+2.260000 0.771753
+2.290000 0.752331
+2.320000 0.732231
+2.350000 0.711473
+2.380000 0.690075
+2.410000 0.668056
+2.440000 0.645435
+2.470000 0.622234
+2.500000 0.598472
+2.530000 0.574172
+2.560000 0.549355
+2.590000 0.524044
+2.620000 0.498262
+2.650000 0.472031
+2.680000 0.445375
+2.710000 0.418318
+2.740000 0.390885
+2.770000 0.363100
+2.800000 0.334988
+2.830000 0.306575
+2.860000 0.277886
+2.890000 0.248947
+2.920000 0.219784
+2.950000 0.190423
+2.980000 0.160890
+3.010000 0.131213
+3.040000 0.101418
+3.070000 0.071532
+3.100000 0.041581
+3.130000 0.011592
+3.160000 -0.018406
+3.190000 -0.048388
+3.220000 -0.078327
+3.250000 -0.108195
+3.280000 -0.137966
+3.310000 -0.167612
+3.340000 -0.197108
+3.370000 -0.226427
+3.400000 -0.255541
+3.430000 -0.284426
+3.460000 -0.313054
+3.490000 -0.341401
+3.520000 -0.369441
+3.550000 -0.397148
+3.580000 -0.424498
+3.610000 -0.451466
+3.640000 -0.478027
+3.670000 -0.504159
+3.700000 -0.529836
+3.730000 -0.555037
+3.760000 -0.579738
+3.790000 -0.603918
+3.820000 -0.627554
+3.850000 -0.650625
+3.880000 -0.673111
+3.910000 -0.694991
+3.940000 -0.716246
+3.970000 -0.736856
+4.000000 -0.756802
+4.030000 -0.776068
+4.060000 -0.794636
+4.090000 -0.812488
+4.120000 -0.829609
+4.150000 -0.845984
+4.180000 -0.861597
+4.210000 -0.876435
+4.240000 -0.890484
+4.270000 -0.903732
+4.300000 -0.916166
+4.330000 -0.927776
+4.360000 -0.938551
+4.390000 -0.948481
+4.420000 -0.957558
+4.450000 -0.965773
+4.480000 -0.973119
+4.510000 -0.979589
+4.540000 -0.985178
+4.570000 -0.989880
+4.600000 -0.993691
+4.630000 -0.996608
+4.660000 -0.998628
+4.690000 -0.999749
+4.720000 -0.999971
+4.750000 -0.999293
+4.780000 -0.997715
+4.810000 -0.995240
+4.840000 -0.991869
+4.870000 -0.987605
+4.900000 -0.982453
+4.930000 -0.976416
+4.960000 -0.969501
+4.990000 -0.961713
+5.020000 -0.953060
+5.050000 -0.943549
+5.080000 -0.933189
+5.110000 -0.921989
+5.140000 -0.909959
+5.170000 -0.897111
+5.200000 -0.883455
+5.230000 -0.869004
+5.260000 -0.853771
+5.290000 -0.837769
+5.320000 -0.821014
+5.350000 -0.803520
+5.380000 -0.785303
+5.410000 -0.766379
+5.440000 -0.746765
+5.470000 -0.726480
+5.500000 -0.705540
+5.530000 -0.683966
+5.560000 -0.661776
+5.590000 -0.638991
+5.620000 -0.615630
+5.650000 -0.591716
+5.680000 -0.567269
+5.710000 -0.542311
+5.740000 -0.516865
+5.770000 -0.490955
+5.800000 -0.464602
+5.830000 -0.437832
+5.860000 -0.410667
+5.890000 -0.383133
+5.920000 -0.355254
+5.950000 -0.327055
+5.980000 -0.298562
+6.010000 -0.269800
+6.040000 -0.240795
+6.070000 -0.211574
+6.100000 -0.182163
+6.130000 -0.152587
+6.160000 -0.122874
+6.190000 -0.093051
+6.220000 -0.063143
+6.250000 -0.033179
+6.280000 -0.003185
+6.310000 0.026811
+6.340000 0.056784
+6.370000 0.086706
+6.400000 0.116549
+6.430000 0.146288
+6.460000 0.175895
+6.490000 0.205344
+6.520000 0.234607
+6.550000 0.263660
+6.580000 0.292476
+6.610000 0.321028
+6.640000 0.349291
+6.670000 0.377240
+6.700000 0.404850
+6.730000 0.432095
+6.760000 0.458951
+6.790000 0.485395
+6.820000 0.511401
+6.850000 0.536948
+6.880000 0.562011
+6.910000 0.586568
+6.940000 0.610597
+6.970000 0.634077
+7.000000 0.656987
+7.030000 0.679305
+7.060000 0.701011
+7.090000 0.722087
+7.120000 0.742513
+7.150000 0.762271
+7.180000 0.781343
+7.210000 0.799712
+7.240000 0.817361
+7.270000 0.834274
+7.300000 0.850437
+7.330000 0.865834
+7.360000 0.880452
+7.390000 0.894278
+7.420000 0.907299
+7.450000 0.919503
+7.480000 0.930880
+7.510000 0.941419
+7.540000 0.951111
+7.570000 0.959947
+7.600000 0.967920
+7.630000 0.975021
+7.660000 0.981244
+7.690000 0.986585
+7.720000 0.991038
+7.750000 0.994599
+7.780000 0.997265
+7.810000 0.999033
+7.840000 0.999902
+7.870000 0.999872
+7.900000 0.998941
+7.930000 0.997112
+7.960000 0.994385
+7.990000 0.990764
+8.020000 0.986251
+8.050000 0.980850
+8.080000 0.974566
+8.110000 0.967406
+8.140000 0.959375
+8.170000 0.950480
+8.200000 0.940731
+8.230000 0.930134
+8.260000 0.918701
+8.290000 0.906440
+8.320000 0.893364
+8.350000 0.879484
+8.380000 0.864813
+8.410000 0.849363
+8.440000 0.833149
+8.470000 0.816185
+8.500000 0.798487
+8.530000 0.780070
+8.560000 0.760951
+8.590000 0.741147
+8.620000 0.720677
+8.650000 0.699557
+8.680000 0.677809
+8.710000 0.655450
+8.740000 0.632501
+8.770000 0.608983
+8.800000 0.584917
+8.830000 0.560325
+8.860000 0.535228
+8.890000 0.509650
+8.920000 0.483613
+8.950000 0.457141
+8.980000 0.430257
+9.010000 0.402987
+9.040000 0.375353
+9.070000 0.347382
+9.100000 0.319098
+9.130000 0.290527
+9.160000 0.261695
+9.190000 0.232627
+9.220000 0.203350
+9.250000 0.173889
+9.280000 0.144273
+9.310000 0.114526
+9.340000 0.084676
+9.370000 0.054751
+9.400000 0.024775
+9.430000 -0.005222
+9.460000 -0.035215
+9.490000 -0.065176
+9.520000 -0.095078
+9.550000 -0.124895
+9.580000 -0.154599
+9.610000 -0.184165
+9.640000 -0.213564
+9.670000 -0.242772
+9.700000 -0.271761
+9.730000 -0.300505
+9.760000 -0.328979
+9.790000 -0.357157
+9.820000 -0.385013
+9.850000 -0.412523
+9.880000 -0.439662
+9.910000 -0.466405
+9.940000 -0.492728
+9.970000 -0.518608
+10.000000 -0.544021
+10.030000 -0.568945
+10.060000 -0.593356
+10.090000 -0.617234
+10.120000 -0.640556
+10.150000 -0.663302
+10.180000 -0.685450
+10.210000 -0.706982
+10.240000 -0.727878
+10.270000 -0.748118
+10.300000 -0.767686
+10.330000 -0.786562
+10.360000 -0.804731
+10.390000 -0.822175
+10.420000 -0.838880
+10.450000 -0.854829
+10.480000 -0.870010
+10.510000 -0.884407
+10.540000 -0.898009
+10.570000 -0.910802
+10.600000 -0.922775
+10.630000 -0.933919
+10.660000 -0.944221
+10.690000 -0.953674
+10.720000 -0.962269
+10.750000 -0.969998
+10.780000 -0.976854
+10.810000 -0.982830
+10.840000 -0.987923
+10.870000 -0.992126
+10.900000 -0.995436
+10.930000 -0.997851
+10.960000 -0.999367
+10.990000 -0.999984
+11.020000 -0.999702
+11.050000 -0.998519
+11.080000 -0.996438
+11.110000 -0.993461
+11.140000 -0.989589
+11.170000 -0.984826
+11.200000 -0.979178
+11.230000 -0.972648
+11.260000 -0.965243
+11.290000 -0.956969
+11.320000 -0.947834
+11.350000 -0.937846
+11.380000 -0.927014
+11.410000 -0.915348
+11.440000 -0.902858
+11.470000 -0.889555
+11.500000 -0.875452
+11.530000 -0.860561
+11.560000 -0.844896
+11.590000 -0.828470
+11.620000 -0.811299
+11.650000 -0.793398
+11.680000 -0.774782
+11.710000 -0.755470
+11.740000 -0.735477
+11.770000 -0.714823
+11.800000 -0.693525
+11.830000 -0.671603
+11.860000 -0.649077
+11.890000 -0.625967
+11.920000 -0.602293
+11.950000 -0.578077
+11.980000 -0.553342
+12.010000 -0.528108
+12.040000 -0.502399
+12.070000 -0.476237
+12.100000 -0.449647
+12.130000 -0.422653
+12.160000 -0.395278
+12.190000 -0.367548
+12.220000 -0.339486
+12.250000 -0.311119
+12.280000 -0.282473
+12.310000 -0.253571
+12.340000 -0.224442
+12.370000 -0.195111
+12.400000 -0.165604
+12.430000 -0.135948
+12.460000 -0.106170
+12.490000 -0.076296
+12.520000 -0.046354
+12.550000 -0.016370
+12.580000 0.013629
+12.610000 0.043616
+12.640000 0.073563
+12.670000 0.103444
+12.700000 0.133232
+12.730000 0.162900
+12.760000 0.192422
+12.790000 0.221770
+12.820000 0.250919
+12.850000 0.279842
+12.880000 0.308513
+12.910000 0.336907
+12.940000 0.364997
+12.970000 0.392759
+13.000000 0.420167
+13.030000 0.447197
+13.060000 0.473825
+13.090000 0.500027
+13.120000 0.525778
+13.150000 0.551056
+13.180000 0.575838
+13.210000 0.600103
+13.240000 0.623827
+13.270000 0.646989
+13.300000 0.669570
+13.330000 0.691548
+13.360000 0.712903
+13.390000 0.733617
+13.420000 0.753671
+13.450000 0.773046
+13.480000 0.791726
+13.510000 0.809693
+13.540000 0.826932
+13.570000 0.843426
+13.600000 0.859162
+13.630000 0.874124
+13.660000 0.888300
+13.690000 0.901676
+13.720000 0.914240
+13.750000 0.925982
+13.780000 0.936891
+13.810000 0.946957
+13.840000 0.956170
+13.870000 0.964523
+13.900000 0.972008
+13.930000 0.978618
+13.960000 0.984347
+13.990000 0.989190
+14.020000 0.993144
+14.050000 0.996203
+14.080000 0.998366
+14.110000 0.999631
+14.140000 0.999996
+14.170000 0.999461
+14.200000 0.998027
+14.230000 0.995694
+14.260000 0.992466
+14.290000 0.988344
+14.320000 0.983333
+14.350000 0.977436
+14.380000 0.970661
+14.410000 0.963011
+14.440000 0.954495
+14.470000 0.945121
+14.500000 0.934895
+14.530000 0.923828
+14.560000 0.911930
+14.590000 0.899211
+14.620000 0.885683
+14.650000 0.871358
+14.680000 0.856249
+14.710000 0.840369
+14.740000 0.823733
+14.770000 0.806355
+14.800000 0.788252
+14.830000 0.769440
+14.860000 0.749935
+14.890000 0.729755
+14.920000 0.708918
+14.950000 0.687444
+14.980000 0.665351
+15.010000 0.642659
+15.040000 0.619388
+15.070000 0.595561
+15.100000 0.571197
+15.130000 0.546319
+15.160000 0.520950
+15.190000 0.495112
+15.220000 0.468828
+15.250000 0.442122
+15.280000 0.415019
+15.310000 0.387542
+15.340000 0.359716
+15.370000 0.331566
+15.400000 0.303118
+15.430000 0.274398
+15.460000 0.245430
+15.490000 0.216242
+15.520000 0.186858
+15.550000 0.157307
+15.580000 0.127614
+15.610000 0.097807
+15.640000 0.067911
+15.670000 0.037954
+15.700000 0.007963
+15.730000 -0.022035
+15.760000 -0.052013
+15.790000 -0.081945
+15.820000 -0.111802
+15.850000 -0.141560
+15.880000 -0.171189
+15.910000 -0.200665
+15.940000 -0.229960
+15.970000 -0.259048
+16.000000 -0.287903
+16.030000 -0.316499
+16.060000 -0.344810
+16.090000 -0.372811
+16.120000 -0.400476
+16.150000 -0.427781
+16.180000 -0.454701
+16.210000 -0.481212
+16.240000 -0.507290
+16.270000 -0.532911
+16.300000 -0.558052
+16.330000 -0.582692
+16.360000 -0.606807
+16.390000 -0.630375
+16.420000 -0.653377
+16.450000 -0.675791
+16.480000 -0.697596
+16.510000 -0.718774
+16.540000 -0.739304
+16.570000 -0.759170
+16.600000 -0.778352
+16.630000 -0.796834
+16.660000 -0.814599
+16.690000 -0.831630
+16.720000 -0.847913
+16.750000 -0.863433
+16.780000 -0.878177
+16.810000 -0.892129
+16.840000 -0.905279
+16.870000 -0.917615
+16.900000 -0.929124
+16.930000 -0.939797
+16.960000 -0.949625
+16.990000 -0.958598
+17.020000 -0.966708
+17.050000 -0.973948
+17.080000 -0.980312
+17.110000 -0.985794
+17.140000 -0.990388
+17.170000 -0.994092
+17.200000 -0.996900
+17.230000 -0.998811
+17.260000 -0.999824
+17.290000 -0.999937
+17.320000 -0.999150
+17.350000 -0.997463
+17.380000 -0.994880
+17.410000 -0.991400
+17.440000 -0.987029
+17.470000 -0.981769
+17.500000 -0.975626
+17.530000 -0.968605
+17.560000 -0.960712
+17.590000 -0.951954
+17.620000 -0.942340
+17.650000 -0.931878
+17.680000 -0.920577
+17.710000 -0.908448
+17.740000 -0.895501
+17.770000 -0.881748
+17.800000 -0.867202
+17.830000 -0.851876
+17.860000 -0.835782
+17.890000 -0.818937
+17.920000 -0.801354
+17.950000 -0.783051
+17.980000 -0.764043
+18.010000 -0.744347
+18.040000 -0.723981
+18.070000 -0.702964
+18.100000 -0.681314
+18.130000 -0.659051
+18.160000 -0.636195
+18.190000 -0.612766
+18.220000 -0.588786
+18.250000 -0.564276
+18.280000 -0.539258
+18.310000 -0.513755
+18.340000 -0.487790
+18.370000 -0.461385
+18.400000 -0.434566
+18.430000 -0.407355
+18.460000 -0.379778
+18.490000 -0.351859
+18.520000 -0.323623
+18.550000 -0.295096
+18.580000 -0.266303
+18.610000 -0.237271
+18.640000 -0.208026
+18.670000 -0.178593
+18.700000 -0.148999
+18.730000 -0.119271
+18.760000 -0.089436
+18.790000 -0.059521
+18.820000 -0.029552
+18.850000 0.000444
+18.880000 0.030439
+18.910000 0.060407
+18.940000 0.090321
+18.970000 0.120153
+19.000000 0.149877
+19.030000 0.179466
+19.060000 0.208894
+19.090000 0.238134
+19.120000 0.267159
+19.150000 0.295944
+19.180000 0.324463
+19.210000 0.352690
+19.240000 0.380599
+19.270000 0.408166
+19.300000 0.435365
+19.330000 0.462173
+19.360000 0.488565
+19.390000 0.514517
+19.420000 0.540006
+19.450000 0.565009
+19.480000 0.589504
+19.510000 0.613468
+19.540000 0.636880
+19.570000 0.659718
+19.600000 0.681964
+19.630000 0.703595
+19.660000 0.724593
+19.690000 0.744939
+19.720000 0.764615
+19.750000 0.783603
+19.780000 0.801885
+19.810000 0.819446
+19.840000 0.836270
+19.870000 0.852340
+19.900000 0.867644
+19.930000 0.882167
+19.960000 0.895896
+19.990000 0.908819
+20.020000 0.920924
+20.050000 0.932200
+20.080000 0.942637
+20.110000 0.952226
+20.140000 0.960958
+20.170000 0.968825
+20.200000 0.975821
+20.230000 0.981938
+20.260000 0.987171
+20.290000 0.991516
+20.320000 0.994969
+20.350000 0.997526
+20.380000 0.999186
+20.410000 0.999946
+20.440000 0.999807
+20.470000 0.998768
+20.500000 0.996830
+20.530000 0.993995
+20.560000 0.990265
+20.590000 0.985644
+20.620000 0.980136
+20.650000 0.973747
+20.680000 0.966480
+20.710000 0.958345
+20.740000 0.949346
+20.770000 0.939493
+20.800000 0.928795
+20.830000 0.917261
+20.860000 0.904902
+20.890000 0.891728
+20.920000 0.877751
+20.950000 0.862985
+20.980000 0.847442
+21.010000 0.831137
+21.040000 0.814083
+21.070000 0.796297
+21.100000 0.777794
+21.130000 0.758591
+21.160000 0.738706
+21.190000 0.718156
+21.220000 0.696959
+21.250000 0.675136
+21.280000 0.652704
+21.310000 0.629686
+21.340000 0.606100
+21.370000 0.581970
+21.400000 0.557315
+21.430000 0.532159
+21.460000 0.506524
+21.490000 0.480433
+21.520000 0.453910
+21.550000 0.426978
+21.580000 0.399662
+21.610000 0.371987
+21.640000 0.343977
+21.670000 0.315657
+21.700000 0.287053
+21.730000 0.258190
+21.760000 0.229096
+21.790000 0.199795
+21.820000 0.170314
+21.850000 0.140680
+21.880000 0.110920
+21.910000 0.081060
+21.940000 0.051126
+21.970000 0.021147
+22.000000 -0.008851
+22.030000 -0.038842
+22.060000 -0.068797
+22.090000 -0.098691
+22.120000 -0.128495
+22.150000 -0.158184
+22.180000 -0.187731
+22.210000 -0.217109
+22.240000 -0.246291
+22.270000 -0.275252
+22.300000 -0.303965
+22.330000 -0.332404
+22.360000 -0.360544
+22.390000 -0.388360
+22.420000 -0.415827
+22.450000 -0.442919
+22.480000 -0.469612
+22.510000 -0.495883
+22.540000 -0.521708
+22.570000 -0.547063
+22.600000 -0.571926
+22.630000 -0.596274
+22.660000 -0.620085
+22.690000 -0.643339
+22.720000 -0.666013
+22.750000 -0.688088
+22.780000 -0.709544
+22.810000 -0.730362
+22.840000 -0.750522
+22.870000 -0.770007
+22.900000 -0.788798
+22.930000 -0.806880
+22.960000 -0.824236
+22.990000 -0.840850
+23.020000 -0.856707
+23.050000 -0.871793
+23.080000 -0.886095
+23.110000 -0.899599
+23.140000 -0.912294
+23.170000 -0.924168
+23.200000 -0.935210
+23.230000 -0.945410
+23.260000 -0.954760
+23.290000 -0.963250
+23.320000 -0.970874
+23.350000 -0.977624
+23.380000 -0.983494
+23.410000 -0.988479
+23.440000 -0.992574
+23.470000 -0.995776
+23.500000 -0.998082
+23.530000 -0.999490
+23.560000 -0.999998
+23.590000 -0.999606
+23.620000 -0.998315
+23.650000 -0.996126
+23.680000 -0.993040
+23.710000 -0.989060
+23.740000 -0.984190
+23.770000 -0.978434
+23.800000 -0.971798
+23.830000 -0.964288
+23.860000 -0.955909
+23.890000 -0.946671
+23.920000 -0.936580
+23.950000 -0.925647
+23.980000 -0.913880
+24.010000 -0.901291
+24.040000 -0.887891
+24.070000 -0.873692
+24.100000 -0.858707
+24.130000 -0.842949
+24.160000 -0.826432
+24.190000 -0.809172
+24.220000 -0.791183
+24.250000 -0.772483
+24.280000 -0.753087
+24.310000 -0.733013
+24.340000 -0.712280
+24.370000 -0.690906
+24.400000 -0.668910
+24.430000 -0.646312
+24.460000 -0.623132
+24.490000 -0.599392
+24.520000 -0.575112
+24.550000 -0.550315
+24.580000 -0.525022
+24.610000 -0.499257
+24.640000 -0.473043
+24.670000 -0.446403
+24.700000 -0.419361
+24.730000 -0.391942
+24.760000 -0.364170
+24.790000 -0.336070
+24.820000 -0.307668
+24.850000 -0.278989
+24.880000 -0.250059
+24.910000 -0.220904
+24.940000 -0.191550
+24.970000 -0.162024
+25.000000 -0.132352
+25.030000 -0.102561
+25.060000 -0.072677
+25.090000 -0.042728
+25.120000 -0.012741
+25.150000 0.017258
+25.180000 0.047241
+25.210000 0.077182
+25.240000 0.107053
+25.270000 0.136828
+25.300000 0.166480
+25.330000 0.195982
+25.360000 0.225308
+25.390000 0.254430
+25.420000 0.283324
+25.450000 0.311963
+25.480000 0.340321
+25.510000 0.368373
+25.540000 0.396094
+25.570000 0.423458
+25.600000 0.450441
+25.630000 0.477018
+25.660000 0.503166
+25.690000 0.528862
+25.720000 0.554081
+25.750000 0.578802
+25.780000 0.603002
+25.810000 0.626659
+25.840000 0.649752
+25.870000 0.672261
+25.900000 0.694165
+25.930000 0.715444
+25.960000 0.736079
+25.990000 0.756051
+26.020000 0.775343
+26.050000 0.793938
+26.080000 0.811818
+26.110000 0.828967
+26.140000 0.845371
+26.170000 0.861013
+26.200000 0.875881
+26.230000 0.889961
+26.260000 0.903239
+26.290000 0.915705
+26.320000 0.927347
+26.350000 0.938154
+26.380000 0.948117
+26.410000 0.957226
+26.440000 0.965474
+26.470000 0.972854
+26.500000 0.979358
+26.530000 0.984980
+26.560000 0.989716
+26.590000 0.993562
+26.620000 0.996513
+26.650000 0.998567
+26.680000 0.999723
+26.710000 0.999979
+26.740000 0.999335
+26.770000 0.997792
+26.800000 0.995351
+26.830000 0.992014
+26.860000 0.987785
+26.890000 0.982666
+26.920000 0.976663
+26.950000 0.969782
+26.980000 0.962027
+27.010000 0.953407
+27.040000 0.943928
+27.070000 0.933601
+27.100000 0.922433
+27.130000 0.910435
+27.160000 0.897617
+27.190000 0.883992
+27.220000 0.869571
+27.250000 0.854368
+27.280000 0.838396
+27.310000 0.821669
+27.340000 0.804203
+27.370000 0.786014
+27.400000 0.767116
+27.430000 0.747529
+27.460000 0.727269
+27.490000 0.706354
+27.520000 0.684803
+27.550000 0.662637
+27.580000 0.639874
+27.610000 0.616535
+27.640000 0.592641
+27.670000 0.568214
+27.700000 0.543276
+27.730000 0.517848
+27.760000 0.491955
+27.790000 0.465619
+27.820000 0.438864
+27.850000 0.411714
+27.880000 0.384193
+27.910000 0.356327
+27.940000 0.328140
+27.970000 0.299658
+28.000000 0.270906
+28.030000 0.241910
+28.060000 0.212697
+28.090000 0.183292
+28.120000 0.153722
+28.150000 0.124014
+28.180000 0.094194
+28.210000 0.064290
+28.240000 0.034327
+28.270000 0.004334
+28.300000 -0.025663
+28.330000 -0.055637
+28.360000 -0.085561
+28.390000 -0.115408
+28.420000 -0.145152
+28.450000 -0.174764
+28.480000 -0.204219
+28.510000 -0.233491
+28.540000 -0.262552
+28.570000 -0.291377
+28.600000 -0.319940
+28.630000 -0.348215
+28.660000 -0.376176
+28.690000 -0.403799
+28.720000 -0.431059
+28.750000 -0.457931
+28.780000 -0.484390
+28.810000 -0.510414
+28.840000 -0.535978
+28.870000 -0.561060
+28.900000 -0.585637
+28.930000 -0.609687
+28.960000 -0.633189
+28.990000 -0.656120
+29.020000 -0.678461
+29.050000 -0.700192
+29.080000 -0.721292
+29.110000 -0.741743
+29.140000 -0.761527
+29.170000 -0.780626
+29.200000 -0.799021
+29.230000 -0.816698
+29.260000 -0.833640
+29.290000 -0.849832
+29.320000 -0.865259
+29.350000 -0.879907
+29.380000 -0.893763
+29.410000 -0.906815
+29.440000 -0.919051
+29.470000 -0.930460
+29.500000 -0.941031
+29.530000 -0.950756
+29.560000 -0.959625
+29.590000 -0.967630
+29.620000 -0.974765
+29.650000 -0.981022
+29.680000 -0.986397
+29.710000 -0.990884
+29.740000 -0.994479
+29.770000 -0.997179
+29.800000 -0.998982
+29.830000 -0.999886
+29.860000 -0.999889
+29.890000 -0.998994
+29.920000 -0.997199
+29.950000 -0.994506
+29.980000 -0.990919
+30.010000 -0.986440
+30.040000 -0.981073
+30.070000 -0.974823
+30.100000 -0.967696
+30.130000 -0.959698
+30.160000 -0.950837
+30.190000 -0.941119
+30.220000 -0.930555
+30.250000 -0.919154
+30.280000 -0.906925
+30.310000 -0.893880
+30.340000 -0.880031
+30.370000 -0.865389
+30.400000 -0.849969
+30.430000 -0.833784
+30.460000 -0.816849
+30.490000 -0.799178
+30.520000 -0.780788
+30.550000 -0.761696
+30.580000 -0.741918
+30.610000 -0.721473
+30.640000 -0.700378
+30.670000 -0.678653
+30.700000 -0.656317
+30.730000 -0.633390
+30.760000 -0.609894
+30.790000 -0.585848
+30.820000 -0.561276
+30.850000 -0.536198
+30.880000 -0.510638
+30.910000 -0.484618
+30.940000 -0.458162
+30.970000 -0.431294
+31.000000 -0.404038
+31.030000 -0.376418
+31.060000 -0.348459
+31.090000 -0.320187
+31.120000 -0.291626
+31.150000 -0.262803
+31.180000 -0.233744
+31.210000 -0.204474
+31.240000 -0.175020
+31.270000 -0.145409
+31.300000 -0.115667
+31.330000 -0.085821
+31.360000 -0.055897
+31.390000 -0.025924
+31.420000 0.004073
+31.450000 0.034067
+31.480000 0.064030
+31.510000 0.093935
+31.540000 0.123755
+31.570000 0.153465
+31.600000 0.183036
+31.630000 0.212442
+31.660000 0.241657
+31.690000 0.270655
+31.720000 0.299409
+31.750000 0.327894
+31.780000 0.356084
+31.810000 0.383953
+31.840000 0.411476
+31.870000 0.438630
+31.900000 0.465388
+31.930000 0.491728
+31.960000 0.517626
+31.990000 0.543057
+32.020000 0.568000
+32.050000 0.592431
+32.080000 0.616330
+32.110000 0.639674
+32.140000 0.662442
+32.170000 0.684614
+32.200000 0.706169
+32.230000 0.727090
+32.260000 0.747356
+32.290000 0.766949
+32.320000 0.785853
+32.350000 0.804049
+32.380000 0.821521
+32.410000 0.838254
+32.440000 0.854233
+32.470000 0.869443
+32.500000 0.883870
+32.530000 0.897503
+32.560000 0.910327
+32.590000 0.922332
+32.620000 0.933507
+32.650000 0.943842
+32.680000 0.953328
+32.710000 0.961956
+32.740000 0.969718
+32.770000 0.976607
+32.800000 0.982618
+32.830000 0.987744
+32.860000 0.991981
+32.890000 0.995326
+32.920000 0.997775
+32.950000 0.999326
+32.980000 0.999977
+33.010000 0.999729
+33.040000 0.998581
+33.070000 0.996534
+33.100000 0.993591
+33.130000 0.989753
+33.160000 0.985025
+33.190000 0.979410
+33.220000 0.972914
+33.250000 0.965542
+33.280000 0.957302
+33.310000 0.948199
+33.340000 0.938244
+33.370000 0.927444
+33.400000 0.915810
+33.430000 0.903351
+33.460000 0.890079
+33.490000 0.876007
+33.520000 0.861146
+33.550000 0.845510
+33.580000 0.829113
+33.610000 0.811970
+33.640000 0.794096
+33.670000 0.775508
+33.700000 0.756222
+33.730000 0.736255
+33.760000 0.715625
+33.790000 0.694352
+33.820000 0.672454
+33.850000 0.649950
+33.880000 0.626862
+33.910000 0.603210
+33.940000 0.579014
+33.970000 0.554298
+34.000000 0.529083
+34.030000 0.503391
+34.060000 0.477247
+34.090000 0.450673
+34.120000 0.423694
+34.150000 0.396333
+34.180000 0.368615
+34.210000 0.340566
+34.240000 0.312211
+34.270000 0.283574
+34.300000 0.254682
+34.330000 0.225561
+34.360000 0.196237
+34.390000 0.166737
+34.420000 0.137086
+34.450000 0.107312
+34.480000 0.077442
+34.510000 0.047501
+34.540000 0.017518
+34.570000 -0.012480
+34.600000 -0.042468
+34.630000 -0.072417
+34.660000 -0.102302
+34.690000 -0.132094
+34.720000 -0.161767
+34.750000 -0.191294
+34.780000 -0.220650
+34.810000 -0.249807
+34.840000 -0.278739
+34.870000 -0.307420
+34.900000 -0.335825
+34.930000 -0.363927
+34.960000 -0.391702
+34.990000 -0.419124
+35.020000 -0.446170
+35.050000 -0.472813
+35.080000 -0.499032
+35.110000 -0.524801
+35.140000 -0.550097
+35.170000 -0.574899
+35.200000 -0.599183
+35.230000 -0.622929
+35.260000 -0.646113
+35.290000 -0.668716
+35.320000 -0.690718
+35.350000 -0.712097
+35.380000 -0.732836
+35.410000 -0.752915
+35.440000 -0.772317
+35.470000 -0.791024
+35.500000 -0.809019
+35.530000 -0.826286
+35.560000 -0.842809
+35.590000 -0.858574
+35.620000 -0.873566
+35.650000 -0.887772
+35.680000 -0.901179
+35.710000 -0.913775
+35.740000 -0.925548
+35.770000 -0.936489
+35.800000 -0.946587
+35.830000 -0.955833
+35.860000 -0.964219
+35.890000 -0.971737
+35.920000 -0.978381
+35.950000 -0.984144
+35.980000 -0.989021
+36.010000 -0.993009
+36.040000 -0.996103
+36.070000 -0.998300
+36.100000 -0.999599
+36.130000 -0.999999
+36.160000 -0.999498
+36.190000 -0.998098
+36.220000 -0.995800
+36.250000 -0.992606
+36.280000 -0.988518
+36.310000 -0.983541
+36.340000 -0.977678
+36.370000 -0.970936
+36.400000 -0.963320
+36.430000 -0.954837
+36.460000 -0.945495
+36.490000 -0.935302
+36.520000 -0.924267
+36.550000 -0.912401
+36.580000 -0.899713
+36.610000 -0.886216
+36.640000 -0.871921
+36.670000 -0.856841
+36.700000 -0.840991
+36.730000 -0.824383
+36.760000 -0.807034
+36.790000 -0.788958
+36.820000 -0.770173
+36.850000 -0.750694
+36.880000 -0.730540
+36.910000 -0.709728
+36.940000 -0.688277
+36.970000 -0.666208
+37.000000 -0.643538
+37.030000 -0.620290
+37.060000 -0.596483
+37.090000 -0.572139
+37.120000 -0.547281
+37.150000 -0.521930
+37.180000 -0.496109
+37.210000 -0.469842
+37.240000 -0.443152
+37.270000 -0.416063
+37.300000 -0.388600
+37.330000 -0.360787
+37.360000 -0.332650
+37.390000 -0.304213
+37.420000 -0.275502
+37.450000 -0.246543
+37.480000 -0.217363
+37.510000 -0.187987
+37.540000 -0.158441
+37.570000 -0.128753
+37.600000 -0.098950
+37.630000 -0.069057
+37.660000 -0.039102
+37.690000 -0.009112
+37.720000 0.020887
+37.750000 0.050866
+37.780000 0.080800
+37.810000 0.110661
+37.840000 0.140423
+37.870000 0.170058
+37.900000 0.199540
+37.930000 0.228842
+37.960000 0.257939
+37.990000 0.286803
+38.020000 0.315410
+38.050000 0.343732
+38.080000 0.371745
+38.110000 0.399424
+38.140000 0.426743
+38.170000 0.453678
+38.200000 0.480205
+38.230000 0.506299
+38.260000 0.531938
+38.290000 0.557099
+38.320000 0.581758
+38.350000 0.605893
+38.380000 0.629483
+38.410000 0.652507
+38.440000 0.674944
+38.470000 0.696773
+38.500000 0.717975
+38.530000 0.738530
+38.560000 0.758422
+38.590000 0.777630
+38.620000 0.796139
+38.650000 0.813932
+38.680000 0.830992
+38.710000 0.847304
+38.740000 0.862853
+38.770000 0.877627
+38.800000 0.891610
+38.830000 0.904791
+38.860000 0.917157
+38.890000 0.928699
+38.920000 0.939404
+38.950000 0.949264
+38.980000 0.958270
+39.010000 0.966414
+39.040000 0.973687
+39.070000 0.980085
+39.100000 0.985600
+39.130000 0.990229
+39.160000 0.993966
+39.190000 0.996809
+39.220000 0.998755
+39.250000 0.999802
+39.280000 0.999949
+39.310000 0.999196
+39.340000 0.997545
+39.370000 0.994995
+39.400000 0.991550
+39.430000 0.987213
+39.460000 0.981987
+39.490000 0.975877
+39.520000 0.968890
+39.550000 0.961030
+39.580000 0.952306
+39.610000 0.942724
+39.640000 0.932294
+39.670000 0.921025
+39.700000 0.908927
+39.730000 0.896012
+39.760000 0.882290
+39.790000 0.867774
+39.820000 0.852477
+39.850000 0.836412
+39.880000 0.819595
+39.910000 0.802041
+39.940000 0.783765
+39.970000 0.764783
+40.000000 0.745113
+40.030000 0.724773
+40.060000 0.703780
+40.090000 0.682154
+40.120000 0.659914
+40.150000 0.637080
+40.180000 0.613673
+40.210000 0.589714
+40.240000 0.565224
+40.270000 0.540225
+40.300000 0.514740
+40.330000 0.488792
+40.360000 0.462404
+40.390000 0.435600
+40.420000 0.408404
+40.450000 0.380840
+40.480000 0.352933
+40.510000 0.324709
+40.540000 0.296193
+40.570000 0.267410
+40.600000 0.238387
+40.630000 0.209149
+40.660000 0.179723
+40.690000 0.150135
+40.720000 0.120412
+40.750000 0.090580
+40.780000 0.060667
+40.810000 0.030700
+40.840000 0.000704
+40.870000 -0.029291
+40.900000 -0.059261
+40.930000 -0.089177
+40.960000 -0.119013
+40.990000 -0.148742
+41.020000 -0.178336
+41.050000 -0.207771
+41.080000 -0.237018
+41.110000 -0.266052
+41.140000 -0.294847
+41.170000 -0.323376
+41.200000 -0.351615
+41.230000 -0.379537
+41.260000 -0.407117
+41.290000 -0.434331
+41.320000 -0.461154
+41.350000 -0.487562
+41.380000 -0.513532
+41.410000 -0.539039
+41.440000 -0.564061
+41.470000 -0.588575
+41.500000 -0.612560
+41.530000 -0.635994
+41.560000 -0.658855
+41.590000 -0.681123
+41.620000 -0.702778
+41.650000 -0.723801
+41.680000 -0.744173
+41.710000 -0.763874
+41.740000 -0.782889
+41.770000 -0.801199
+41.800000 -0.818787
+41.830000 -0.835639
+41.860000 -0.851739
+41.890000 -0.867072
+41.920000 -0.881626
+41.950000 -0.895385
+41.980000 -0.908339
+42.010000 -0.920476
+42.040000 -0.931784
+42.070000 -0.942253
+42.100000 -0.951875
+42.130000 -0.960640
+42.160000 -0.968540
+42.190000 -0.975569
+42.220000 -0.981720
+42.250000 -0.986987
+42.280000 -0.991366
+42.310000 -0.994853
+42.340000 -0.997445
+42.370000 -0.999139
+42.400000 -0.999934
+42.430000 -0.999829
+42.460000 -0.998824
+42.490000 -0.996921
+42.520000 -0.994120
+42.550000 -0.990424
+42.580000 -0.985838
+42.610000 -0.980364
+42.640000 -0.974007
+42.670000 -0.966775
+42.700000 -0.958672
+42.730000 -0.949706
+42.760000 -0.939886
+42.790000 -0.929220
+42.820000 -0.917718
+42.850000 -0.905390
+42.880000 -0.892247
+42.910000 -0.878301
+42.940000 -0.863565
+42.970000 -0.848051
+43.000000 -0.831775
+43.030000 -0.814750
+43.060000 -0.796991
+43.090000 -0.778516
+43.120000 -0.759339
+43.150000 -0.739480
+43.180000 -0.718955
+43.210000 -0.697783
+43.240000 -0.675983
+43.270000 -0.653574
+43.300000 -0.630578
+43.330000 -0.607014
+43.360000 -0.582903
+43.390000 -0.558268
+43.420000 -0.533131
+43.450000 -0.507514
+43.480000 -0.481440
+43.510000 -0.454933
+43.540000 -0.428017
+43.570000 -0.400715
+43.600000 -0.373053
+43.630000 -0.345055
+43.660000 -0.316746
+43.690000 -0.288153
+43.720000 -0.259300
+43.750000 -0.230214
+43.780000 -0.200920
+43.810000 -0.171446
+43.840000 -0.141817
+43.870000 -0.112061
+43.900000 -0.082204
+43.930000 -0.052273
+43.960000 -0.022295
+43.990000 0.007703
+44.020000 0.037694
+44.050000 0.067651
+44.080000 0.097547
+44.110000 0.127356
+44.140000 0.157050
+44.170000 0.186603
+44.200000 0.215987
+44.230000 0.245178
+44.260000 0.274147
+44.290000 0.302870
+44.320000 0.331321
+44.350000 0.359473
+44.380000 0.387302
+44.410000 0.414782
+44.440000 0.441889
+44.470000 0.468598
+44.500000 0.494885
+44.530000 0.520727
+44.560000 0.546101
+44.590000 0.570983
+44.620000 0.595351
+44.650000 0.619184
+44.680000 0.642459
+44.710000 0.665156
+44.740000 0.687255
+44.770000 0.708735
+44.800000 0.729577
+44.830000 0.749762
+44.860000 0.769273
+44.890000 0.788092
+44.920000 0.806201
+44.950000 0.823585
+44.980000 0.840228
+45.010000 0.856114
+45.040000 0.871230
+45.070000 0.885562
+45.100000 0.899097
+45.130000 0.911823
+45.160000 0.923729
+45.190000 0.934803
+45.220000 0.945035
+45.250000 0.954418
+45.280000 0.962941
+45.310000 0.970598
+45.340000 0.977381
+45.370000 0.983285
+45.400000 0.988304
+45.430000 0.992434
+45.460000 0.995670
+45.490000 0.998010
+45.520000 0.999452
+45.550000 0.999995
+45.580000 0.999638
+45.610000 0.998381
+45.640000 0.996226
+45.670000 0.993174
+45.700000 0.989229
+45.730000 0.984393
+45.760000 0.978671
+45.790000 0.972069
+45.820000 0.964591
+45.850000 0.956246
+45.880000 0.947040
+45.910000 0.936982
+45.940000 0.926081
+45.970000 0.914346
+46.000000 0.901788
+46.030000 0.888419
+46.060000 0.874250
+46.090000 0.859295
+46.120000 0.843566
+46.150000 0.827078
+46.180000 0.809846
+46.210000 0.791885
+46.240000 0.773211
+46.270000 0.753842
+46.300000 0.733794
+46.330000 0.713086
+46.360000 0.691736
+46.390000 0.669763
+46.420000 0.647188
+46.450000 0.624030
+46.480000 0.600311
+46.510000 0.576051
+46.540000 0.551273
+46.570000 0.525999
+46.600000 0.500252
+46.630000 0.474054
+46.660000 0.447430
+46.690000 0.420403
+46.720000 0.392998
+46.750000 0.365239
+46.780000 0.337152
+46.810000 0.308761
+46.840000 0.280092
+46.870000 0.251171
+46.900000 0.222024
+46.930000 0.192677
+46.960000 0.163157
+46.990000 0.133490
+47.020000 0.103703
+47.050000 0.073823
+47.080000 0.043876
+47.110000 0.013889
+47.140000 -0.016109
+47.170000 -0.046094
+47.200000 -0.076037
+47.230000 -0.105911
+47.260000 -0.135690
+47.290000 -0.165347
+47.320000 -0.194856
+47.350000 -0.224188
+47.380000 -0.253320
+47.410000 -0.282223
+47.440000 -0.310872
+47.470000 -0.339241
+47.500000 -0.367305
+47.530000 -0.395039
+47.560000 -0.422417
+47.590000 -0.449415
+47.620000 -0.476008
+47.650000 -0.502173
+47.680000 -0.527887
+47.710000 -0.553125
+47.740000 -0.577865
+47.770000 -0.602085
+47.800000 -0.625764
+47.830000 -0.648879
+47.860000 -0.671410
+47.890000 -0.693337
+47.920000 -0.714641
+47.950000 -0.735301
+47.980000 -0.755299
+48.010000 -0.774618
+48.040000 -0.793239
+48.070000 -0.811147
+48.100000 -0.828324
+48.130000 -0.844757
+48.160000 -0.860429
+48.190000 -0.875326
+48.220000 -0.889436
+48.250000 -0.902746
+48.280000 -0.915243
+48.310000 -0.926916
+48.340000 -0.937756
+48.370000 -0.947751
+48.400000 -0.956893
+48.430000 -0.965175
+48.460000 -0.972587
+48.490000 -0.979125
+48.520000 -0.984781
+48.550000 -0.989551
+48.580000 -0.993431
+48.610000 -0.996416
+48.640000 -0.998505
+48.670000 -0.999695
+48.700000 -0.999986
+48.730000 -0.999377
+48.760000 -0.997868
+48.790000 -0.995461
+48.820000 -0.992158
+48.850000 -0.987963
+48.880000 -0.982878
+48.910000 -0.976909
+48.940000 -0.970061
+48.970000 -0.962340
+49.000000 -0.953753
+49.030000 -0.944307
+49.060000 -0.934012
+49.090000 -0.922876
+49.120000 -0.910909
+49.150000 -0.898123
+49.180000 -0.884529
+49.210000 -0.870138
+49.240000 -0.854965
+49.270000 -0.839022
+49.300000 -0.822324
+49.330000 -0.804885
+49.360000 -0.786723
+49.390000 -0.767853
+49.420000 -0.748291
+49.450000 -0.728056
+49.480000 -0.707166
+49.510000 -0.685640
+49.540000 -0.663496
+49.570000 -0.640756
+49.600000 -0.617439
+49.630000 -0.593566
+49.660000 -0.569159
+49.690000 -0.544240
+49.720000 -0.518831
+49.750000 -0.492955
+49.780000 -0.466635
+49.810000 -0.439896
+49.840000 -0.412760
+49.870000 -0.385253
+49.900000 -0.357400
+49.930000 -0.329225
+49.960000 -0.300753
+49.990000 -0.272011
+50.020000 -0.243024
+50.050000 -0.213819
+50.080000 -0.184421
+50.110000 -0.154857
+50.140000 -0.125153
+50.170000 -0.095337
+50.200000 -0.065436
+50.230000 -0.035475
+50.260000 -0.005482
+50.290000 0.024515
+50.320000 0.054491
+50.350000 0.084417
+50.380000 0.114267
+50.410000 0.144015
+50.440000 0.173633
+50.470000 0.203095
+50.500000 0.232374
+50.530000 0.261444
+50.560000 0.290278
+50.590000 0.318852
+50.620000 0.347138
+50.650000 0.375112
+50.680000 0.402748
+50.710000 0.430022
+50.740000 0.456909
+50.770000 0.483385
+50.800000 0.509426
+50.830000 0.535008
+50.860000 0.560109
+50.890000 0.584706
+50.920000 0.608777
+50.950000 0.632299
+50.980000 0.655253
+51.010000 0.677617
+51.040000 0.699371
+51.070000 0.720496
+51.100000 0.740973
+51.130000 0.760782
+51.160000 0.779907
+51.190000 0.798330
+51.220000 0.816035
+51.250000 0.833005
+51.280000 0.849226
+51.310000 0.864682
+51.340000 0.879361
+51.370000 0.893247
+51.400000 0.906330
+51.430000 0.918598
+51.460000 0.930038
+51.490000 0.940642
+51.520000 0.950399
+51.550000 0.959301
+51.580000 0.967340
+51.610000 0.974508
+51.640000 0.980799
+51.670000 0.986208
+51.700000 0.990728
+51.730000 0.994358
+51.760000 0.997092
+51.790000 0.998929
+51.820000 0.999868
+51.850000 0.999906
+51.880000 0.999044
+51.910000 0.997284
+51.940000 0.994626
+51.970000 0.991073
+52.000000 0.986628
+52.030000 0.981295
+52.060000 0.975079
+52.090000 0.967985
+52.120000 0.960020
+52.150000 0.951192
+52.180000 0.941507
+52.210000 0.930975
+52.240000 0.919606
+52.270000 0.907408
+52.300000 0.894394
+52.330000 0.880575
+52.360000 0.865964
+52.390000 0.850574
+52.420000 0.834418
+52.450000 0.817511
+52.480000 0.799868
+52.510000 0.781505
+52.540000 0.762440
+52.570000 0.742688
+52.600000 0.722267
+52.630000 0.701197
+52.660000 0.679496
+52.690000 0.657183
+52.720000 0.634279
+52.750000 0.610804
+52.780000 0.586779
+52.810000 0.562226
+52.840000 0.537167
+52.870000 0.511625
+52.900000 0.485622
+52.930000 0.459183
+52.960000 0.432330
+52.990000 0.405088
+53.020000 0.377482
+53.050000 0.349535
+53.080000 0.321275
+53.110000 0.292725
+53.140000 0.263911
+53.170000 0.234861
+53.200000 0.205598
+53.230000 0.176151
+53.260000 0.146545
+53.290000 0.116808
+53.320000 0.086965
+53.350000 0.057044
+53.380000 0.027072
+53.410000 -0.002925
+53.440000 -0.032919
+53.470000 -0.062883
+53.500000 -0.092791
+53.530000 -0.122616
+53.560000 -0.152330
+53.590000 -0.181906
+53.620000 -0.211320
+53.650000 -0.240543
+53.680000 -0.269549
+53.710000 -0.298313
+53.740000 -0.326809
+53.770000 -0.355010
+53.800000 -0.382892
+53.830000 -0.410429
+53.860000 -0.437597
+53.890000 -0.464372
+53.920000 -0.490728
+53.950000 -0.516642
+53.980000 -0.542092
+54.010000 -0.567054
+54.040000 -0.591506
+54.070000 -0.615425
+54.100000 -0.638790
+54.130000 -0.661581
+54.160000 -0.683776
+54.190000 -0.705356
+54.220000 -0.726301
+54.250000 -0.746592
+54.280000 -0.766212
+54.310000 -0.785142
+54.340000 -0.803365
+54.370000 -0.820866
+54.400000 -0.837627
+54.430000 -0.853635
+54.460000 -0.868875
+54.490000 -0.883333
+54.520000 -0.896995
+54.550000 -0.909851
+54.580000 -0.921888
+54.610000 -0.933095
+54.640000 -0.943462
+54.670000 -0.952981
+54.700000 -0.961642
+54.730000 -0.969437
+54.760000 -0.976360
+54.790000 -0.982404
+54.820000 -0.987564
+54.850000 -0.991836
+54.880000 -0.995214
+54.910000 -0.997698
+54.940000 -0.999283
+54.970000 -0.999969
+55.000000 -0.999755
+55.030000 -0.998642
+55.060000 -0.996629
+55.090000 -0.993720
+55.120000 -0.989917
+55.150000 -0.985222
+55.180000 -0.979641
+55.210000 -0.973179
+55.240000 -0.965841
+55.270000 -0.957633
+55.300000 -0.948564
+55.330000 -0.938641
+55.360000 -0.927873
+55.390000 -0.916270
+55.420000 -0.903843
+55.450000 -0.890602
+55.480000 -0.876560
+55.510000 -0.861729
+55.540000 -0.846123
+55.570000 -0.829755
+55.600000 -0.812640
+55.630000 -0.794794
+55.660000 -0.776233
+55.690000 -0.756973
+55.720000 -0.737032
+55.750000 -0.716427
+55.780000 -0.695178
+55.810000 -0.673303
+55.840000 -0.650823
+55.870000 -0.627757
+55.900000 -0.604125
+55.930000 -0.579950
+55.960000 -0.555254
+55.990000 -0.530057
+56.020000 -0.504383
+56.050000 -0.478256
+56.080000 -0.451698
+56.110000 -0.424734
+56.140000 -0.397387
+56.170000 -0.369683
+56.200000 -0.341646
+56.230000 -0.313302
+56.260000 -0.284675
+56.290000 -0.255793
+56.320000 -0.226680
+56.350000 -0.197363
+56.380000 -0.167869
+56.410000 -0.138224
+56.440000 -0.108454
+56.470000 -0.078587
+56.500000 -0.048649
+56.530000 -0.018667
+56.560000 0.011332
+56.590000 0.041320
+56.620000 0.071272
+56.650000 0.101159
+56.680000 0.130955
+56.710000 0.160633
+56.740000 0.190167
+56.770000 0.219530
+56.800000 0.248695
+56.830000 0.277636
+56.860000 0.306327
+56.890000 0.334743
+56.920000 0.362857
+56.950000 0.390645
+56.980000 0.418081
+57.010000 0.445141
+57.040000 0.471801
+57.070000 0.498036
+57.100000 0.523823
+57.130000 0.549138
+57.160000 0.573959
+57.190000 0.598263
+57.220000 0.622030
+57.250000 0.645236
+57.280000 0.667862
+57.310000 0.689886
+57.340000 0.711290
+57.370000 0.732054
+57.400000 0.752159
+57.430000 0.771587
+57.460000 0.790321
+57.490000 0.808343
+57.520000 0.825638
+57.550000 0.842190
+57.580000 0.857984
+57.610000 0.873006
+57.640000 0.887242
+57.670000 0.900680
+57.700000 0.913307
+57.730000 0.925113
+57.760000 0.936085
+57.790000 0.946216
+57.820000 0.955495
+57.850000 0.963914
+57.880000 0.971465
+57.910000 0.978142
+57.940000 0.983939
+57.970000 0.988851
+58.000000 0.992873
+58.030000 0.996001
+58.060000 0.998233
+58.090000 0.999566
+58.120000 1.000000
+58.150000 0.999534
+58.180000 0.998168
+58.210000 0.995904
+58.240000 0.992744
+58.270000 0.988691
+58.300000 0.983748
+58.330000 0.977919
+58.360000 0.971210
+58.390000 0.963628
+58.420000 0.955178
+58.450000 0.945869
+58.480000 0.935708
+58.510000 0.924705
+58.540000 0.912870
+58.570000 0.900214
+58.600000 0.886747
+58.630000 0.872483
+58.660000 0.857433
+58.690000 0.841612
+58.720000 0.825033
+58.750000 0.807712
+58.780000 0.789664
+58.810000 0.770905
+58.840000 0.751452
+58.870000 0.731323
+58.900000 0.710537
+58.930000 0.689110
+58.960000 0.667064
+58.990000 0.644417
+59.020000 0.621190
+59.050000 0.597404
+59.080000 0.573081
+59.110000 0.548242
+59.140000 0.522909
+59.170000 0.497106
+59.200000 0.470856
+59.230000 0.444181
+59.260000 0.417107
+59.290000 0.389658
+59.320000 0.361858
+59.350000 0.333733
+59.380000 0.305307
+59.410000 0.276606
+59.440000 0.247656
+59.470000 0.218484
+59.500000 0.189115
+59.530000 0.159575
+59.560000 0.129892
+59.590000 0.100093
+59.620000 0.070203
+59.650000 0.040250
+59.680000 0.010260
+59.710000 -0.019738
+59.740000 -0.049719
+59.770000 -0.079655
+59.800000 -0.109519
+59.830000 -0.139285
+59.860000 -0.168926
+59.890000 -0.198414
+59.920000 -0.227724
+59.950000 -0.256829
+59.980000 -0.285703
+60.010000 -0.314319
+60.040000 -0.342653
+60.070000 -0.370679
+60.100000 -0.398370
+60.130000 -0.425704
+60.160000 -0.452654
+60.190000 -0.479197
+60.220000 -0.505309
+60.250000 -0.530966
+60.280000 -0.556145
+60.310000 -0.580823
+60.340000 -0.604979
+60.370000 -0.628591
+60.400000 -0.651636
+60.430000 -0.674096
+60.460000 -0.695948
+60.490000 -0.717175
+60.520000 -0.737756
+60.550000 -0.757673
+60.580000 -0.776908
+60.610000 -0.795444
+60.640000 -0.813264
+60.670000 -0.830352
+60.700000 -0.846693
+60.730000 -0.862272
+60.760000 -0.877075
+60.790000 -0.891089
+60.820000 -0.904301
+60.850000 -0.916699
+60.880000 -0.928272
+60.910000 -0.939010
+60.940000 -0.948902
+60.970000 -0.957941
+61.000000 -0.966118
+61.030000 -0.973425
+61.060000 -0.979856
+61.090000 -0.985405
+61.120000 -0.990068
+61.150000 -0.993840
+61.180000 -0.996717
+61.210000 -0.998697
+61.240000 -0.999778
+61.270000 -0.999960
+61.300000 -0.999242
+61.330000 -0.997624
+61.360000 -0.995109
+61.390000 -0.991698
+61.420000 -0.987395
+61.450000 -0.982203
+61.480000 -0.976128
+61.510000 -0.969173
+61.540000 -0.961347
+61.570000 -0.952655
+61.600000 -0.943107
+61.630000 -0.932709
+61.660000 -0.921472
+61.690000 -0.909406
+61.720000 -0.896521
+61.750000 -0.882830
+61.780000 -0.868344
+61.810000 -0.853076
+61.840000 -0.837041
+61.870000 -0.820253
+61.900000 -0.802726
+61.930000 -0.784477
+61.960000 -0.765523
+61.990000 -0.745879
+62.020000 -0.725564
+62.050000 -0.704596
+62.080000 -0.682993
+62.110000 -0.660777
+62.140000 -0.637965
+62.170000 -0.614580
+62.200000 -0.590641
+62.230000 -0.566171
+62.260000 -0.541191
+62.290000 -0.515725
+62.320000 -0.489794
+62.350000 -0.463422
+62.380000 -0.436633
+62.410000 -0.409452
+62.440000 -0.381902
+62.470000 -0.354008
+62.500000 -0.325796
+62.530000 -0.297290
+62.560000 -0.268517
+62.590000 -0.239502
+62.620000 -0.210272
+62.650000 -0.180852
+62.680000 -0.151270
+62.710000 -0.121552
+62.740000 -0.091724
+62.770000 -0.061814
+62.800000 -0.031848
+62.830000 -0.001853
+62.860000 0.028143
+62.890000 0.058114
+62.920000 0.088033
+62.950000 0.117872
+62.980000 0.147606
+63.010000 0.177206
+63.040000 0.206647
+63.070000 0.235902
+63.100000 0.264945
+63.130000 0.293749
+63.160000 0.322289
+63.190000 0.350539
+63.220000 0.378474
+63.250000 0.406068
+63.280000 0.433296
+63.310000 0.460135
+63.340000 0.486559
+63.370000 0.512546
+63.400000 0.538071
+63.430000 0.563112
+63.460000 0.587646
+63.490000 0.611652
+63.520000 0.635107
+63.550000 0.657990
+63.580000 0.680282
+63.610000 0.701961
+63.640000 0.723008
+63.670000 0.743405
+63.700000 0.763133
+63.730000 0.782174
+63.760000 0.800511
+63.790000 0.818127
+63.820000 0.835008
+63.850000 0.851137
+63.880000 0.866500
+63.910000 0.881083
+63.940000 0.894873
+63.970000 0.907858
+64.000000 0.920026
+64.030000 0.931366
+64.060000 0.941868
+64.090000 0.951522
+64.120000 0.960320
+64.150000 0.968254
+64.180000 0.975316
+64.210000 0.981500
+64.240000 0.986802
+64.270000 0.991215
+64.300000 0.994736
+64.330000 0.997362
+64.360000 0.999091
+64.390000 0.999920
+64.420000 0.999849
+64.450000 0.998879
+64.480000 0.997010
+64.510000 0.994243
+64.540000 0.990582
+64.570000 0.986030
+64.600000 0.980589
+64.630000 0.974267
+64.660000 0.967068
+64.690000 0.958998
+64.720000 0.950065
+64.750000 0.940278
+64.780000 0.929644
+64.810000 0.918174
+64.840000 0.905877
+64.870000 0.892765
+64.900000 0.878850
+64.930000 0.864143
+64.960000 0.848659
+64.990000 0.832412
+65.020000 0.815415
+65.050000 0.797684
+65.080000 0.779236
+65.110000 0.760086
+65.140000 0.740252
+65.170000 0.719752
+65.200000 0.698605
+65.230000 0.676828
+65.260000 0.654443
+65.290000 0.631469
+65.320000 0.607926
+65.350000 0.583836
+65.380000 0.559221
+65.410000 0.534102
+65.440000 0.508503
+65.470000 0.482447
+65.500000 0.455956
+65.530000 0.429054
+65.560000 0.401767
+65.590000 0.374118
+65.620000 0.346133
+65.650000 0.317835
+65.680000 0.289252
+65.710000 0.260409
+65.740000 0.231331
+65.770000 0.202045
+65.800000 0.172577
+65.830000 0.142954
+65.860000 0.113203
+65.890000 0.083349
+65.920000 0.053420
+65.950000 0.023444
+65.980000 -0.006554
+66.010000 -0.036546
+66.040000 -0.066505
+66.070000 -0.096404
+66.100000 -0.126217
+66.130000 -0.155916
+66.160000 -0.185474
+66.190000 -0.214866
+66.220000 -0.244064
+66.250000 -0.273042
+66.280000 -0.301775
+66.310000 -0.330237
+66.340000 -0.358401
+66.370000 -0.386242
+66.400000 -0.413736
+66.430000 -0.440858
+66.460000 -0.467583
+66.490000 -0.493887
+66.520000 -0.519747
+66.550000 -0.545138
+66.580000 -0.570040
+66.610000 -0.594428
+66.640000 -0.618281
+66.670000 -0.641578
+66.700000 -0.664298
+66.730000 -0.686420
+66.760000 -0.707924
+66.790000 -0.728791
+66.820000 -0.749002
+66.850000 -0.768539
+66.880000 -0.787384
+66.910000 -0.805521
+66.940000 -0.822933
+66.970000 -0.839604
+67.000000 -0.855520
+67.030000 -0.870666
+67.060000 -0.885028
+67.090000 -0.898594
+67.120000 -0.911351
+67.150000 -0.923288
+67.180000 -0.934394
+67.210000 -0.944659
+67.240000 -0.954074
+67.270000 -0.962631
+67.300000 -0.970321
+67.330000 -0.977138
+67.360000 -0.983075
+67.390000 -0.988128
+67.420000 -0.992292
+67.450000 -0.995563
+67.480000 -0.997937
+67.510000 -0.999414
+67.540000 -0.999991
+67.570000 -0.999668
+67.600000 -0.998446
+67.630000 -0.996325
+67.660000 -0.993308
+67.690000 -0.989396
+67.720000 -0.984594
+67.750000 -0.978906
+67.780000 -0.972338
+67.810000 -0.964894
+67.840000 -0.956582
+67.870000 -0.947408
+67.900000 -0.937383
+67.930000 -0.926514
+67.960000 -0.914810
+67.990000 -0.902284
+68.020000 -0.888946
+68.050000 -0.874808
+68.080000 -0.859882
+68.110000 -0.844183
+68.140000 -0.827723
+68.170000 -0.810519
+68.200000 -0.792586
+68.230000 -0.773939
+68.260000 -0.754596
+68.290000 -0.734574
+68.320000 -0.713890
+68.350000 -0.692565
+68.380000 -0.670616
+68.410000 -0.648063
+68.440000 -0.624927
+68.470000 -0.601229
+68.500000 -0.576990
+68.530000 -0.552231
+68.560000 -0.526976
+68.590000 -0.501246
+68.620000 -0.475065
+68.650000 -0.448457
+68.680000 -0.421445
+68.710000 -0.394054
+68.740000 -0.366308
+68.770000 -0.338233
+68.800000 -0.309853
+68.830000 -0.281194
+68.860000 -0.252283
+68.890000 -0.223144
+68.920000 -0.193804
+68.950000 -0.164290
+68.980000 -0.134628
+69.010000 -0.104845
+69.040000 -0.074968
+69.070000 -0.045023
+69.100000 -0.015038
+69.130000 0.014961
+69.160000 0.044946
+69.190000 0.074891
+69.220000 0.104769
+69.250000 0.134552
+69.280000 0.164214
+69.310000 0.193729
+69.340000 0.223069
+69.370000 0.252208
+69.400000 0.281121
+69.430000 0.309780
+69.460000 0.338161
+69.490000 0.366237
+69.520000 0.393983
+69.550000 0.421376
+69.580000 0.448388
+69.610000 0.474998
+69.640000 0.501180
+69.670000 0.526911
+69.700000 0.552167
+69.730000 0.576927
+69.760000 0.601168
+69.790000 0.624867
+69.820000 0.648005
+69.850000 0.670559
+69.880000 0.692509
+69.910000 0.713837
+69.940000 0.734522
+69.970000 0.754546
+70.000000 0.773891
+70.030000 0.792539
+70.060000 0.810474
+70.090000 0.827680
+70.120000 0.844141
+70.150000 0.859843
+70.180000 0.874770
+70.210000 0.888911
+70.240000 0.902251
+70.270000 0.914779
+70.300000 0.926485
+70.330000 0.937356
+70.360000 0.947384
+70.390000 0.956559
+70.420000 0.964874
+70.450000 0.972320
+70.480000 0.978891
+70.510000 0.984581
+70.540000 0.989385
+70.570000 0.993299
+70.600000 0.996318
+70.630000 0.998442
+70.660000 0.999666
+70.690000 0.999991
+70.720000 0.999416
+70.750000 0.997942
+70.780000 0.995570
+70.810000 0.992301
+70.840000 0.988140
+70.870000 0.983089
+70.900000 0.977154
+70.930000 0.970339
+70.960000 0.962652
+70.990000 0.954097
+71.020000 0.944684
+71.050000 0.934421
+71.080000 0.923317
+71.110000 0.911383
+71.140000 0.898628
+71.170000 0.885064
+71.200000 0.870704
+71.230000 0.855560
+71.260000 0.839646
+71.290000 0.822977
+71.320000 0.805567
+71.350000 0.787432
+71.380000 0.768588
+71.410000 0.749053
+71.440000 0.728843
+71.470000 0.707978
+71.500000 0.686476
+71.530000 0.664355
+71.560000 0.641637
+71.590000 0.618342
+71.620000 0.594490
+71.650000 0.570103
+71.680000 0.545203
+71.710000 0.519812
+71.740000 0.493954
+71.770000 0.467651
+71.800000 0.440927
+71.830000 0.413806
+71.860000 0.386313
+71.890000 0.358472
+71.920000 0.330309
+71.950000 0.301849
+71.980000 0.273116
+72.010000 0.244138
+72.040000 0.214941
+72.070000 0.185549
+72.100000 0.155991
+72.130000 0.126293
+72.160000 0.096481
+72.190000 0.066582
+72.220000 0.036623
+72.250000 0.006631
+72.280000 -0.023367
+72.310000 -0.053344
+72.340000 -0.083272
+72.370000 -0.113126
+72.400000 -0.142878
+72.430000 -0.172502
+72.460000 -0.201970
+72.490000 -0.231256
+72.520000 -0.260335
+72.550000 -0.289179
+72.580000 -0.317763
+72.610000 -0.346061
+72.640000 -0.374047
+72.670000 -0.401697
+72.700000 -0.428985
+72.730000 -0.455887
+72.760000 -0.482379
+72.790000 -0.508437
+72.820000 -0.534038
+72.850000 -0.559157
+72.880000 -0.583774
+72.910000 -0.607865
+72.940000 -0.631409
+72.970000 -0.654385
+73.000000 -0.676772
+73.030000 -0.698550
+73.060000 -0.719699
+73.090000 -0.740201
+73.120000 -0.760036
+73.150000 -0.779188
+73.180000 -0.797638
+73.210000 -0.815371
+73.240000 -0.832369
+73.270000 -0.848619
+73.300000 -0.864105
+73.330000 -0.878813
+73.360000 -0.892730
+73.390000 -0.905844
+73.420000 -0.918143
+73.450000 -0.929616
+73.480000 -0.940252
+73.510000 -0.950042
+73.540000 -0.958976
+73.570000 -0.967048
+73.600000 -0.974250
+73.630000 -0.980574
+73.660000 -0.986017
+73.690000 -0.990572
+73.720000 -0.994235
+73.750000 -0.997004
+73.780000 -0.998876
+73.810000 -0.999848
+73.840000 -0.999921
+73.870000 -0.999094
+73.900000 -0.997368
+73.930000 -0.994744
+73.960000 -0.991225
+73.990000 -0.986814
+74.020000 -0.981515
+74.050000 -0.975333
+74.080000 -0.968273
+74.110000 -0.960341
+74.140000 -0.951546
+74.170000 -0.941894
+74.200000 -0.931394
+74.230000 -0.920056
+74.260000 -0.907890
+74.290000 -0.894907
+74.320000 -0.881119
+74.350000 -0.866538
+74.380000 -0.851177
+74.410000 -0.835050
+74.440000 -0.818172
+74.470000 -0.800557
+74.500000 -0.782222
+74.530000 -0.763182
+74.560000 -0.743456
+74.590000 -0.723061
+74.620000 -0.702016
+74.650000 -0.680338
+74.680000 -0.658048
+74.710000 -0.635166
+74.740000 -0.611713
+74.770000 -0.587709
+74.800000 -0.563176
+74.830000 -0.538136
+74.860000 -0.512612
+74.890000 -0.486626
+74.920000 -0.460203
+74.950000 -0.433365
+74.980000 -0.406138
+75.010000 -0.378545
+75.040000 -0.350611
+75.070000 -0.322362
+75.100000 -0.293823
+75.130000 -0.265019
+75.160000 -0.235977
+75.190000 -0.206722
+75.220000 -0.177282
+75.250000 -0.147682
+75.280000 -0.117948
+75.310000 -0.088109
+75.340000 -0.058191
+75.370000 -0.028220
+75.400000 0.001776
+75.430000 0.031771
+75.460000 0.061737
+75.490000 0.091648
+75.520000 0.121476
+75.550000 0.151194
+75.580000 0.180777
+75.610000 0.210197
+75.640000 0.239428
+75.670000 0.268443
+75.700000 0.297217
+75.730000 0.325723
+75.760000 0.353936
+75.790000 0.381831
+75.820000 0.409382
+75.850000 0.436564
+75.880000 0.463354
+75.910000 0.489727
+75.940000 0.515659
+75.970000 0.541127
+76.000000 0.566108
+76.030000 0.590579
+76.060000 0.614519
+76.090000 0.637906
+76.120000 0.660719
+76.150000 0.682937
+76.180000 0.704541
+76.210000 0.725511
+76.240000 0.745828
+76.270000 0.765473
+76.300000 0.784430
+76.330000 0.802681
+76.360000 0.820209
+76.390000 0.836999
+76.420000 0.853036
+76.450000 0.868306
+76.480000 0.882794
+76.510000 0.896487
+76.540000 0.909374
+76.570000 0.921442
+76.600000 0.932681
+76.630000 0.943081
+76.660000 0.952632
+76.690000 0.961326
+76.720000 0.969154
+76.750000 0.976111
+76.780000 0.982189
+76.810000 0.987383
+76.840000 0.991688
+76.870000 0.995102
+76.900000 0.997619
+76.930000 0.999239
+76.960000 0.999959
+76.990000 0.999780
+77.020000 0.998701
+77.050000 0.996723
+77.080000 0.993848
+77.110000 0.990079
+77.140000 0.985418
+77.170000 0.979871
+77.200000 0.973443
+77.230000 0.966138
+77.260000 0.957963
+77.290000 0.948927
+77.320000 0.939036
+77.350000 0.928301
+77.380000 0.916730
+77.410000 0.904334
+77.440000 0.891124
+77.470000 0.877112
+77.500000 0.862311
+77.530000 0.846734
+77.560000 0.830395
+77.590000 0.813309
+77.620000 0.795490
+77.650000 0.776956
+77.680000 0.757723
+77.710000 0.737807
+77.740000 0.717228
+77.770000 0.696003
+77.800000 0.674152
+77.830000 0.651694
+77.860000 0.628650
+77.890000 0.605040
+77.920000 0.580886
+77.950000 0.556208
+77.980000 0.531031
+78.010000 0.505375
+78.040000 0.479264
+78.070000 0.452723
+78.100000 0.425773
+78.130000 0.398441
+78.160000 0.370750
+78.190000 0.342725
+78.220000 0.314392
+78.250000 0.285776
+78.280000 0.256903
+78.310000 0.227799
+78.340000 0.198489
+78.370000 0.169001
+78.400000 0.139361
+78.430000 0.109596
+78.460000 0.079732
+78.490000 0.049796
+78.520000 0.019815
+78.550000 -0.010183
+78.580000 -0.040173
+78.610000 -0.070126
+78.640000 -0.100016
+78.670000 -0.129816
+78.700000 -0.159500
+78.730000 -0.189039
+78.760000 -0.218409
+78.790000 -0.247582
+78.820000 -0.276532
+78.850000 -0.305234
+78.880000 -0.333660
+78.910000 -0.361787
+78.940000 -0.389587
+78.970000 -0.417038
+79.000000 -0.444113
+79.030000 -0.470788
+79.060000 -0.497040
+79.090000 -0.522844
+79.120000 -0.548178
+79.150000 -0.573018
+79.180000 -0.597343
+79.210000 -0.621130
+79.240000 -0.644358
+79.270000 -0.667006
+79.300000 -0.689055
+79.330000 -0.710483
+79.360000 -0.731271
+79.390000 -0.751402
+79.420000 -0.770856
+79.450000 -0.789616
+79.480000 -0.807666
+79.510000 -0.824990
+79.540000 -0.841570
+79.570000 -0.857394
+79.600000 -0.872445
+79.630000 -0.886712
+79.660000 -0.900180
+79.690000 -0.912839
+79.720000 -0.924676
+79.750000 -0.935681
+79.780000 -0.945844
+79.810000 -0.955155
+79.840000 -0.963607
+79.870000 -0.971192
+79.900000 -0.977903
+79.930000 -0.983734
+79.960000 -0.988679
+79.990000 -0.992735
+80.020000 -0.995897
+80.050000 -0.998164
+80.080000 -0.999531
+80.110000 -1.000000
+80.140000 -0.999568
+80.170000 -0.998237
+80.200000 -0.996008
+80.230000 -0.992882
+80.260000 -0.988862
+80.290000 -0.983953
+80.320000 -0.978158
+80.350000 -0.971483
+80.380000 -0.963934
+80.410000 -0.955517
+80.440000 -0.946241
+80.470000 -0.936112
+80.500000 -0.925142
+80.530000 -0.913339
+80.560000 -0.900713
+80.590000 -0.887278
+80.620000 -0.873043
+80.650000 -0.858024
+80.680000 -0.842231
+80.710000 -0.825681
+80.740000 -0.808388
+80.770000 -0.790368
+80.800000 -0.771636
+80.830000 -0.752210
+80.860000 -0.732106
+80.890000 -0.711344
+80.920000 -0.689942
+80.950000 -0.667919
+80.980000 -0.645295
+81.010000 -0.622090
+81.040000 -0.598325
+81.070000 -0.574022
+81.100000 -0.549202
+81.130000 -0.523888
+81.160000 -0.498102
+81.190000 -0.471869
+81.220000 -0.445210
+81.250000 -0.418151
+81.280000 -0.390716
+81.310000 -0.362929
+81.340000 -0.334815
+81.370000 -0.306400
+81.400000 -0.277709
+81.430000 -0.248769
+81.460000 -0.219604
+81.490000 -0.190242
+81.520000 -0.160709
+81.550000 -0.131031
+81.580000 -0.101235
+81.610000 -0.071348
+81.640000 -0.041397
+81.670000 -0.011409
+81.700000 0.018590
+81.730000 0.048572
+81.760000 0.078510
+81.790000 0.108378
+81.820000 0.138148
+81.850000 0.167793
+81.880000 0.197288
+81.910000 0.226605
+81.940000 0.255719
+81.970000 0.284602
+82.000000 0.313229
+82.030000 0.341574
+82.060000 0.369612
+82.090000 0.397317
+82.120000 0.424664
+82.150000 0.451630
+82.180000 0.478189
+82.210000 0.504317
+82.240000 0.529992
+82.270000 0.555190
+82.300000 0.579888
+82.330000 0.604064
+82.360000 0.627697
+82.390000 0.650765
+82.420000 0.673247
+82.450000 0.695123
+82.480000 0.716374
+82.510000 0.736980
+82.540000 0.756923
+82.570000 0.776184
+82.600000 0.794747
+82.630000 0.812595
+82.660000 0.829712
+82.690000 0.846082
+82.720000 0.861690
+82.750000 0.876523
+82.780000 0.890567
+82.810000 0.903810
+82.840000 0.916240
+82.870000 0.927844
+82.900000 0.938614
+82.930000 0.948539
+82.960000 0.957611
+82.990000 0.965821
+83.020000 0.973161
+83.050000 0.979626
+83.080000 0.985209
+83.110000 0.989906
+83.140000 0.993712
+83.170000 0.996623
+83.200000 0.998638
+83.230000 0.999753
+83.260000 0.999970
+83.290000 0.999286
+83.320000 0.997703
+83.350000 0.995222
+83.380000 0.991845
+83.410000 0.987576
+83.440000 0.982418
+83.470000 0.976376
+83.500000 0.969456
+83.530000 0.961663
+83.560000 0.953004
+83.590000 0.943488
+83.620000 0.933123
+83.650000 0.921918
+83.680000 0.909883
+83.710000 0.897029
+83.740000 0.883369
+83.770000 0.868913
+83.800000 0.853675
+83.830000 0.837669
+83.860000 0.820909
+83.890000 0.803411
+83.920000 0.785189
+83.950000 0.766261
+83.980000 0.746643
+84.010000 0.726354
+84.040000 0.705410
+84.070000 0.683832
+84.100000 0.661638
+84.130000 0.638849
+84.160000 0.615485
+84.190000 0.591568
+84.220000 0.567117
+84.250000 0.542157
+84.280000 0.516708
+84.310000 0.490795
+84.340000 0.464440
+84.370000 0.437666
+84.400000 0.410499
+84.430000 0.382963
+84.460000 0.355082
+84.490000 0.326881
+84.520000 0.298386
+84.550000 0.269623
+84.580000 0.240617
+84.610000 0.211395
+84.640000 0.181982
+84.670000 0.152405
+84.700000 0.122692
+84.730000 0.092868
+84.760000 0.062960
+84.790000 0.032996
+84.820000 0.003002
+84.850000 -0.026995
+84.880000 -0.056967
+84.910000 -0.086889
+84.940000 -0.116732
+84.970000 -0.146470
+85.000000 -0.176076
+85.030000 -0.205523
+85.060000 -0.234786
+85.090000 -0.263837
+85.120000 -0.292651
+85.150000 -0.321202
+85.180000 -0.349463
+85.210000 -0.377410
+85.240000 -0.405018
+85.270000 -0.432261
+85.300000 -0.459115
+85.330000 -0.485555
+85.360000 -0.511559
+85.390000 -0.537103
+85.420000 -0.562163
+85.450000 -0.586717
+85.480000 -0.610743
+85.510000 -0.634219
+85.540000 -0.657125
+85.570000 -0.679439
+85.600000 -0.701142
+85.630000 -0.722214
+85.660000 -0.742636
+85.690000 -0.762390
+85.720000 -0.781458
+85.750000 -0.799822
+85.780000 -0.817466
+85.810000 -0.834375
+85.840000 -0.850533
+85.870000 -0.865926
+85.900000 -0.880539
+85.930000 -0.894360
+85.960000 -0.907376
+85.990000 -0.919575
+86.020000 -0.930947
+86.050000 -0.941481
+86.080000 -0.951168
+86.110000 -0.959999
+86.140000 -0.967966
+86.170000 -0.975062
+86.200000 -0.981280
+86.230000 -0.986615
+86.260000 -0.991062
+86.290000 -0.994618
+86.320000 -0.997278
+86.350000 -0.999041
+86.380000 -0.999905
+86.410000 -0.999869
+86.440000 -0.998933
+86.470000 -0.997098
+86.500000 -0.994366
+86.530000 -0.990739
+86.560000 -0.986220
+86.590000 -0.980814
+86.620000 -0.974525
+86.650000 -0.967359
+86.680000 -0.959323
+86.710000 -0.950423
+86.740000 -0.940668
+86.770000 -0.930067
+86.800000 -0.918628
+86.830000 -0.906363
+86.860000 -0.893282
+86.890000 -0.879397
+86.920000 -0.864721
+86.950000 -0.849266
+86.980000 -0.833048
+87.010000 -0.816079
+87.040000 -0.798377
+87.070000 -0.779955
+87.100000 -0.760832
+87.130000 -0.741024
+87.160000 -0.720549
+87.190000 -0.699426
+87.220000 -0.677674
+87.250000 -0.655311
+87.280000 -0.632359
+87.310000 -0.608837
+87.340000 -0.584768
+87.370000 -0.560173
+87.400000 -0.535073
+87.430000 -0.509492
+87.460000 -0.483452
+87.490000 -0.456978
+87.520000 -0.430092
+87.550000 -0.402819
+87.580000 -0.375183
+87.610000 -0.347210
+87.640000 -0.318924
+87.670000 -0.290352
+87.700000 -0.261518
+87.730000 -0.232448
+87.760000 -0.203170
+87.790000 -0.173709
+87.820000 -0.144091
+87.850000 -0.114344
+87.880000 -0.084493
+87.910000 -0.054567
+87.940000 -0.024592
+87.970000 0.005406
+88.000000 0.035398
+88.030000 0.065359
+88.060000 0.095261
+88.090000 0.125077
+88.120000 0.154781
+88.150000 0.184345
+88.180000 0.213744
+88.210000 0.242950
+88.240000 0.271937
+88.270000 0.300680
+88.300000 0.329152
+88.330000 0.357328
+88.360000 0.385183
+88.390000 0.412690
+88.420000 0.439827
+88.450000 0.466567
+88.480000 0.492888
+88.510000 0.518765
+88.540000 0.544175
+88.570000 0.569096
+88.600000 0.593504
+88.630000 0.617378
+88.660000 0.640697
+88.690000 0.663439
+88.720000 0.685584
+88.750000 0.707112
+88.780000 0.728004
+88.810000 0.748240
+88.840000 0.767803
+88.870000 0.786676
+88.900000 0.804840
+88.930000 0.822280
+88.960000 0.838980
+88.990000 0.854925
+89.020000 0.870100
+89.050000 0.884493
+89.080000 0.898089
+89.110000 0.910878
+89.140000 0.922846
+89.170000 0.933984
+89.200000 0.944282
+89.230000 0.953730
+89.260000 0.962319
+89.290000 0.970043
+89.320000 0.976893
+89.350000 0.982864
+89.380000 0.987951
+89.410000 0.992149
+89.440000 0.995454
+89.470000 0.997863
+89.500000 0.999374
+89.530000 0.999985
+89.560000 0.999697
+89.590000 0.998509
+89.620000 0.996423
+89.650000 0.993440
+89.680000 0.989562
+89.710000 0.984794
+89.740000 0.979140
+89.770000 0.972605
+89.800000 0.965195
+89.830000 0.956916
+89.860000 0.947775
+89.890000 0.937782
+89.920000 0.926945
+89.950000 0.915274
+89.980000 0.902779
+90.010000 0.889471
+90.040000 0.875363
+90.070000 0.860468
+90.100000 0.844798
+90.130000 0.828367
+90.160000 0.811192
+90.190000 0.793286
+90.220000 0.774666
+90.250000 0.755349
+90.280000 0.735353
+90.310000 0.714694
+90.340000 0.693393
+90.370000 0.671467
+90.400000 0.648937
+90.430000 0.625824
+90.460000 0.602147
+90.490000 0.577928
+90.520000 0.553189
+90.550000 0.527952
+90.580000 0.502240
+90.610000 0.476076
+90.640000 0.449483
+90.670000 0.422487
+90.700000 0.395109
+90.730000 0.367377
+90.760000 0.339313
+90.790000 0.310945
+90.820000 0.282296
+90.850000 0.253394
+90.880000 0.224263
+90.910000 0.194931
+90.940000 0.165423
+90.970000 0.135766
+91.000000 0.105988
+91.030000 0.076113
+91.060000 0.046171
+91.090000 0.016186
+91.120000 -0.013813
+91.150000 -0.043799
+91.180000 -0.073746
+91.210000 -0.103627
+91.240000 -0.133414
+91.270000 -0.163081
+91.300000 -0.192602
+91.330000 -0.221949
+91.360000 -0.251097
+91.390000 -0.280018
+91.420000 -0.308688
+91.450000 -0.337079
+91.480000 -0.365168
+91.510000 -0.392928
+91.540000 -0.420334
+91.570000 -0.447362
+91.600000 -0.473987
+91.630000 -0.500186
+91.660000 -0.525934
+91.690000 -0.551209
+91.720000 -0.575989
+91.750000 -0.600250
+91.780000 -0.623970
+91.810000 -0.647129
+91.840000 -0.669706
+91.870000 -0.691680
+91.900000 -0.713032
+91.930000 -0.733742
+91.960000 -0.753791
+91.990000 -0.773163
+92.020000 -0.791838
+92.050000 -0.809801
+92.080000 -0.827035
+92.110000 -0.843525
+92.140000 -0.859256
+92.170000 -0.874213
+92.200000 -0.888384
+92.230000 -0.901755
+92.260000 -0.914315
+92.290000 -0.926052
+92.320000 -0.936955
+92.350000 -0.947016
+92.380000 -0.956224
+92.410000 -0.964571
+92.440000 -0.972051
+92.470000 -0.978655
+92.500000 -0.984379
+92.530000 -0.989217
+92.560000 -0.993165
+92.590000 -0.996219
+92.620000 -0.998377
+92.650000 -0.999636
+92.680000 -0.999995
+92.710000 -0.999455
+92.740000 -0.998015
+92.770000 -0.995677
+92.800000 -0.992443
+92.830000 -0.988316
+92.860000 -0.983299
+92.890000 -0.977398
+92.920000 -0.970616
+92.950000 -0.962962
+92.980000 -0.954441
+93.010000 -0.945060
+93.040000 -0.934830
+93.070000 -0.923758
+93.100000 -0.911855
+93.130000 -0.899131
+93.160000 -0.885598
+93.190000 -0.871268
+93.220000 -0.856154
+93.250000 -0.840269
+93.280000 -0.823628
+93.310000 -0.806247
+93.340000 -0.788139
+93.370000 -0.769322
+93.400000 -0.749813
+93.430000 -0.729629
+93.460000 -0.708789
+93.490000 -0.687310
+93.520000 -0.665213
+93.550000 -0.642518
+93.580000 -0.619244
+93.610000 -0.595413
+93.640000 -0.571046
+93.670000 -0.546165
+93.700000 -0.520793
+93.730000 -0.494952
+93.760000 -0.468666
+93.790000 -0.441957
+93.820000 -0.414852
+93.850000 -0.387372
+93.880000 -0.359544
+93.910000 -0.331393
+93.940000 -0.302943
+93.970000 -0.274221
+94.000000 -0.245252
+94.030000 -0.216062
+94.060000 -0.186678
+94.090000 -0.157126
+94.120000 -0.127432
+94.150000 -0.097624
+94.180000 -0.067728
+94.210000 -0.037771
+94.240000 -0.007780
+94.270000 0.022219
+94.300000 0.052197
+94.330000 0.082128
+94.360000 0.111985
+94.390000 0.141741
+94.420000 0.171370
+94.450000 0.200845
+94.480000 0.230139
+94.510000 0.259226
+94.540000 0.288079
+94.570000 0.316673
+94.600000 0.344983
+94.630000 0.372982
+94.660000 0.400645
+94.690000 0.427947
+94.720000 0.454865
+94.750000 0.481373
+94.780000 0.507448
+94.810000 0.533066
+94.840000 0.558205
+94.870000 0.582841
+94.900000 0.606953
+94.930000 0.630518
+94.960000 0.653516
+94.990000 0.675926
+95.020000 0.697728
+95.050000 0.718901
+95.080000 0.739428
+95.110000 0.759289
+95.140000 0.778467
+95.170000 0.796945
+95.200000 0.814705
+95.230000 0.831732
+95.260000 0.848011
+95.290000 0.863526
+95.320000 0.878264
+95.350000 0.892212
+95.380000 0.905357
+95.410000 0.917688
+95.440000 0.929192
+95.470000 0.939860
+95.500000 0.949682
+95.530000 0.958650
+95.560000 0.966755
+95.590000 0.973990
+95.620000 0.980349
+95.650000 0.985825
+95.680000 0.990414
+95.710000 0.994111
+95.740000 0.996914
+95.770000 0.998820
+95.800000 0.999827
+95.830000 0.999935
+95.860000 0.999142
+95.890000 0.997450
+95.920000 0.994861
+95.950000 0.991376
+95.980000 0.986999
+96.010000 0.981734
+96.040000 0.975586
+96.070000 0.968559
+96.100000 0.960661
+96.130000 0.951898
+96.160000 0.942279
+96.190000 0.931811
+96.220000 0.920506
+96.250000 0.908371
+96.280000 0.895419
+96.310000 0.881662
+96.340000 0.867111
+96.370000 0.851779
+96.400000 0.835681
+96.430000 0.818831
+96.460000 0.801244
+96.490000 0.782937
+96.520000 0.763924
+96.550000 0.744224
+96.580000 0.723854
+96.610000 0.702833
+96.640000 0.681179
+96.670000 0.658913
+96.700000 0.636053
+96.730000 0.612621
+96.760000 0.588637
+96.790000 0.564124
+96.820000 0.539103
+96.850000 0.513597
+96.880000 0.487629
+96.910000 0.461222
+96.940000 0.434400
+96.970000 0.407187
+97.000000 0.379608
+97.030000 0.351687
+97.060000 0.323449
+97.090000 0.294920
+97.120000 0.266126
+97.150000 0.237093
+97.180000 0.207846
+97.210000 0.178412
+97.240000 0.148817
+97.270000 0.119089
+97.300000 0.089253
+97.330000 0.059337
+97.360000 0.029368
+97.390000 -0.000628
+97.420000 -0.030623
+97.450000 -0.060591
+97.480000 -0.090504
+97.510000 -0.120335
+97.540000 -0.150059
+97.570000 -0.179647
+97.600000 -0.209074
+97.630000 -0.238312
+97.660000 -0.267336
+97.690000 -0.296120
+97.720000 -0.324637
+97.750000 -0.352862
+97.780000 -0.380769
+97.810000 -0.408334
+97.840000 -0.435531
+97.870000 -0.462336
+97.900000 -0.488725
+97.930000 -0.514674
+97.960000 -0.540160
+97.990000 -0.565160
+98.020000 -0.589652
+98.050000 -0.613613
+98.080000 -0.637021
+98.110000 -0.659856
+98.140000 -0.682098
+98.170000 -0.703726
+98.200000 -0.724720
+98.230000 -0.745062
+98.260000 -0.764734
+98.290000 -0.783717
+98.320000 -0.801995
+98.350000 -0.819551
+98.380000 -0.836370
+98.410000 -0.852436
+98.440000 -0.867735
+98.470000 -0.882254
+98.500000 -0.895978
+98.530000 -0.908895
+98.560000 -0.920995
+98.590000 -0.932266
+98.620000 -0.942698
+98.650000 -0.952282
+98.680000 -0.961009
+98.710000 -0.968871
+98.740000 -0.975861
+98.770000 -0.981972
+98.800000 -0.987200
+98.830000 -0.991540
+98.860000 -0.994987
+98.890000 -0.997539
+98.920000 -0.999193
+98.950000 -0.999948
+98.980000 -0.999803
+99.010000 -0.998759
+99.040000 -0.996815
+99.070000 -0.993975
+99.100000 -0.990240
+99.130000 -0.985613
+99.160000 -0.980100
+99.190000 -0.973705
+99.220000 -0.966433
+99.250000 -0.958292
+99.280000 -0.949288
+99.310000 -0.939431
+99.340000 -0.928727
+99.370000 -0.917188
+99.400000 -0.904823
+99.430000 -0.891645
+99.460000 -0.877663
+99.490000 -0.862892
+99.520000 -0.847345
+99.550000 -0.831034
+99.580000 -0.813976
+99.610000 -0.796186
+99.640000 -0.777679
+99.670000 -0.758472
+99.700000 -0.738582
+99.730000 -0.718028
+99.760000 -0.696828
+99.790000 -0.675000
+99.820000 -0.652565
+99.850000 -0.629543
+99.880000 -0.605954
+99.910000 -0.581820
+99.940000 -0.557163
+99.970000 -0.532003
Index: /trunk/Jgraph/sin3.jgr
===================================================================
--- /trunk/Jgraph/sin3.jgr	(revision 418)
+++ /trunk/Jgraph/sin3.jgr	(revision 418)
@@ -0,0 +1,25 @@
+(* This is the same as sin.jgr only a different include file of points is
+used:  This one orders the points by ascending y value instead of ascending
+x value.  The graph looks quite different *)
+
+newgraph 
+
+yaxis min -1 max 1 label : sin(i)
+xaxis min -10 max 10 label : i
+
+(* Plot the sin curve *)
+curve 1 
+  marktype none
+  linetype solid
+  pts include sin3.pts
+   (* sin.pts was created by the following c program:
+
+     #include <math.h>
+     main();
+     {
+       double x;
+       for (x = -10.0; x < 10.0; x += .03)
+         printf("%f %f\n", x, sin(x));
+     }
+     
+   * and then the output was piped through sort -n +1 *)
Index: /trunk/Jgraph/sin3.pts
===================================================================
--- /trunk/Jgraph/sin3.pts	(revision 418)
+++ /trunk/Jgraph/sin3.pts	(revision 418)
@@ -0,0 +1,667 @@
+-1.570000 -1.000000
+4.700000 -0.999923
+-7.840000 -0.999902
+-7.870000 -0.999872
+4.730000 -0.999845
+-1.600000 -0.999574
+-1.540000 -0.999526
+4.670000 -0.999102
+-7.810000 -0.999033
+-7.900000 -0.998941
+4.760000 -0.998867
+-1.630000 -0.998248
+-1.510000 -0.998152
+4.640000 -0.997381
+-7.780000 -0.997265
+-7.930000 -0.997112
+4.790000 -0.996990
+-1.660000 -0.996024
+-1.480000 -0.995881
+4.610000 -0.994763
+-7.750000 -0.994599
+-7.960000 -0.994385
+4.820000 -0.994216
+-1.690000 -0.992904
+-1.450000 -0.992713
+4.580000 -0.991249
+-7.720000 -0.991038
+-7.990000 -0.990764
+4.850000 -0.990547
+-1.720000 -0.988890
+-1.420000 -0.988652
+4.550000 -0.986844
+-7.690000 -0.986585
+-8.020000 -0.986251
+4.880000 -0.985986
+-1.750000 -0.983986
+-1.390000 -0.983701
+4.520000 -0.981550
+-7.660000 -0.981244
+-8.050000 -0.980850
+4.910000 -0.980538
+-1.780000 -0.978197
+-1.360000 -0.977865
+4.490000 -0.975373
+-7.630000 -0.975021
+-8.080000 -0.974566
+4.940000 -0.974208
+-1.810000 -0.971527
+-1.330000 -0.971148
+4.460000 -0.968319
+-7.600000 -0.967920
+-8.110000 -0.967406
+4.970000 -0.967001
+-1.840000 -0.963983
+-1.300000 -0.963558
+4.430000 -0.960392
+-7.570000 -0.959947
+-8.140000 -0.959375
+5.000000 -0.958924
+-1.870000 -0.955572
+-1.270000 -0.955101
+4.400000 -0.951602
+-7.540000 -0.951111
+-8.170000 -0.950480
+5.030000 -0.949984
+-1.900000 -0.946300
+-1.240000 -0.945784
+4.370000 -0.941955
+-7.510000 -0.941419
+-8.200000 -0.940731
+5.060000 -0.940189
+-1.930000 -0.936177
+-1.210000 -0.935616
+4.340000 -0.931461
+-7.480000 -0.930880
+-8.230000 -0.930134
+5.090000 -0.929548
+-1.960000 -0.925212
+-1.180000 -0.924606
+4.310000 -0.920128
+-7.450000 -0.919503
+-8.260000 -0.918701
+5.120000 -0.918070
+-1.990000 -0.913413
+-1.150000 -0.912764
+4.280000 -0.907967
+-7.420000 -0.907299
+-8.290000 -0.906440
+5.150000 -0.905767
+-2.020000 -0.900793
+-1.120000 -0.900100
+4.250000 -0.894989
+-7.390000 -0.894278
+-8.320000 -0.893364
+5.180000 -0.892648
+-2.050000 -0.887362
+-1.090000 -0.886627
+4.220000 -0.881206
+-7.360000 -0.880452
+-8.350000 -0.879484
+5.210000 -0.878725
+-2.080000 -0.873133
+-1.060000 -0.872355
+4.190000 -0.866630
+-7.330000 -0.865834
+-8.380000 -0.864813
+5.240000 -0.864012
+-2.110000 -0.858118
+-1.030000 -0.857299
+4.160000 -0.851273
+-7.300000 -0.850437
+-8.410000 -0.849363
+5.270000 -0.848522
+-2.140000 -0.842330
+-1.000000 -0.841471
+4.130000 -0.835151
+-7.270000 -0.834274
+-8.440000 -0.833149
+5.300000 -0.832267
+-2.170000 -0.825785
+-0.970000 -0.824886
+4.100000 -0.818277
+-7.240000 -0.817361
+-8.470000 -0.816185
+5.330000 -0.815264
+-2.200000 -0.808496
+-0.940000 -0.807558
+4.070000 -0.800667
+-7.210000 -0.799712
+-8.500000 -0.798487
+5.360000 -0.797527
+-2.230000 -0.790480
+-0.910000 -0.789504
+4.040000 -0.782336
+-7.180000 -0.781343
+-8.530000 -0.780070
+5.390000 -0.779073
+-2.260000 -0.771753
+-0.880000 -0.770739
+4.010000 -0.763301
+-7.150000 -0.762271
+-8.560000 -0.760951
+5.420000 -0.759917
+-2.290000 -0.752331
+-0.850000 -0.751280
+3.980000 -0.743579
+-7.120000 -0.742513
+-8.590000 -0.741147
+5.450000 -0.740077
+-2.320000 -0.732231
+-0.820000 -0.731146
+3.950000 -0.723188
+-7.090000 -0.722087
+-8.620000 -0.720677
+5.480000 -0.719572
+-2.350000 -0.711473
+-0.790000 -0.710353
+3.920000 -0.702146
+-7.060000 -0.701011
+-8.650000 -0.699557
+5.510000 -0.698418
+-2.380000 -0.690075
+-0.760000 -0.688921
+3.890000 -0.680473
+-7.030000 -0.679305
+-8.680000 -0.677809
+5.540000 -0.676637
+-2.410000 -0.668056
+-0.730000 -0.666870
+3.860000 -0.658186
+-7.000000 -0.656987
+-8.710000 -0.655450
+5.570000 -0.654246
+-2.440000 -0.645435
+-0.700000 -0.644218
+3.830000 -0.635308
+-6.970000 -0.634077
+-8.740000 -0.632501
+5.600000 -0.631267
+-2.470000 -0.622234
+-0.670000 -0.620986
+3.800000 -0.611858
+-6.940000 -0.610597
+-8.770000 -0.608983
+5.630000 -0.607719
+-2.500000 -0.598472
+-0.640000 -0.597195
+3.770000 -0.587857
+-6.910000 -0.586568
+-8.800000 -0.584917
+5.660000 -0.583625
+-2.530000 -0.574172
+-0.610000 -0.572867
+3.740000 -0.563327
+-6.880000 -0.562011
+-8.830000 -0.560325
+5.690000 -0.559005
+-2.560000 -0.549355
+-0.580000 -0.548024
+3.710000 -0.538291
+-6.850000 -0.536948
+-8.860000 -0.535228
+5.720000 -0.533882
+9.980000 -0.527132
+-2.590000 -0.524044
+-0.550000 -0.522687
+3.680000 -0.512769
+-6.820000 -0.511401
+-8.890000 -0.509650
+5.750000 -0.508279
+9.950000 -0.501405
+-2.620000 -0.498262
+-0.520000 -0.496880
+3.650000 -0.486787
+-6.790000 -0.485395
+-8.920000 -0.483613
+5.780000 -0.482218
+9.920000 -0.475227
+-2.650000 -0.472031
+-0.490000 -0.470626
+3.620000 -0.460366
+-6.760000 -0.458951
+-8.950000 -0.457141
+5.810000 -0.455724
+9.890000 -0.448621
+-2.680000 -0.445375
+-0.460000 -0.443948
+3.590000 -0.433531
+-6.730000 -0.432095
+-8.980000 -0.430257
+5.840000 -0.428819
+9.860000 -0.421612
+-2.710000 -0.418318
+-0.430000 -0.416871
+3.560000 -0.406306
+-6.700000 -0.404850
+-9.010000 -0.402987
+5.870000 -0.401529
+9.830000 -0.394223
+-2.740000 -0.390885
+-0.400000 -0.389418
+3.530000 -0.378715
+-6.670000 -0.377240
+-9.040000 -0.375353
+5.900000 -0.373877
+9.800000 -0.366479
+-2.770000 -0.363100
+-0.370000 -0.361615
+3.500000 -0.350783
+-6.640000 -0.349291
+-9.070000 -0.347382
+5.930000 -0.345888
+9.770000 -0.338406
+-2.800000 -0.334988
+-0.340000 -0.333487
+3.470000 -0.322536
+-6.610000 -0.321028
+-9.100000 -0.319098
+5.960000 -0.317589
+9.740000 -0.310028
+-2.830000 -0.306575
+-0.310000 -0.305059
+3.440000 -0.293998
+-6.580000 -0.292476
+-9.130000 -0.290527
+5.990000 -0.289003
+9.710000 -0.281371
+-2.860000 -0.277886
+-0.280000 -0.276356
+3.410000 -0.265196
+-6.550000 -0.263660
+-9.160000 -0.261695
+6.020000 -0.260157
+9.680000 -0.252460
+-2.890000 -0.248947
+-0.250000 -0.247404
+3.380000 -0.236155
+-6.520000 -0.234607
+-9.190000 -0.232627
+6.050000 -0.231078
+9.650000 -0.223323
+-2.920000 -0.219784
+-0.220000 -0.218230
+3.350000 -0.206902
+-6.490000 -0.205344
+-9.220000 -0.203350
+6.080000 -0.201790
+9.620000 -0.193984
+-2.950000 -0.190423
+-0.190000 -0.188859
+3.320000 -0.177462
+-6.460000 -0.175895
+-9.250000 -0.173889
+6.110000 -0.172321
+9.590000 -0.164471
+-2.980000 -0.160890
+-0.160000 -0.159318
+3.290000 -0.147863
+-6.430000 -0.146288
+-9.280000 -0.144273
+6.140000 -0.142697
+9.560000 -0.134810
+-3.010000 -0.131213
+-0.130000 -0.129634
+3.260000 -0.118131
+-6.400000 -0.116549
+-9.310000 -0.114526
+6.170000 -0.112944
+9.530000 -0.105028
+-3.040000 -0.101418
+-0.100000 -0.099833
+3.230000 -0.088292
+-6.370000 -0.086706
+-9.340000 -0.084676
+6.200000 -0.083089
+9.500000 -0.075151
+-3.070000 -0.071532
+-0.070000 -0.069943
+3.200000 -0.058374
+-6.340000 -0.056784
+-9.370000 -0.054751
+6.230000 -0.053160
+9.470000 -0.045207
+-3.100000 -0.041581
+-0.040000 -0.039989
+3.170000 -0.028404
+-6.310000 -0.026811
+-9.400000 -0.024775
+6.260000 -0.023183
+9.440000 -0.015221
+-3.130000 -0.011592
+-0.010000 -0.010000
+3.140000 0.001593
+-6.280000 0.003185
+-9.430000 0.005222
+6.290000 0.006815
+9.410000 0.014777
+-3.160000 0.018406
+0.020000 0.019999
+3.110000 0.031587
+-6.250000 0.033179
+-9.460000 0.035215
+6.320000 0.036806
+9.380000 0.044763
+-3.190000 0.048388
+0.050000 0.049979
+3.080000 0.061554
+-6.220000 0.063143
+-9.490000 0.065176
+6.350000 0.066765
+9.350000 0.074708
+-3.220000 0.078327
+0.080000 0.079915
+3.050000 0.091465
+-6.190000 0.093051
+-9.520000 0.095078
+6.380000 0.096664
+9.320000 0.104586
+-3.250000 0.108195
+0.110000 0.109778
+3.020000 0.121293
+-6.160000 0.122874
+-9.550000 0.124895
+6.410000 0.126475
+9.290000 0.134370
+-3.280000 0.137966
+0.140000 0.139543
+2.990000 0.151013
+-6.130000 0.152587
+-9.580000 0.154599
+6.440000 0.156173
+9.260000 0.164033
+-3.310000 0.167612
+0.170000 0.169182
+2.960000 0.180596
+-6.100000 0.182163
+-9.610000 0.184165
+6.470000 0.185730
+9.230000 0.193549
+-3.340000 0.197108
+0.200000 0.198669
+2.930000 0.210017
+-6.070000 0.211574
+-9.640000 0.213564
+6.500000 0.215120
+9.200000 0.222890
+-3.370000 0.226427
+0.230000 0.227978
+2.900000 0.239249
+-6.040000 0.240795
+-9.670000 0.242772
+6.530000 0.244316
+9.170000 0.252031
+-3.400000 0.255541
+0.260000 0.257081
+2.870000 0.268266
+-6.010000 0.269800
+-9.700000 0.271761
+6.560000 0.273293
+9.140000 0.280944
+-3.430000 0.284426
+0.290000 0.285952
+2.840000 0.297041
+-5.980000 0.298562
+-9.730000 0.300505
+6.590000 0.302024
+9.110000 0.309605
+-3.460000 0.313054
+0.320000 0.314567
+2.810000 0.325549
+-5.950000 0.327055
+-9.760000 0.328979
+6.620000 0.330482
+9.080000 0.337988
+-3.490000 0.341401
+0.350000 0.342898
+2.780000 0.353764
+-5.920000 0.355254
+-9.790000 0.357157
+6.650000 0.358644
+9.050000 0.366066
+-3.520000 0.369441
+0.380000 0.370920
+2.750000 0.381661
+-5.890000 0.383133
+-9.820000 0.385013
+6.680000 0.386483
+9.020000 0.393815
+-3.550000 0.397148
+0.410000 0.398609
+2.720000 0.409214
+-5.860000 0.410667
+-9.850000 0.412523
+6.710000 0.413973
+8.990000 0.421209
+-3.580000 0.424498
+0.440000 0.425939
+2.690000 0.436399
+-5.830000 0.437832
+-9.880000 0.439662
+6.740000 0.441092
+8.960000 0.448224
+-3.610000 0.451466
+0.470000 0.452886
+2.660000 0.463191
+-5.800000 0.464602
+-9.910000 0.466405
+6.770000 0.467813
+8.930000 0.474836
+-3.640000 0.478027
+0.500000 0.479426
+2.630000 0.489567
+-5.770000 0.490955
+-9.940000 0.492728
+6.800000 0.494113
+8.900000 0.501021
+-3.670000 0.504159
+0.530000 0.505533
+2.600000 0.515501
+-5.740000 0.516865
+-9.970000 0.518608
+6.830000 0.519969
+8.870000 0.526755
+-3.700000 0.529836
+0.560000 0.531186
+2.570000 0.540972
+-5.710000 0.542311
+-10.000000 0.544021
+6.860000 0.545357
+8.840000 0.552014
+-3.730000 0.555037
+0.590000 0.556361
+2.540000 0.565956
+-5.680000 0.567269
+6.890000 0.570254
+8.810000 0.576777
+-3.760000 0.579738
+0.620000 0.581035
+2.510000 0.590431
+-5.650000 0.591716
+6.920000 0.594637
+8.780000 0.601021
+-3.790000 0.603918
+0.650000 0.605186
+2.480000 0.614374
+-5.620000 0.615630
+6.950000 0.618486
+8.750000 0.624724
+-3.820000 0.627554
+0.680000 0.628793
+2.450000 0.637765
+-5.590000 0.638991
+6.980000 0.641778
+8.720000 0.647865
+-3.850000 0.650625
+0.710000 0.651834
+2.420000 0.660581
+-5.560000 0.661776
+7.010000 0.664493
+8.690000 0.670422
+-3.880000 0.673111
+0.740000 0.674288
+2.390000 0.682803
+-5.530000 0.683966
+7.040000 0.686609
+8.660000 0.692377
+-3.910000 0.694991
+0.770000 0.696135
+2.360000 0.704411
+-5.500000 0.705540
+7.070000 0.708108
+8.630000 0.713708
+-3.940000 0.716246
+0.800000 0.717356
+2.330000 0.725384
+-5.470000 0.726480
+7.100000 0.728969
+8.600000 0.734397
+-3.970000 0.736856
+0.830000 0.737931
+2.300000 0.745705
+-5.440000 0.746765
+7.130000 0.749174
+8.570000 0.754425
+-4.000000 0.756802
+0.860000 0.757843
+2.270000 0.765355
+-5.410000 0.766379
+7.160000 0.768705
+8.540000 0.773774
+-4.030000 0.776068
+0.890000 0.777072
+2.240000 0.784316
+-5.380000 0.785303
+7.190000 0.787545
+8.510000 0.792427
+-4.060000 0.794636
+0.920000 0.795602
+2.210000 0.802571
+-5.350000 0.803520
+7.220000 0.805675
+8.480000 0.810367
+-4.090000 0.812488
+0.950000 0.813416
+2.180000 0.820104
+-5.320000 0.821014
+7.250000 0.823081
+8.450000 0.827577
+-4.120000 0.829609
+0.980000 0.830497
+2.150000 0.836899
+-5.290000 0.837769
+7.280000 0.839746
+8.420000 0.844043
+-4.150000 0.845984
+1.010000 0.846832
+2.120000 0.852940
+-5.260000 0.853771
+7.310000 0.855655
+8.390000 0.859749
+-4.180000 0.861597
+1.040000 0.862404
+2.090000 0.868215
+-5.230000 0.869004
+7.340000 0.870794
+8.360000 0.874681
+-4.210000 0.876435
+1.070000 0.877201
+2.060000 0.882707
+-5.200000 0.883455
+7.370000 0.885149
+8.330000 0.888827
+-4.240000 0.890484
+1.100000 0.891207
+2.030000 0.896406
+-5.170000 0.897111
+7.400000 0.898708
+8.300000 0.902172
+-4.270000 0.903732
+1.130000 0.904412
+2.000000 0.909297
+-5.140000 0.909959
+7.430000 0.911458
+8.270000 0.914705
+-4.300000 0.916166
+1.160000 0.916803
+1.970000 0.921371
+-5.110000 0.921989
+7.460000 0.923388
+8.240000 0.926415
+-4.330000 0.927776
+1.190000 0.928369
+1.940000 0.932615
+-5.080000 0.933189
+7.490000 0.934487
+8.210000 0.937292
+-4.360000 0.938551
+1.220000 0.939099
+1.910000 0.943020
+-5.050000 0.943549
+7.520000 0.944745
+8.180000 0.947325
+-4.390000 0.948481
+1.250000 0.948985
+1.880000 0.952576
+-5.020000 0.953060
+7.550000 0.954152
+8.150000 0.956506
+-4.420000 0.957558
+1.280000 0.958016
+1.850000 0.961275
+-4.990000 0.961713
+7.580000 0.962701
+8.120000 0.964825
+-4.450000 0.965773
+1.310000 0.966185
+1.820000 0.969109
+-4.960000 0.969501
+7.610000 0.970384
+8.090000 0.972277
+-4.480000 0.973119
+1.340000 0.973485
+1.790000 0.976071
+-4.930000 0.976416
+7.640000 0.977193
+8.060000 0.978853
+-4.510000 0.979589
+1.370000 0.979908
+1.760000 0.982154
+-4.900000 0.982453
+7.670000 0.983123
+8.030000 0.984549
+-4.540000 0.985178
+1.400000 0.985450
+1.730000 0.987354
+-4.870000 0.987605
+7.700000 0.988168
+8.000000 0.989358
+-4.570000 0.989880
+1.430000 0.990105
+1.700000 0.991665
+-4.840000 0.991869
+7.730000 0.992324
+7.970000 0.993277
+-4.600000 0.993691
+1.460000 0.993868
+1.670000 0.995083
+-4.810000 0.995240
+7.760000 0.995587
+7.940000 0.996303
+-4.630000 0.996608
+1.490000 0.996738
+1.640000 0.997606
+-4.780000 0.997715
+7.790000 0.997954
+7.910000 0.998431
+-4.660000 0.998628
+1.520000 0.998710
+1.610000 0.999232
+-4.750000 0.999293
+7.820000 0.999423
+7.880000 0.999662
+-4.690000 0.999749
+1.550000 0.999784
+1.580000 0.999958
+-4.720000 0.999971
+7.850000 0.999992
Index: /trunk/Jgraph/token.c
===================================================================
--- /trunk/Jgraph/token.c	(revision 418)
+++ /trunk/Jgraph/token.c	(revision 418)
@@ -0,0 +1,421 @@
+/* 
+ * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/token.c,v $
+ * $Revision: 8.3 $
+ * $Date: 92/11/30 11:42:42 $
+ * $Author: jsp $
+ */
+
+#include <math.h>
+#include <stdio.h>
+
+#ifdef LCC 
+#include <stdlib.h>
+#endif
+
+#ifdef VMS 
+#include <stdlib.h>
+#include <redexp.VMS>
+#endif
+
+#include "list.h"
+
+#define CNULL ((char *)0)
+
+typedef struct iostack {
+  struct iostack *flink;
+  struct iostack *blink;
+  char *filename;
+  FILE *stream;
+  int oldcharvalid;
+  char oldchar;
+  char pipe;
+  int line;
+} *Iostack;
+
+static char INPUT[1000];
+static int getnew = 1;
+static char oldchar = '\0';
+static oldcharvalid = 0;
+static char pipe = 0;
+static int eof = 0;
+static int init = 0;
+static Iostack stack;
+static char real_eof = EOF;
+
+static FILE *IOSTREAM;
+static char FILENAME[300];
+static int line = 1;
+
+#ifdef VMS
+/* On VMS, there are no popen() and pclose(), so we provide dummies here. */
+FILE *popen(command, type)
+char *command, *type;
+{
+    return(NULL);
+}
+int pclose(stream)
+FILE *stream;
+{
+    return(-1);
+}
+#endif /*VMS*/
+
+set_input_file(s)
+char *s;
+{
+  FILE *f;
+  Iostack n;
+
+  if (init == 0) {
+    stack = (Iostack) make_list(sizeof(struct iostack));
+    if (s == CNULL) {
+      IOSTREAM = stdin;
+      strcpy(FILENAME, "<stdin>");
+    } else {
+      IOSTREAM = fopen(s, "r");
+      if (IOSTREAM == NULL) {
+        fprintf(stderr, "Error: cannot open file \"%s\"\n", s);
+        exit(1);
+      }
+      strcpy(FILENAME, s);
+    }
+    init = 1;
+  } else {
+    n = (Iostack) get_node(stack);
+    n->stream = NULL;
+    n->filename = (char *) malloc (sizeof(char)*(strlen(s)+2));
+    strcpy(n->filename, s);
+    n->oldchar = oldchar;
+    n->oldcharvalid = oldcharvalid;
+    n->pipe = pipe;
+    n->line = line;
+    insert(n, stack->flink);
+  }
+}
+
+error_header()
+{
+  fprintf(stderr, "%s,%d: ", FILENAME, line);
+}
+  
+int gettokenchar()
+{
+  if (oldcharvalid == 0) oldchar = getc(IOSTREAM);
+  oldcharvalid = 0;
+  if (oldchar == '\n') line++;
+  return oldchar;
+}
+
+ungettokenchar()
+{
+  oldcharvalid = 1;
+  if (oldchar == '\n') line--;
+}
+
+int gettoken(s)
+char *s;
+{
+  int i;
+  char c;
+
+  for (c = gettokenchar(); 
+       c == ' ' || c == '\t' || c == '\n';
+       c = gettokenchar()) ;
+  for (i = 0;
+       c != real_eof && c != ' ' && c != '\t' && c != '\n';
+       c = gettokenchar()) {
+    s[i++] = c;
+  }
+  s[i] = '\0';
+  ungettokenchar();
+  return i;
+}
+
+get_comment()
+{
+  if (eof) return;
+  while (1) {
+    if (gettoken(INPUT) == 0) return;
+    else if (strcmp(INPUT, "(*") == 0)
+      get_comment();
+    else if (strcmp(INPUT, "*)") == 0) 
+      return;
+  }
+}
+
+static int iostackempty()
+{
+  return (first(stack) == nil(stack));
+}
+
+static push_iostack(p)
+int p;
+{
+  Iostack n;
+
+  n = (Iostack) get_node(stack);
+  n->stream = IOSTREAM;
+  n->filename = (char *) malloc (sizeof(char)*(strlen(FILENAME)+2));
+  n->oldchar = oldchar;
+  n->oldcharvalid = oldcharvalid;
+  n->pipe = pipe;
+  n->line = line;
+  strcpy(n->filename, FILENAME);
+  insert(n, stack);
+  if (p) {
+    IOSTREAM = (FILE *) popen(INPUT, "r");
+  } else {
+    IOSTREAM = fopen(INPUT, "r");
+  }
+  pipe = p;
+  line = 1;
+  if (IOSTREAM == NULL) {
+    error_header();
+    fprintf(stderr, "Include file \"%s\" does not exist\n", INPUT);
+    exit(1);
+  }
+  strcpy(FILENAME, INPUT);
+}
+
+static pop_iostack()
+{
+  Iostack n;
+
+  fflush(IOSTREAM);
+  if (pipe) {
+    if (pclose(IOSTREAM)) {
+      /*error_header();
+      fprintf(stderr, "\n\nPipe returned a non-zero error code.\n");
+      exit(1); */
+    }
+  } else {
+    fclose(IOSTREAM);
+  }
+  n = last(stack);
+  if (n->stream == NULL) {
+    n->stream = fopen(n->filename, "r");
+    if (n->stream == NULL) {
+      fprintf(stderr, "Error: cannot open file \"%s\"\n", n->stream);
+      exit(1);
+    }
+  }
+  IOSTREAM = n->stream;
+  strcpy(FILENAME, n->filename);
+  free(n->filename);
+  pipe = n->pipe;
+  line = n->line;
+  oldchar = n->oldchar;
+  oldcharvalid = n->oldcharvalid;
+  delete_item(n);
+  free_node(n, stack);
+}
+
+static nexttoken()
+{
+  if (eof) return;
+  if (getnew) {
+    while (1) {
+      if (gettoken(INPUT) == 0) {
+        if (iostackempty()) {
+          eof = 1;
+          getnew = 0;
+          return;
+        } else {
+          pop_iostack();
+        }
+      } else if (strcmp(INPUT, "(*") == 0) {
+        get_comment();
+      } else if (strcmp(INPUT, "include") == 0) {
+        if (gettoken(INPUT) == 0) {
+          error_header();
+          fprintf(stderr, "Empty include statement\n");
+          exit(1);
+        } else {
+          push_iostack(0);
+        }
+      } else if (strcmp(INPUT, "shell") == 0) {
+#ifdef VMS 
+        fprintf(stderr, "No shell option on VMS, sorry.\n");
+        exit(1);
+#endif /*VMS*/	
+        if (gettoken(INPUT) == 0 || strcmp(INPUT, ":") != 0) {
+          error_header();
+          fprintf(stderr, "'shell' must be followed by ':'\n");
+          exit(1);
+        } 
+        if (getsystemstring() == 0) {
+          fprintf(stderr, "Empty shell statement\n");
+          exit(1);
+        }
+        push_iostack(1);
+      } else {
+        getnew = 1;
+        return;
+      }
+    }
+  }
+  getnew = 1;
+  return;
+}
+
+int getstring(s)
+char *s;
+{
+  nexttoken();
+  if (eof) return 0;
+  strcpy(s, INPUT);
+  return 1;
+}
+
+int getint(i)
+int *i;
+{
+  int j;
+
+  nexttoken();
+  if (eof) return 0;
+  *i = atoi(INPUT);
+  if (*i == 0) {
+    for (j = 0; INPUT[j] != '\0'; j++)
+      if (INPUT[j] != '0') return 0;
+  }
+  return 1;
+}
+
+int getfloat(f)
+float *f;
+{
+  int j;
+
+  nexttoken();
+  if (eof) return 0;
+  *f = (float) atof(INPUT);
+  if (*f == 0.0) {
+    for (j = 0; INPUT[j] == '-'; j++);
+    while (INPUT[j] == '0') j++;
+    if (INPUT[j] == '.') j++;
+    while (INPUT[j] == '0') j++;
+    if (INPUT[j] == 'e' || INPUT[j] == 'E') {
+      j++;
+      if (INPUT[j] == '+' || INPUT[j] == '-') j++;
+      while (INPUT[j] == '0') j++;
+    }
+    return (INPUT[j] == '\0');
+  } else return 1;
+}
+
+static char *new_printable_text(s)
+char *s;
+{
+  char *new_s;
+  int to_pad, i, j;
+
+  to_pad = 0;
+  for (i = 0; s[i] != '\0'; i++) {
+    if (s[i] == '\\' || s[i] == ')' || s[i] == '(') {
+       to_pad++;
+    }
+  }
+
+  j = sizeof(char) * (i + to_pad + 2);
+  if ((j % 8) != 0) j += 8 - j % 8;
+  new_s = (char *) malloc (j);
+  j = 0;
+  for (i = 0; s[i] != '\0'; i++) {
+    if (s[i] == '\\' || s[i] == ')' || s[i] == '(') {
+      new_s[j++] = '\\';
+    }
+    new_s[j++] = s[i];
+  }
+  new_s[j] = '\0';		/* added: tie off -hdd */
+  return new_s;
+}
+
+char *getmultiline()
+{
+  char c;
+  int i, j, done, len, started;
+  char *out_str;
+
+  if (getnew == 0) return CNULL;
+  
+  c = gettokenchar();
+  if (c == real_eof) {
+    ungettokenchar();
+    return CNULL;
+  }
+  done = 0;
+  started = 0;
+  while (!done) {
+    i = 0;
+    for (c = gettokenchar(); c != real_eof && c != '\n';  c = gettokenchar()) {
+      INPUT[i++] = c;
+    }
+    INPUT[i] = '\0';
+    if (!started) {
+      out_str = (char *) malloc (sizeof(char)*(i+1));
+      strcpy(out_str, INPUT);
+      len = i;
+      started = 1;
+    } else {
+      out_str = (char *) realloc(out_str, (len + i + 3) * sizeof(char));
+      sprintf(&(out_str[len]), "\n%s", INPUT);
+      len += i+1;
+    }
+    if (c == '\n' && len != 0 && out_str[len-1] == '\\') {
+      len--;
+    } else {
+      done = 1;
+    }
+  }
+  ungettokenchar();
+  return out_str;
+}
+
+char *getlabel()
+{
+  char c;
+  char *txt, *new;
+  int i;
+
+  txt = getmultiline();
+  if (txt == CNULL) return CNULL;
+  new = new_printable_text(txt);
+  free(txt);
+  return new;
+}
+
+int getsystemstring()
+{
+  char c;
+  int i;
+  int done;
+
+  if (getnew == 0) return 0;
+  
+  c = gettokenchar();
+  if (c == real_eof) {
+    ungettokenchar();
+    return 0;
+  }
+  i = 0;
+  done = 0;
+  while (!done) {
+    for (c = gettokenchar(); c != real_eof && c != '\n';  c = gettokenchar()) {
+      INPUT[i++] = c;
+    }
+    if (c == '\n' && i > 0 && INPUT[i-1] == '\\') {
+      INPUT[i++] = '\n';
+    } else {
+      done = 1;
+    }
+  }
+  ungettokenchar();
+  INPUT[i] = '\0';
+  return 1;
+}
+
+rejecttoken()
+{
+  getnew = 0;
+}
Index: /trunk/Jgraph/tree.awk
===================================================================
--- /trunk/Jgraph/tree.awk	(revision 418)
+++ /trunk/Jgraph/tree.awk	(revision 418)
@@ -0,0 +1,44 @@
+# This is an nawk script for plotting m-level n-ary trees in jgraph.
+# For each line of input, it will produce a new jgraph.  The line must
+# contain two numbers: m and n, separated by white-space.
+#
+# Two nice outputs of this are: 
+#
+# ( echo "4 3" | nawk -f tree.awk ; echo "xaxis size 5.4" ) | jgraph -P
+#
+# and
+# ( echo "5 2" | nawk -f tree.awk ; echo "xaxis size 5" ) | jgraph -P
+#
+
+{ m = $1
+  n = $2
+
+  printf("newgraph xaxis nodraw yaxis nodraw\n")
+  k = 0
+  for (j = 0; j < m; j++) {
+    if (j == 0) {
+      numleaves = n ^ (m - 1)
+      for (i = 0; i < numleaves; i++) newleafloc[i] = i
+    } else {
+      numleaves = numleaves / n
+      for (i = 0; i < numleaves; i++) {
+        newleafloc[i] =  (oldleafloc[i*n] + oldleafloc[i*n+n-1]) / 2.0
+      }
+    }
+    for (i = 0; i < numleaves; i++) {
+      printf("newcurve marktype box marksize 0.6 0.4 fill 1 pts %f %f\n",
+              newleafloc[i], j)
+      printf("newstring x %f y %f hjc vjc fontsize 6 : %d\n",
+              newleafloc[i], j, ++k)
+      if (j > 0) {
+        for (l = 0; l < n; l++) {
+          printf("newcurve marktype none linetype solid pts %f %f  %f %f\n",
+              newleafloc[i], j-.2, oldleafloc[i*n+l], j-.8)
+        }
+      }
+    }
+    for (i = 0; i < numleaves; i++) {
+      oldleafloc[i] = newleafloc[i]
+    }
+  }
+}
Index: /trunk/Jgraph/wortman.jgr
===================================================================
--- /trunk/Jgraph/wortman.jgr	(revision 418)
+++ /trunk/Jgraph/wortman.jgr	(revision 418)
@@ -0,0 +1,709 @@
+(* From dw@dragon.fly.toronto.edu Fri Jul 17 12:02:25 1992
+Received: from Princeton.EDU by fs.Princeton.EDU (4.1/1.105)
+	id AA19140; Fri, 17 Jul 92 12:02:22 EDT
+Received: from dragon.fly.toronto.edu by Princeton.EDU (5.65b/2.93/princeton)
+	id AA18519; Fri, 17 Jul 92 12:01:51 -0400
+Received: by dragon.fly.toronto.edu id <39023>; Fri, 17 Jul 1992 12:01:33 -0400
+From: Dave Wortman <dw@dragon.fly.toronto.edu>
+To: jsp@Princeton.EDU
+Subject: jgraph source for Wortman PLDI92 activity bar figure
+Cc: dw@dragon.fly.toronto.edu
+Message-Id: <92Jul17.120133edt.39023@dragon.fly.toronto.edu>
+Date: 	Fri, 17 Jul 1992 12:01:32 -0400
+Status: R
+
+Here is the source for the final version of the figure.
+FYI it was generated by an awk program that post processed trace data
+generated by the concurrent compiler.
+============================================================================
+*)
+
+newgraph
+yaxis size 7.5 min 0 max 8.500000 gray 0.000000 hash 0.0 label fontsize 16 : Processor
+hash_labels fontsize 18
+hash_label at 1.0 : 1
+hash_label at 2.0 : 2
+hash_label at 3.0 : 3
+hash_label at 4.0 : 4
+hash_label at 5.0 : 5
+hash_label at 6.0 : 6
+hash_label at 7.0 : 7
+hash_label at 8.0 : 8
+xaxis size 7.5 min 0 max 4232 gray 0 label fontsize 16 : Time (clock ticks)
+legend  custom linelength 500.0
+newcurve marktype box fill 0.2  marksize 300.0 0.4
+label vjt hjl x 500.0 y -1.0 fontsize 12 : Lexical Analysis
+newcurve marktype box fill 0.5  marksize 300.0 0.4
+label vjt hjl x 500.0 y -1.5 fontsize 12 : Import
+newcurve marktype box fill 0.95  marksize 300.0 0.4
+label vjt hjl x 1800.0 y -1.0 fontsize 12 : Splitter
+newcurve marktype box fill 0.7  marksize 300.0 0.4
+label vjt hjl x 1800.0 y -1.5 fontsize 12 : Parse/Dcl Analysis
+newcurve marktype box fill 0.4  marksize 300.0 0.4
+label vjt hjl x 3100.0 y -1.0 fontsize 12 : Stmt Processing
+newcurve marktype box fill 0.8  marksize 300.0 0.4
+label vjt hjl x 3100.0 y -1.5 fontsize 12 : Merge
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 1350 0.400000 pts  714 1
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 53 0.400000 pts  1651 1.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 28 0.400000 pts  1693 1.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 183 0.400000 pts  1799 1.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 36 0.400000 pts  1911 1.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 71 0.400000 pts  1966 1.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 30 0.400000 pts  2018 1.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 782 0.400000 pts  2426 1.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 101 0.400000 pts  2868 1.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 63 0.400000 pts  2950 1.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 140 0.400000 pts  3054 1.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 159 0.400000 pts  3204 1.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 99 0.400000 pts  3334 1.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 181 0.400000 pts  3475 1.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 64 0.400000 pts  3599 1.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 135 0.400000 pts  3699 1.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 368 0.400000 pts  3953 1.000000
+newcurve marktype box fill 0.800000
+linethickness 0.0
+marksize 72 0.400000 pts  4174 1.000000
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 114 0.400000 pts  154 2
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 91 0.400000 pts  256 2
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 101 0.400000 pts  354 2
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 8 0.400000 pts  411 2.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 8 0.400000 pts  420 2.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 9 0.400000 pts  429 2.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 25 0.400000 pts  447 2.000000
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 50 0.400000 pts  485 2
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 8 0.400000 pts  515 2.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 6 0.400000 pts  522 2.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 28 0.400000 pts  539 2.000000
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 59 0.400000 pts  583 2
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 70 0.400000 pts  650 2
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 6 0.400000 pts  689 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 82 0.400000 pts  737 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 110 0.400000 pts  835 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 67 0.400000 pts  1249 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 30 0.400000 pts  1655 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 16 0.400000 pts  1679 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 33 0.400000 pts  1704 2.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 80 0.400000 pts  1765 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 16 0.400000 pts  1816 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 10 0.400000 pts  1830 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 6 0.400000 pts  1839 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 7 0.400000 pts  1847 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 9 0.400000 pts  1855 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 33 0.400000 pts  1877 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 15 0.400000 pts  1902 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 18 0.400000 pts  1921 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 31 0.400000 pts  1946 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 54 0.400000 pts  1992 2.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 61 0.400000 pts  2051 2.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 916 0.400000 pts  2542 2.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 144 0.400000 pts  3073 2.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 178 0.400000 pts  3235 2.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 181 0.400000 pts  3415 2.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 147 0.400000 pts  3581 2.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 137 0.400000 pts  3724 2.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 44 0.400000 pts  149 3.000000
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 142 0.400000 pts  243 3
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 5 0.400000 pts  317 3.000000
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 105 0.400000 pts  372 3
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 5 0.400000 pts  428 3.000000
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 67 0.400000 pts  465 3
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 9 0.400000 pts  504 3.000000
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 82 0.400000 pts  550 3
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 74 0.400000 pts  631 3
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 6 0.400000 pts  672 3.000000
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 41 0.400000 pts  696 3
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 28 0.400000 pts  732 3.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 17 0.400000 pts  755 3.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 72 0.400000 pts  802 3.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 25 0.400000 pts  852 3.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 8 0.400000 pts  872 3.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 2 0.400000 pts  1328 3.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 538 0.400000 pts  1792 3.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 840 0.400000 pts  2486 3.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 486 0.400000 pts  3150 3.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 178 0.400000 pts  3484 3.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 54 0.400000 pts  3602 3.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 121 0.400000 pts  3690 3.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 176 0.400000 pts  3840 3.000000
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 174 0.400000 pts  226 4
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 6 0.400000 pts  317 4.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 11 0.400000 pts  327 4.000000
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 42 0.400000 pts  355 4
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 79 0.400000 pts  416 4
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 73 0.400000 pts  494 4
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 73 0.400000 pts  568 4
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 48 0.400000 pts  630 4
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 6 0.400000 pts  658 4.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 16 0.400000 pts  670 4.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 8 0.400000 pts  683 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 35 0.400000 pts  705 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 25 0.400000 pts  736 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 3 0.400000 pts  751 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 15 0.400000 pts  763 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 48 0.400000 pts  798 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 9 0.400000 pts  828 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 27 0.400000 pts  849 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 59 0.400000 pts  893 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 26 0.400000 pts  1645 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 14 0.400000 pts  1667 4.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 120 0.400000 pts  1736 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 12 0.400000 pts  1803 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 21 0.400000 pts  1819 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 6 0.400000 pts  1834 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 7 0.400000 pts  1841 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 9 0.400000 pts  1852 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 6 0.400000 pts  1861 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 12 0.400000 pts  1871 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 22 0.400000 pts  1889 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 16 0.400000 pts  1909 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 8 0.400000 pts  1921 4.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 109 0.400000 pts  1980 4.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 765 0.400000 pts  2419 4.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 283 0.400000 pts  2945 4.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 190 0.400000 pts  3184 4.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 272 0.400000 pts  3417 4.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 55 0.400000 pts  3582 4.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 112 0.400000 pts  3667 4.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 65 0.400000 pts  3757 4.000000
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 448 0.400000 pts  365 5
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 70 0.400000 pts  625 5
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 13 0.400000 pts  669 5.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 6 0.400000 pts  681 5.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 6 0.400000 pts  688 5.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 7 0.400000 pts  695 5.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 10 0.400000 pts  709 5.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 84 0.400000 pts  819 5.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 33 0.400000 pts  879 5.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 18 0.400000 pts  1663 5.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 152 0.400000 pts  1749 5.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 10 0.400000 pts  1831 5.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 9 0.400000 pts  1841 5.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 95 0.400000 pts  1894 5.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 12 0.400000 pts  1948 5.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 15 0.400000 pts  1962 5.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 123 0.400000 pts  2032 5.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 849 0.400000 pts  2519 5.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 544 0.400000 pts  3218 5.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 145 0.400000 pts  3564 5.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 103 0.400000 pts  3689 5.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 119 0.400000 pts  3801 5.000000
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 282 0.400000 pts  287 6
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 5 0.400000 pts  431 6.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 5 0.400000 pts  437 6.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 6 0.400000 pts  444 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 4 0.400000 pts  452 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 9 0.400000 pts  463 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 41 0.400000 pts  491 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 11 0.400000 pts  519 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 12 0.400000 pts  533 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 150 0.400000 pts  616 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 9 0.400000 pts  697 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 54 0.400000 pts  732 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 455 0.400000 pts  988 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 108 0.400000 pts  1273 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 67 0.400000 pts  1362 6.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 270 0.400000 pts  1793 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 18 0.400000 pts  1938 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 46 0.400000 pts  1970 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 20 0.400000 pts  2003 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 8 0.400000 pts  2018 6.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 10 0.400000 pts  2028 6.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 395 0.400000 pts  2231 6.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 514 0.400000 pts  2688 6.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 127 0.400000 pts  3009 6.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 243 0.400000 pts  3196 6.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 64 0.400000 pts  3352 6.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 122 0.400000 pts  3445 6.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 153 0.400000 pts  3583 6.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 99 0.400000 pts  3710 6.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 79 0.400000 pts  3800 6.000000
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 132 0.400000 pts  216 7
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 194 0.400000 pts  380 7
+newcurve marktype box fill 0.950000
+linethickness 0.0
+marksize 913 0.400000 pts  934 7.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 33 0.400000 pts  1681 7.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 10 0.400000 pts  1704 7.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 14 0.400000 pts  1717 7.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 131 0.400000 pts  1789 7.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 13 0.400000 pts  1862 7.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 14 0.400000 pts  1877 7.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 20 0.400000 pts  1894 7.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 16 0.400000 pts  1913 7.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 7 0.400000 pts  1925 7.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 30 0.400000 pts  1945 7.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 58 0.400000 pts  1990 7.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 53 0.400000 pts  2049 7.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 898 0.400000 pts  2526 7.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 279 0.400000 pts  3118 7.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 137 0.400000 pts  3327 7.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 148 0.400000 pts  3471 7.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 87 0.400000 pts  3590 7.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 49 0.400000 pts  3659 7.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 102 0.400000 pts  3737 7.000000
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 76 0.400000 pts  192 8
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 163 0.400000 pts  312 8
+newcurve marktype box fill 0.200000 
+linethickness 0.0
+marksize 26 0.400000 pts  408 8
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 8 0.400000 pts  426 8.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 5 0.400000 pts  433 8.000000
+newcurve marktype box fill 0.500000 
+linethickness 0.0
+marksize 8 0.400000 pts  441 8.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 13 0.400000 pts  452 8.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 6 0.400000 pts  464 8.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 71 0.400000 pts  506 8.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 18 0.400000 pts  553 8.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 148 0.400000 pts  641 8.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 60 0.400000 pts  748 8.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 75 0.400000 pts  816 8.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 8 0.400000 pts  860 8.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 13 0.400000 pts  871 8.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 7 0.400000 pts  1219 8.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 128 0.400000 pts  1460 8.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 282 0.400000 pts  1811 8.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 10 0.400000 pts  1958 8.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 59 0.400000 pts  1995 8.000000
+newcurve marktype box fill 0.700000
+linethickness 0.0
+marksize 80 0.400000 pts  2066 8.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 517 0.400000 pts  2365 8.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 327 0.400000 pts  2788 8.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 460 0.400000 pts  3183 8.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 192 0.400000 pts  3510 8.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 90 0.400000 pts  3652 8.000000
+newcurve marktype box fill 0.400000
+linethickness 0.0
+marksize 137 0.400000 pts  3767 8.000000
+
