From d80572ef7327df981c91c314d7a450e3a9684ea1 Mon Sep 17 00:00:00 2001
From: Steve Price <steve@FreeBSD.org>
Date: Mon, 24 Jan 2000 06:19:03 +0000
Subject: o Fix Configuration Option for readline library o Add patch to avoid
 divide-by-zero trap o Merge patches for gnuplot-3.7.1

PR:		16120
Submitted by:	Akio Morita <amorita@meadow.scphys.kyoto-u.ac.jp>
Reviewed by:	maintainer
---
 math/gnuplot+/Makefile       |    2 +-
 math/gnuplot+/files/patch-xb |   22 +
 math/gnuplot+/files/patch-xc |   26 +
 math/gnuplot+/files/patch-xd |  103 ++
 math/gnuplot+/files/patch-xe |   80 ++
 math/gnuplot+/files/patch-xf |   15 +
 math/gnuplot+/files/patch-xg |  236 +++++
 math/gnuplot+/files/patch-xh |  460 +++++++++
 math/gnuplot+/files/patch-xi | 2118 ++++++++++++++++++++++++++++++++++++++++++
 math/gnuplot+/files/patch-xj |   13 +
 math/gnuplot+/files/patch-xk |  283 ++++++
 math/gnuplot+/files/patch-xl |   64 ++
 math/gnuplot+/files/patch-za |   74 ++
 13 files changed, 3495 insertions(+), 1 deletion(-)
 create mode 100644 math/gnuplot+/files/patch-xb
 create mode 100644 math/gnuplot+/files/patch-xc
 create mode 100644 math/gnuplot+/files/patch-xd
 create mode 100644 math/gnuplot+/files/patch-xe
 create mode 100644 math/gnuplot+/files/patch-xf
 create mode 100644 math/gnuplot+/files/patch-xg
 create mode 100644 math/gnuplot+/files/patch-xh
 create mode 100644 math/gnuplot+/files/patch-xi
 create mode 100644 math/gnuplot+/files/patch-xj
 create mode 100644 math/gnuplot+/files/patch-xk
 create mode 100644 math/gnuplot+/files/patch-xl
 create mode 100644 math/gnuplot+/files/patch-za

(limited to 'math')

diff --git a/math/gnuplot+/Makefile b/math/gnuplot+/Makefile
index de572bd0fedf..a6aa981fcf49 100644
--- a/math/gnuplot+/Makefile
+++ b/math/gnuplot+/Makefile
@@ -39,7 +39,7 @@ CONFIGURE_ARGS=	--exec-prefix=${PREFIX} \
 		--libdir=${LOCALBASE}/lib \
 		--with-x --without-linux-vga \
 		--with-gd=${LOCALBASE}/lib \
-		--with-gnu-readline --with-lasergnu --with-png \
+		--with-readline=gnu --with-lasergnu --with-png \
 		--with-vflib=${LOCALBASE}/lib
 
 MAN1=		gnuplot.1 lasergnu.1
diff --git a/math/gnuplot+/files/patch-xb b/math/gnuplot+/files/patch-xb
new file mode 100644
index 000000000000..4b6b5e6fe5bc
--- /dev/null
+++ b/math/gnuplot+/files/patch-xb
@@ -0,0 +1,22 @@
+# key-below-clipping
+--- graphics.c.ORIG	Wed Sep 15 16:30:29 1999
++++ graphics.c	Wed Nov 17 17:22:24 1999
+@@ -1763,7 +1763,9 @@
+ #else
+ 			int x = xl + key_text_right - (t->h_char) * strlen(s);
+ #endif
+-			if (key_hpos == TOUT || inrange(x, xleft, xright))
++			if (key_hpos == TOUT ||
++			    key_vpos == TUNDER || /* HBB 990327 */
++			    inrange(x, xleft, xright))
+ 			    (*t->put_text) (x, yl, s);
+ 		    }
+ 		}
+@@ -1820,6 +1822,7 @@
+ 			int x = xl + key_text_right - (t->h_char) * strlen(this_plot->title);
+ #endif
+ 			if (key_hpos == TOUT ||
++			    key_vpos == TUNDER || /* HBB 990327 */
+ 			    i_inrange(x, xleft, xright))
+ 			    (*t->put_text) (x, yl, this_plot->title);
+ 		    }
diff --git a/math/gnuplot+/files/patch-xc b/math/gnuplot+/files/patch-xc
new file mode 100644
index 000000000000..43b861cb924a
--- /dev/null
+++ b/math/gnuplot+/files/patch-xc
@@ -0,0 +1,26 @@
+# hidden3d-endlessloop
+--- hidden3d.c.ORIG	Thu Aug 19 15:39:28 1999
++++ hidden3d.c	Wed Nov 17 17:42:00 1999
+@@ -2140,14 +2140,20 @@
+ 	    test->tested = is_moved_or_split;
+ 	    SPLIT_TEST_BY_P;
+ 	} else {
+-	    if (loop && (p->tested == is_tested)) {
+-		/* Ouch, seems like we're in trouble, really */
++	    if (loop && (p->tested == is_in_loop)) { 
++		/* Ouch, seems like we're in trouble, really: no way to
++		 * split one of them, and we're in a loop, so we can't
++		 * move p to the front of the list, without risking an
++		 * endless loop. Well, let's just output the darn thing,
++		 * then, no matter what. :-( */
++#if DEBUG /* normally off */
+ 		fprintf(stderr, "\
+ #Failed: In loop, without intersections.\n\
+ #Relations are %d, %d\n",
+ 			p_rel_tplane, t_rel_pplane);
+ 		print_polygon(test, "test");
+ 		print_polygon(p, "p");
++#endif	
+ 		continue;	/* Keep quiet, maybe no-one will notice (;-) */
+ 	    } else {
+ 		PUT_P_IN_FRONT_TEST(is_in_loop);
diff --git a/math/gnuplot+/files/patch-xd b/math/gnuplot+/files/patch-xd
new file mode 100644
index 000000000000..66e3bd279783
--- /dev/null
+++ b/math/gnuplot+/files/patch-xd
@@ -0,0 +1,103 @@
+# table-format.2
+--- plot2d.c.ORIG	Mon Oct 11 13:18:56 1999
++++ plot2d.c	Thu Nov 18 19:13:48 1999
+@@ -718,12 +718,22 @@
+ int plot_num;
+ {
+     int i, curve;
++    char *table_format = NULL;
++
++    /* The data format is determined by the format of the axis labels.
++     * See 'set format'.  Patch by Don Taber
++     */
++    table_format = gp_alloc(strlen(xformat)+strlen(yformat)+5, "table format");
++    strcpy(table_format, xformat);
++    strcat(table_format, " ");
++    strcat(table_format, yformat);
++    strcat(table_format, " %c\n");
+ 
+     for (curve = 0; curve < plot_num;
+ 	 curve++, this_plot = this_plot->next_cp) {
+ 	fprintf(gpoutfile, "#Curve %d, %d points\n#x y type\n", curve, this_plot->p_count);
+ 	for (i = 0; i < this_plot->p_count; i++) {
+-	    fprintf(gpoutfile, "%g %g %c\n",
++	    fprintf(gpoutfile, table_format,
+ 		    this_plot->points[i].x,
+ 		    this_plot->points[i].y,
+ 		    this_plot->points[i].type == INRANGE ? 'i'
+@@ -732,9 +742,12 @@
+ 	}
+ 	fputc('\n', gpoutfile);
+     }
+-/* two blank lines between plots in table output */
++
++    /* two blank lines between plots in table output */
+     fputc('\n', gpoutfile);
+     fflush(gpoutfile);
++
++    free(table_format);
+ }
+ 
+ /*
+--- plot3d.c.ORIG	Thu Dec 10 18:30:52 1998
++++ plot3d.c	Thu Nov 18 19:12:01 1999
+@@ -694,6 +694,17 @@
+     int i, curve, surface;
+     struct iso_curve *icrvs;
+     struct coordinate GPHUGE *points;
++    char *table_format = NULL;
++    char *pcat;
++
++    table_format = gp_alloc(strlen(xformat)+strlen(yformat)+strlen(zformat)+6,
++			    "table format");
++    strcpy(table_format, xformat);
++    strcat(table_format, " ");
++    strcat(table_format, yformat);
++    strcat(table_format, " ");
++    strcat(table_format, zformat);
++    pcat = &table_format[strlen(table_format)];
+ 
+     for (surface = 0, this_plot = first_3dplot; surface < pcount;
+ 	 this_plot = this_plot->next_sp, surface++) {
+@@ -702,12 +713,13 @@
+ 	curve = 0;
+ 
+ 	if (draw_surface) {
++	    strcpy(pcat," %c\n");
+ 	    /* only the curves in one direction */
+ 	    while (icrvs && curve < this_plot->num_iso_read) {
+ 		fprintf(gpoutfile, "\n#IsoCurve %d, %d points\n#x y z type\n",
+ 			curve, icrvs->p_count);
+ 		for (i = 0, points = icrvs->points; i < icrvs->p_count; i++) {
+-		    fprintf(gpoutfile, "%g %g %g %c\n",
++		    fprintf(gpoutfile, table_format,
+ 			    points[i].x,
+ 			    points[i].y,
+ 			    points[i].z,
+@@ -723,6 +735,7 @@
+ 	if (draw_contour) {
+ 	    int number = 0;
+ 	    struct gnuplot_contours *c = this_plot->contours;
++	    strcpy(pcat,"\n");
+ 	    while (c) {
+ 		int count = c->num_pts;
+ 		struct coordinate GPHUGE *p = c->coords;
+@@ -732,7 +745,8 @@
+ 		    /* double blank line to allow plot ... index ... */
+ 		    fprintf(gpoutfile, "\n# Contour %d, label: %s\n", number++, c->label);
+ 		for (; --count >= 0; ++p)
+-		    fprintf(gpoutfile, "%g %g %g\n", p->x, p->y, p->z);
++		    fprintf(gpoutfile, table_format, p->x, p->y, p->z);
++
+ 		/* blank line between segments of same contour */
+ 		putc('\n', gpoutfile);
+ 		c = c->next;
+@@ -740,6 +754,8 @@
+ 	}
+     }
+     fflush(gpoutfile);
++
++    free(table_format);
+ }
+ 
+ 
diff --git a/math/gnuplot+/files/patch-xe b/math/gnuplot+/files/patch-xe
new file mode 100644
index 000000000000..cc9cb87da290
--- /dev/null
+++ b/math/gnuplot+/files/patch-xe
@@ -0,0 +1,80 @@
+# contour.c.fix.991130
+--- contour.c.ORIG	Thu Dec  3 22:23:46 1998
++++ contour.c	Wed Dec  1 21:07:24 1999
+@@ -536,8 +536,8 @@
+ struct edge_struct **p_edges; /* list of edges output */
+ {
+     int i, j, grid_x_max = iso_lines->p_count;
+-    struct edge_struct *p_edge1, *p_edge2, *edge0, *edge1, *edge2, *pe_tail,
+-    *pe_tail1, *pe_tail2, *pe_temp;
++    struct edge_struct *p_edge1, *p_edge2, *edge0, *edge1, *edge2,
++           *pe_tail, *pe_tail2, *pe_temp;
+     struct poly_struct *pp_tail, *lower_tri, *upper_tri;
+     struct coordinate GPHUGE *p_vrtx1, GPHUGE * p_vrtx2;	/* HBB 980308: need to tag *each* of them as GPHUGE! */
+ 
+@@ -545,14 +545,14 @@
+     (*p_edges) = pe_tail = NULL;
+ 
+     p_vrtx1 = iso_lines->points;	/* first row of vertices */
+-    p_edge1 = pe_tail1 = NULL;	/* clear list of edges */
++    p_edge1 = pe_tail = NULL;	/* clear list of edges */
+ 
+     /* Generate edges of first row */
++    /* HBB 19991130: removed effectively unused variable 'pe_tail1' */
+     for (j = 0; j < grid_x_max - 1; j++)
+-	add_edge(p_vrtx1 + j, p_vrtx1 + j + 1, &p_edge1, &pe_tail1);
++	add_edge(p_vrtx1 + j, p_vrtx1 + j + 1, &p_edge1, &pe_tail);
+ 
+     (*p_edges) = p_edge1;	/* update main list */
+-    pe_tail = pe_tail1;
+ 
+ 
+     /*
+@@ -562,10 +562,16 @@
+      * (pe_tail points on last edge).
+      *
+      * Temporary pointers:
+-     * 1. p_edge2: Top horizontal edge list:       -----------------------  2
+-     * 2. pe_tail: middle edge list:              |\  |\  |\  |\  |\  |\  |
++     * 1. p_edge2: Top horizontal edge list:      +-----------------------+ 2
++     * 2. p_tail : end of middle edge list:       |\  |\  |\  |\  |\  |\  |
+      *                                            |  \|  \|  \|  \|  \|  \|
+-     * 3. p_edge1: Bottom horizontal edge list:    -----------------------  1
++     * 3. p_edge1: Bottom horizontal edge list:   +-----------------------+ 1
++     *
++     * pe_tail2  : end of list beginning at p_edge2
++     * pe_temp   : position inside list beginning at p_edge1
++     * p_edges   : head of the master edge list (part of our output)
++     * p_vrtx1   : start of lower row of input vertices
++     * p_vrtx2   : start of higher row of input vertices
+      *
+      * The routine generates two triangle            Lower      Upper 1  
+      * upper one and lower one:                     | \           ----   
+@@ -633,14 +639,21 @@
+ 	    upper_tri = add_poly(edge0, edge1, edge2, p_polys, &pp_tail);
+ 	}
+ 
+-	if ((*p_edges)) {	/* Chain new edges to main list. */
+-	    pe_tail->next = p_edge2;
+-	    pe_tail = pe_tail2;
+-	} else {
+-	    (*p_edges) = p_edge2;
+-	    pe_tail = pe_tail2;
++        if (p_edge2) {
++	    /* HBB 19991130 bugfix: if p_edge2 list is empty,
++	     * don't change p_edges list! Crashes by access
++	     * to NULL pointer pe_tail, the second time through,
++	     * otherwise */
++	    if ((*p_edges)) {	/* Chain new edges to main list. */
++		pe_tail->next = p_edge2;
++		pe_tail = pe_tail2;
++	    } else {
++		(*p_edges) = p_edge2;
++		pe_tail = pe_tail2;
++	    }
+ 	}
+ 
++	/* this row finished, move list heads up one row: */
+ 	p_edge1 = p_edge2;
+ 	p_vrtx1 = p_vrtx2;
+     }
diff --git a/math/gnuplot+/files/patch-xf b/math/gnuplot+/files/patch-xf
new file mode 100644
index 000000000000..23d6991e880d
--- /dev/null
+++ b/math/gnuplot+/files/patch-xf
@@ -0,0 +1,15 @@
+# contour-clipping.991202
+--- contour.c.ORIG	Thu Dec  2 15:15:03 1999
++++ contour.c	Thu Dec  2 15:13:53 1999
+@@ -727,7 +727,11 @@
+ {
+     struct edge_struct *pe_temp = NULL;
+ 
++#if 1
++    if (point0->type == INRANGE && point1->type == INRANGE) {
++#else
+     if (point0->type != UNDEFINED && point1->type != UNDEFINED) {
++#endif
+ 
+ 	pe_temp = (struct edge_struct *)
+ 	    gp_alloc((unsigned long) sizeof(struct edge_struct), "contour edge");
diff --git a/math/gnuplot+/files/patch-xg b/math/gnuplot+/files/patch-xg
new file mode 100644
index 000000000000..c1a0c959952d
--- /dev/null
+++ b/math/gnuplot+/files/patch-xg
@@ -0,0 +1,236 @@
+# vector-clip
+--- graphics.c.ORIG	Wed Sep 15 16:30:29 1999
++++ graphics.c	Thu Dec  2 13:16:57 1999
+@@ -1369,7 +1369,6 @@
+ 
+     /* label first y axis tics */
+     if (ytics) {
+-	int axis = map_x(ZERO);
+ 	/* set the globals ytick2d_callback() needs */
+ 
+ 	if (rotate_ytics && (*t->text_angle) (1)) {
+@@ -1388,8 +1387,8 @@
+ 	else
+ 	    tic_mirror = -1;	/* no thank you */
+ 
+-	if ((ytics & TICS_ON_AXIS) && !log_array[FIRST_X_AXIS] && inrange(axis, xleft, xright)) {
+-	    tic_start = axis;
++	if ((ytics & TICS_ON_AXIS) && !log_array[FIRST_X_AXIS] && inrange(0.0, x_min, x_max)) {
++	    tic_start = map_x(0.0);
+ 	    tic_direction = -1;
+ 	    if (ytics & TICS_MIRROR)
+ 		tic_mirror = tic_start;
+@@ -1409,7 +1408,6 @@
+     }
+     /* label first x axis tics */
+     if (xtics) {
+-	int axis = map_y(ZERO);
+ 	/* set the globals xtick2d_callback() needs */
+ 
+ 	if (rotate_xtics && (*t->text_angle) (1)) {
+@@ -1426,8 +1424,8 @@
+ 	    tic_mirror = ytop;
+ 	else
+ 	    tic_mirror = -1;	/* no thank you */
+-	if ((xtics & TICS_ON_AXIS) && !log_array[FIRST_Y_AXIS] && inrange(axis, ybot, ytop)) {
+-	    tic_start = axis;
++	if ((xtics & TICS_ON_AXIS) && !log_array[FIRST_Y_AXIS] && inrange(0.0, y_min, y_max)) {
++	    tic_start = map_y(0.0);
+ 	    tic_direction = -1;
+ 	    if (xtics & TICS_MIRROR)
+ 		tic_mirror = tic_start;
+@@ -1454,7 +1452,6 @@
+     /* label second y axis tics */
+     if (y2tics) {
+ 	/* set the globalss ytick2d_callback() needs */
+-	int axis = map_x(ZERO);
+ 
+ 	if (rotate_y2tics && (*t->text_angle) (1)) {
+ 	    tic_hjust = CENTRE;
+@@ -1470,8 +1467,8 @@
+ 	    tic_mirror = xleft;
+ 	else
+ 	    tic_mirror = -1;	/* no thank you */
+-	if ((y2tics & TICS_ON_AXIS) && !log_array[FIRST_X_AXIS] && inrange(axis, xleft, xright)) {
+-	    tic_start = axis;
++	if ((y2tics & TICS_ON_AXIS) && !log_array[FIRST_X_AXIS] && inrange(0.0, x_min, x_max)) {
++	    tic_start = map_x(0.0);
+ 	    tic_direction = 1;
+ 	    if (y2tics & TICS_MIRROR)
+ 		tic_mirror = tic_start;
+@@ -1490,7 +1487,6 @@
+     }
+     /* label second x axis tics */
+     if (x2tics) {
+-	int axis = map_y(ZERO);
+ 	/* set the globals xtick2d_callback() needs */
+ 
+ 	if (rotate_x2tics && (*t->text_angle) (1)) {
+@@ -1507,8 +1503,8 @@
+ 	    tic_mirror = ybot;
+ 	else
+ 	    tic_mirror = -1;	/* no thank you */
+-	if ((x2tics & TICS_ON_AXIS) && !log_array[SECOND_Y_AXIS] && inrange(axis, ybot, ytop)) {
+-	    tic_start = axis;
++	if ((x2tics & TICS_ON_AXIS) && !log_array[SECOND_Y_AXIS] && inrange(0.0, y_min, y_max)) {
++	    tic_start = map_y(0.0);
+ 	    tic_direction = 1;
+ 	    if (x2tics & TICS_MIRROR)
+ 		tic_mirror = tic_start;
+@@ -1560,45 +1556,58 @@
+ 
+     x_axis = FIRST_X_AXIS;
+     y_axis = FIRST_Y_AXIS;	/* chose scaling */
+-    axis_zero[FIRST_Y_AXIS] = map_y(0.0);
+-    axis_zero[FIRST_X_AXIS] = map_x(0.0);
+ 
+-    if (axis_zero[FIRST_Y_AXIS] < ybot || is_log_y)
++    if (y_min >= 0.0 && y_max >= 0.0 || is_log_y)
+ 	axis_zero[FIRST_Y_AXIS] = ybot;		/* save for impulse plotting */
+-    else if (axis_zero[FIRST_Y_AXIS] >= ytop)
++    else if (y_min <= 0.0 && y_max <= 0.0)
+ 	axis_zero[FIRST_Y_AXIS] = ytop;
+-    else if (xzeroaxis.l_type > -3) {
+-	term_apply_lp_properties(&xzeroaxis);
+-	(*t->move) (xleft, axis_zero[FIRST_Y_AXIS]);
+-	(*t->vector) (xright, axis_zero[FIRST_Y_AXIS]);
+-    }
+-    if ((yzeroaxis.l_type > -3) && !is_log_x
+-	&& axis_zero[FIRST_X_AXIS] >= xleft
+-	&& axis_zero[FIRST_X_AXIS] < xright) {
+-	term_apply_lp_properties(&yzeroaxis);
+-	(*t->move) (axis_zero[FIRST_X_AXIS], ybot);
+-	(*t->vector) (axis_zero[FIRST_X_AXIS], ytop);
++    else {
++	axis_zero[FIRST_X_AXIS] = map_y(0.0);
++	if (xzeroaxis.l_type > -3) {
++	    term_apply_lp_properties(&xzeroaxis);
++	    (*t->move) (xleft, axis_zero[FIRST_Y_AXIS]);
++	    (*t->vector) (xright, axis_zero[FIRST_Y_AXIS]);
++	}
++    }
++    if (x_min >= 0.0 && x_max >= 0.0)
++	axis_zero[FIRST_Y_AXIS] = xleft;
++    else if (x_min <= 0.0 && x_max <= 0.0)
++	axis_zero[FIRST_Y_AXIS] = xright;
++    else {
++	axis_zero[FIRST_Y_AXIS] = map_x(0.0);
++	if ((yzeroaxis.l_type > -3) && !is_log_x) {
++	    term_apply_lp_properties(&yzeroaxis);
++	    (*t->move) (axis_zero[FIRST_X_AXIS], ybot);
++	    (*t->vector) (axis_zero[FIRST_X_AXIS], ytop);
++	}
+     }
++
+     x_axis = SECOND_X_AXIS;
+     y_axis = SECOND_Y_AXIS;	/* chose scaling */
+-    axis_zero[SECOND_Y_AXIS] = map_y(0.0);
+-    axis_zero[SECOND_X_AXIS] = map_x(0.0);
+ 
+-    if (axis_zero[SECOND_Y_AXIS] < ybot || is_log_y2)
++    if (is_log_y2 || y_min >= 0.0 && y_max >= 0.0)
+ 	axis_zero[SECOND_Y_AXIS] = ybot;  /* save for impulse plotting */
+-    else if (axis_zero[SECOND_Y_AXIS] >= ytop)
++    else if (y_min <= 0.0 && y_max <= 0.0)
+ 	axis_zero[SECOND_Y_AXIS] = ytop;
+-    else if (x2zeroaxis.l_type > -3) {
+-	term_apply_lp_properties(&x2zeroaxis);
+-	(*t->move) (xleft, axis_zero[SECOND_Y_AXIS]);
+-	(*t->vector) (xright, axis_zero[SECOND_Y_AXIS]);
+-    }
+-    if ((y2zeroaxis.l_type > -3) && !is_log_x2 &&
+-	axis_zero[SECOND_X_AXIS] >= xleft &&
+-	axis_zero[SECOND_X_AXIS] < xright) {
+-	term_apply_lp_properties(&y2zeroaxis);
+-	(*t->move) (axis_zero[SECOND_X_AXIS], ybot);
+-	(*t->vector) (axis_zero[SECOND_X_AXIS], ytop);
++    else {
++	axis_zero[SECOND_X_AXIS] = map_y(0.0);
++	if (x2zeroaxis.l_type > -3) {
++	    term_apply_lp_properties(&x2zeroaxis);
++	    (*t->move) (xleft, axis_zero[SECOND_Y_AXIS]);
++	    (*t->vector) (xright, axis_zero[SECOND_Y_AXIS]);
++	}
++    }
++    if (y_min >= 0.0 && y_max >= 0.0)
++	axis_zero[SECOND_Y_AXIS] = xleft;
++    else if (x_min <= 0.0 && x_max <= 0.0)
++	axis_zero[SECOND_Y_AXIS] = xright;
++    else {
++	axis_zero[SECOND_Y_AXIS] = map_x(0.0);
++	if ((y2zeroaxis.l_type > -3) && !is_log_x2) {
++	    term_apply_lp_properties(&y2zeroaxis);
++	    (*t->move) (axis_zero[SECOND_X_AXIS], ybot);
++	    (*t->vector) (axis_zero[SECOND_X_AXIS], ytop);
++	}
+     }
+     /* DRAW PLOT BORDER */
+     if (draw_border) {
+@@ -2739,14 +2748,61 @@
+     int i;
+     int x1, y1, x2, y2;
+     struct termentry *t = term;
++    TBOOLEAN head;
++    struct coordinate GPHUGE points[2];
++    double ex, ey;
++    double lx[2], ly[2];
+ 
+     for (i = 0; i < plot->p_count; i++) {
+-	if (plot->points[i].type == INRANGE) {
+-	    x1 = map_x(plot->points[i].xlow);
+-	    y1 = map_y(plot->points[i].ylow);
+-	    x2 = map_x(plot->points[i].xhigh);
+-	    y2 = map_y(plot->points[i].yhigh);
+-	    (*t->arrow) (x1, y1, x2, y2, TRUE);
++	points[0] = plot->points[i];
++	points[1].x = plot->points[i].xhigh;
++	points[1].y = plot->points[i].yhigh;
++	if (inrange(points[1].x, x_min, x_max) &&
++	    inrange(points[1].y, y_min, y_max)) {
++	    /* to inrange */
++	    points[1].type = INRANGE;
++	    x2 = map_x(points[1].x);
++	    y2 = map_y(points[1].y);
++	    head = TRUE;
++	    if (points[0].type == INRANGE) {
++		x1 = map_x(points[0].x);
++		y1 = map_y(points[0].y);
++		(*t->arrow) (x1, y1, x2, y2, head);
++	    } else if (points[0].type == OUTRANGE) {
++		/* from outrange to inrange */
++		if (clip_lines1) {
++		    edge_intersect(points, 1, &ex, &ey);
++		    x1 = map_x(ex);
++		    y1 = map_y(ey);
++		    (*t->arrow) (x1, y1, x2, y2, head);
++		}
++	    }
++	} else {
++	    /* to outrange */
++	    points[1].type = OUTRANGE;
++	    head = FALSE;
++	    if (points[0].type == INRANGE) {
++		/* from inrange to outrange */
++		if (clip_lines1) {
++		    x1 = map_x(points[0].x);
++		    y1 = map_y(points[0].y);
++		    edge_intersect(points, 1, &ex, &ey);
++		    x2 = map_x(ex);
++		    y2 = map_y(ey);
++		    (*t->arrow) (x1, y1, x2, y2, head);
++		}
++	    } else if (points[0].type == OUTRANGE) {
++		/* from outrange to outrange */
++		if (clip_lines2) {
++		    if (two_edge_intersect(points, 1, lx, ly)) {
++			x1 = map_x(lx[0]);
++			y1 = map_y(ly[0]);
++			x2 = map_x(lx[1]);
++			y2 = map_y(ly[1]);
++			(*t->arrow) (x1, y1, x2, y2, head);
++		    }
++		}
++	    }
+ 	}
+     }
+ }
diff --git a/math/gnuplot+/files/patch-xh b/math/gnuplot+/files/patch-xh
new file mode 100644
index 000000000000..19bc589f116d
--- /dev/null
+++ b/math/gnuplot+/files/patch-xh
@@ -0,0 +1,460 @@
+# png-web216.4
+--- bitmap.c.ORIG	Mon Oct 11 18:10:54 1999
++++ bitmap.c	Thu Dec  2 20:41:29 1999
+@@ -1,5 +1,5 @@
+ #ifndef lint
+-static char *RCSid = "$Id: bitmap.c,v 1.2.2.2 1999/10/11 17:10:54 lhecking Exp $";
++static char *RCSid = "$Id: bitmap.c,v 1.2.2.3 1999/11/30 15:07:49 lhecking Exp $";
+ #endif
+ 
+ /* GNUPLOT - bitmap.c */
+@@ -846,8 +846,6 @@
+ }
+ 
+ 
+-/* Currently unused */
+-#if 1 /* HBB 991008: used by PNG, now */
+ /*
+  * get pixel (x,y) value
+  */
+@@ -857,7 +855,7 @@
+ {
+   register unsigned int row;
+   register unsigned char mask;
+-  register unsigned char value;
++  register unsigned char value = 0;
+   int i;
+ 
+   if (b_rastermode) {
+@@ -876,10 +874,10 @@
+ 		row -= b_psize;
+ 		value <<= 1;
+ 	}
+-    return(value);
+-  }
+-  else
+-  {
++/* HBB 991123: the missing '>>1' was the 'every second color' problem
++ * with PNG in 3.8a...*/
++	return(value>>1);
++  } else {
+ #ifdef BITMAPDEBUG
+     if (b_rastermode)
+       fprintf(stderr, "Warning: getpixel(%d,%d) out of bounds\n",
+@@ -890,7 +888,6 @@
+     return(0);
+   }
+ }
+-#endif /* 0 */
+ 
+ 
+ /*
+--- bitmap.h.ORIG	Wed Sep 29 14:48:16 1999
++++ bitmap.h	Thu Dec  2 20:41:29 1999
+@@ -1,4 +1,4 @@
+-/* $Id: bitmap.h,v 1.1.1.2.2.1 1999/09/29 13:48:16 lhecking Exp $ */
++/* $Id: bitmap.h,v 1.1.1.2.2.2 1999/11/30 15:07:49 lhecking Exp $ */
+ 
+ /* GNUPLOT - bitmap.h */
+ 
+@@ -101,7 +101,7 @@
+ void b_makebitmap __PROTO((unsigned int x, unsigned int y, unsigned int planes));
+ void b_freebitmap __PROTO((void));
+ void b_setpixel __PROTO((unsigned int x, unsigned int y, unsigned int value));
+-/* unused unsigned int b_getpixel __PROTO((unsigned int x, unsigned int y)); */
++unsigned int b_getpixel __PROTO((unsigned int x, unsigned int y));
+ void b_line __PROTO((unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2));
+ void b_setmaskpixel __PROTO((unsigned int x, unsigned int y, unsigned int value));
+ /* void b_putc __PROTO((unsigned int x, unsigned int y, char c, unsigned int angle)); */
+--- term/png.trm.ORIG	Tue Oct 19 14:31:28 1999
++++ term/png.trm	Thu Dec  2 20:42:20 1999
+@@ -1,5 +1,5 @@
+ /*
+- * $Id: png.trm,v 1.11.2.5 1999/10/19 13:31:28 lhecking Exp $
++ * $Id: png.trm,v 1.11.2.8 1999/11/30 15:08:44 lhecking Exp $
+  *
+  */
+ 
+@@ -42,8 +42,11 @@
+  *  png
+  *
+  * AUTHORS
+- *  Alexander Lehmann	original code,
+- *                      derived from pbm.trm by Russell Lang.
++ *  Alexander Lehmann
++ *                      derived from pbm.trm by Russell Lang
++ *
++ *  Eric S. Raymond    update for pnglib-1.0.3; transparency.
++ *  H.-B. Broeker      fixes to Eric's changes
+  *
+  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
+  *
+@@ -100,56 +103,97 @@
+ 
+ static int png_font = 1;	/* small font */
+ static int png_mode = 0;	/* 0:monochrome 1:gray 2:color */
++static int png_transparent = 0; /* generate transparent first color */
+ 
+ /* 7=black, 0=white */
+ static int png_gray[] = { 7, 1, 6, 5, 4, 3, 2, 1, 7 };	/* grays  */
+-/* bit3=!intensify, bit2=!red, bit1=!green, bit0=!blue */
+-static int png_color_table[] ={ 15, 8, 3, 5, 6, 4, 2, 1, 11, 13, 14 };	/* colors */
+-static png_color png_palette[16];
++static png_color png_palette[WEB_N_COLORS];
+ 
+ TERM_PUBLIC void
+ PNG_options()
+ {
+-    png_font = 1;	/* small */
+-    png_mode = 0;
++    unsigned short rgb_color[3];
++    int n_colors = 0;
++    char *string;
++    int i;
++
++    rgb_color[0] = 0;
++    rgb_color[1] = 0;
++    rgb_color[2] = 0;
++
++    png_font = 1; /* small */
++    png_mode = 2; /* color */
++    png_transparent = 0;       /* use opaque image background */
+ 
+     term_options[0] = NUL;
+ 
+     while (!END_OF_COMMAND) {
+-	if (almost_equals(c_token, "s$mall"))
+-	    png_font = 1;
+-	else if (almost_equals(c_token, "me$dium"))
+-	    png_font = 2;
+-	else if (almost_equals(c_token, "l$arge"))
+-	    png_font = 3;
+-	else if (almost_equals(c_token, "mo$nochrome"))
+-	    png_mode = 0;
+-	else if (almost_equals(c_token, "g$ray"))
+-	    png_mode = 1;
+-	else if (almost_equals(c_token, "c$olor")
+-		 || almost_equals(c_token, "c$olour"))
+-	    png_mode = 2;
+-	else {
+-	    /* reset to default, since term is already set */
+-	    png_font = 1;
+-	    png_mode = 0;
+-	    int_error("expecting: {small, medium, large}, or {monochrome, gray, color}", c_token);
+-	}
+-	c_token++;
++        if (almost_equals(c_token, "s$mall"))
++            png_font = 1;
++        else if (almost_equals(c_token, "me$dium"))
++            png_font = 2;
++        else if (almost_equals(c_token, "l$arge"))
++            png_font = 3;
++        else if (almost_equals(c_token, "mo$nochrome"))
++            png_mode = 0;
++        else if (almost_equals(c_token, "g$ray"))
++            png_mode = 1;
++        else if (almost_equals(c_token, "c$olor")
++                 || almost_equals(c_token, "c$olour"))
++            png_mode = 2;
++	else if (almost_equals(c_token, "t$ransparent"))
++	    png_transparent = 1;
++	else if (almost_equals(c_token, "not$ransparent"))
++	    png_transparent = 0;
++        else {
++            /* set color */
++            string = input_line + token[c_token].start_index;
++
++            if (string[0] == 'x') {
++                /* HBB 991123: read in as *shorts*, not ints! */
++                if (sscanf(string, "x%2hx%2hx%2hx", &rgb_color[0], &rgb_color[1], &rgb_color[2] ) != 3) {
++                    int_error("invalid color spec, must be xRRGGBB", c_token);
++                }
++            } else
++                int_error("expecting: {small, medium, large},[no]transparent, or {monochrome, gray, color, [xRRGGBB] }", c_token);
++
++            if (n_colors >= WEB_N_COLORS) {
++                int_warn("too many colors, ingoring", c_token);
++		/* Magic number abuse guards against
++		 * "> WEB_N_COLORS warning" scroll fests. */
++		if (!END_OF_COMMAND) {
++		    while (!END_OF_COMMAND)
++			++c_token; --c_token;
++		}
++            } else {
++                web_color_rgbs[n_colors].r = rgb_color[0];
++                web_color_rgbs[n_colors].g = rgb_color[1];
++                web_color_rgbs[n_colors].b = rgb_color[2];
++                n_colors++;
++            }
++        }
++        c_token++;
+     }
+ 
+     /* setup options string */
+ 
++    /* HBB 991008: moved this block to here, so 'transparent' gets
++     * printed out first. Don't print 'notransparent', for now, to
++     * protect older gnuplots. Scripts with 'transparent' in them
++     * won't work as wanted, with older versions, so put it here. */
++    if (png_transparent)
++	strcat(term_options, "transparent");
++
+     switch (png_font) {
+     case 3:
+-	strcat(term_options, "large");
++	strcat(term_options, " large");
+ 	break;
+     case 2:
+-	strcat(term_options, "medium");
++	strcat(term_options, " medium");
+ 	break;
+     case 1:
+     default:
+-	strcat(term_options, "small");
++	strcat(term_options, " small");
+ 	break;
+     }
+ 
+@@ -166,6 +210,13 @@
+ 	break;
+     }
+ 
++    for (i=0; i < n_colors ; i++ ) {
++	sprintf(term_options,"%s x%02x%02x%02x",
++		term_options,
++		web_color_rgbs[i].r,
++		web_color_rgbs[i].g,
++		web_color_rgbs[i].b);
++    }
+ }
+ 
+ 
+@@ -222,7 +273,7 @@
+ 
+     switch (png_mode) {
+     case 2:
+-	numplanes = 4;
++	numplanes = 8;
+ 	break;
+     case 1:
+ 	numplanes = 3;
+@@ -248,15 +299,15 @@
+ TERM_PUBLIC void
+ PNG_text()
+ {
+-    register int x, j, row;
+     png_structp png_ptr;
+     png_infop info_ptr;
+-    register int i, value;
+     png_bytep prow;
+-    int mask, plane1, plane2, plane3, plane4;
+-    int red, green, blue;
+     png_text pngtext, *pngtext_copy;
++    png_byte pal_trans[1];
+     char text[100];
++    register int x, i, j;
++/*    register int row, value; */
++/* int mask, plane1, plane2, plane3, plane4; */
+ 
+     png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+     if (!png_ptr) {
+@@ -275,6 +326,7 @@
+ 	b_freebitmap();
+ 	return;
+     }
++    memset(prow,0,sizeof(prow));
+     if (setjmp(png_ptr->jmpbuf)) {
+ 	png_destroy_write_struct(&png_ptr, &info_ptr);
+ 	free(prow);
+@@ -283,7 +335,7 @@
+     }
+ 
+ #ifdef __OLD_PNGLIB__
+-   /* deprecated and no longer necessary */        
++    /* deprecated and no longer necessary */ 
+     png_info_init(info_ptr);
+     png_write_init(png_ptr); */
+ #endif /* __OLD_PNGLIB__ */
+@@ -293,43 +345,48 @@
+     info_ptr->width = b_ysize;
+     info_ptr->height = b_xsize;
+ 
+-    info_ptr->bit_depth = png_mode == 0 ? 1 : 4;
++    info_ptr->bit_depth = png_mode == 0 ? 1 : 8;
+     info_ptr->color_type = png_mode == 2 ? PNG_COLOR_TYPE_PALETTE :
+ 	PNG_COLOR_TYPE_GRAY;
+     if (png_mode == 2) {
+ 	info_ptr->valid |= PNG_INFO_PLTE;
+ 	info_ptr->palette = png_palette;
+-	info_ptr->num_palette = 16;
++	info_ptr->num_palette = sizeof(png_palette)/sizeof(png_palette[0]);
+     }
+     if (png_mode != 0) {
+ 	info_ptr->valid |= PNG_INFO_sBIT;
+ 	if (png_mode == 1) {
+ 	    info_ptr->sig_bit.gray = 3;
+ 	    png_set_shift(png_ptr, &(info_ptr->sig_bit));
+-	} else {
+-	    info_ptr->sig_bit.red = 2;
+-	    info_ptr->sig_bit.green = 2;
+-	    info_ptr->sig_bit.blue = 2;
++	} 
++	else {
++	    /* HBB 991123: we're now using the full 8 bits per color
++	     * component... */
++	    info_ptr->sig_bit.red = 8;
++	    info_ptr->sig_bit.green = 8;
++	    info_ptr->sig_bit.blue = 8;
+ 	}
+     }
++
+     info_ptr->interlace_type = 0;
++
+     if (png_mode == 0)
+ 	png_set_invert_mono(png_ptr);
+ 
+-    if (png_mode == 2)
+-	for (i = 0; i < 16; i++) {
+-	    red = (i & 4) ? 1 : 3;
+-	    green = (i & 2) ? 1 : 3;
+-	    blue = (i & 1) ? 1 : 3;
+-	    if (i & 8) {
+-		red--;
+-		green--;
+-		blue--;
+-	    }
+-	    png_palette[i].red = red * 85;
+-	    png_palette[i].green = green * 85;
+-	    png_palette[i].blue = blue * 85;
++    if (png_mode == 2) {
++	if (png_transparent) {
++	    info_ptr->valid |= PNG_INFO_tRNS;
++	    info_ptr->num_trans = 1;
++	    pal_trans[0] = 0;
++	    info_ptr->trans=pal_trans;
+ 	}
++
++	for (i = 0; i < WEB_N_COLORS; i++) {
++	    png_palette[i].red = web_color_rgbs[i].r;
++	    png_palette[i].green = web_color_rgbs[i].g;
++	    png_palette[i].blue = web_color_rgbs[i].b;
++	}
++    }
+     sprintf(text, "gnuplot %sversion %s patchlevel %s",
+ 	    OS, version, patchlevel);
+ 
+@@ -339,6 +396,13 @@
+     pngtext.text_length = strlen(text);
+ 
+     pngtext_copy = malloc(sizeof(*pngtext_copy));
++    if (!pngtext_copy) {
++	png_destroy_write_struct(&png_ptr, &info_ptr);
++	free(prow);
++	b_freebitmap();
++	return;
++    }
++    memset(pngtext_copy,0,sizeof(pngtext_copy));
+     *pngtext_copy = pngtext;
+     info_ptr->num_text = 1;
+     info_ptr->text = pngtext_copy;
+@@ -353,6 +417,7 @@
+ 
+     /* dump bitmap in raster mode */
+     for (x = b_xsize - 1; x >= 0; x--) {
++#if 0
+ 	row = (b_ysize / 8) - 1;
+ 	for (j = row; j >= 0; j--) {
+ 	    mask = 0x80;
+@@ -382,10 +447,14 @@
+ 		if (png_mode == 1)
+ 		    value = 7 - value;
+ 
+-		prow[(row - j) * 8 + i] = (png_byte) value;
++		prow[(row - j) * 8 + i] = (png_byte) (value & 0xFF) ;
+ 		mask >>= 1;
+ 	    }
+ 	}
++#else
++	for (j=b_ysize - 1; j>= 0; j--)
++	    prow[j] = (png_byte)b_getpixel(j, x);
++#endif
+ 	png_write_rows(png_ptr, &prow, 1);
+     }
+ 
+@@ -395,16 +464,42 @@
+     b_freebitmap();
+ }
+ 
+-
++/* _linetype(lt)  Called to set the line type before text is displayed or
++ * line(s) plotted.  This procedure should select a pen color or line
++ * style if the device has these capabilities.  
++ * lt is an integer from -2 to 0 or greater.  
++ * An lt of -2 is used for the border of the plot.
++ * An lt of -1 is used for the X and Y axes.  
++ * lt 0 and upwards are used for plots 0 and upwards.
++ * If _linetype() is called with lt greater than the available line types, 
++ * it should map it to one of the available line types.
++ * Most drivers provide 9 different linetypes (lt is 0 to 8).
++ */
+ TERM_PUBLIC void
+ PNG_linetype(linetype)
+ int linetype;
+ {
+     switch (png_mode) {
++    /* HBB 991008: this once made the grid lines and axes (-1) look the
++     * same as the borders (-2). That's ugly, IMHO. GIF uses a
++     * dashed line, for this, but libpng doesn't seem able to do
++     * that. But a look into the palette turns up that color 2
++     * is grey, and is currently unused... Let's see: */
+     case 2:
+-	if (linetype >= 9)
+-	    linetype %= 9;
+-	b_setvalue(png_color_table[linetype + 2]);
++
++	if (linetype == -2)
++	    linetype = 1;
++	else if (linetype == -1)
++	    linetype = 2;
++
++	else {
++	    /* HBB 991008: moved the += 3 down, so colors 0, 1, 2 are
++	     * _not_ used by the regular plots, as it should be */
++	    if (linetype >= (WEB_N_COLORS - 3))
++		linetype %= (WEB_N_COLORS - 3);
++	    linetype += 3;
++	}
++	b_setvalue(linetype);
+ 	break;
+     case 1:
+ 	if (linetype >= 7)
+@@ -462,13 +557,26 @@
+ "?png",
+ " The `png` terminal driver supports Portable Network Graphics.  To compile it,",
+ " you will need  the third-party libraries \"libpng\" and \"zlib\"; both are",
+-" available at ftp://ftp.uu.net/graphics/png.  `png` has two options.",
++" available at http://www.cdrom.com/pub/png/.  `png` has four options.",
++"",
++" By default, the `png` terminal driver uses a shared Web-friendy palette.",
+ "",
+ " Syntax:",
+ "       set terminal png {small | medium | large}",
++"                        {transparent | notransparent}",
+ "                        {monochrome | gray | color}",
++"                        {<color0> <color1> <color2> ...}",
++"",
++" `transparent` instructs the driver to generate transparent PNGs.  The first",
++" color will be the transparent one.",
++"",
++" The defaults are small (fontsize) and color.  Default size of the output",
++" is 640*480 pixel. ",
+ "",
+-" The defaults are small (fontsize) and monochrome.  Default size of the output",
+-" is 640*480 pixel."
++" Each color must be of the form 'xrrggbb', where x is the literal character",
++" 'x' and 'rrggbb' are the red, green and blue components in hex.  For example,",
++" 'x00ff00' is green.  The background color is set first, then the border",
++" colors, then the X & Y axis colors, then the plotting colors.  The maximum",
++" number of colors that can be set is currently 99."
+ END_HELP(png)
+ #endif /* TERM_HELP */
diff --git a/math/gnuplot+/files/patch-xi b/math/gnuplot+/files/patch-xi
new file mode 100644
index 000000000000..d968ad7a165d
--- /dev/null
+++ b/math/gnuplot+/files/patch-xi
@@ -0,0 +1,2118 @@
+# hpgl.diff
+--- term/hpgl.trm.ORIG	Mon Dec 14 18:39:49 1998
++++ term/hpgl.trm	Fri Dec  3 18:32:34 1999
+@@ -35,7 +35,7 @@
+ ]*/
+ 
+ /*
+- * This file is included by ../term.c.
++ * This file is included by ../term.h.
+  *
+  * This terminal driver supports:
+  *  hpgl, hp7550, hp7580b, HP Laserjet III
+@@ -57,6 +57,17 @@
+  * Modified October 1995 Ian MacPhedran to simplify HPGL terminals
+  * Modified January 96 by David Denholm and Emmanuel Bigler for cp850
+  *                               and iso international character sets
++ * Modified February 99 by Jeremy Brenes to give PCL5 terminal optional
++ * multi-pen support (6 pen default), a default 34" plotting width for
++ * use with large color plotters such as the HP Designjet 750C,
++ * various alternative plot sizes, and variable fontsizes;
++ * Also decreased the HPGL terminal's fixed fontsize to make it more
++ * reasonable when plots get scaled to 34"
++ * Modified July 99 by Jeremy Brenes to make extended plot area smaller;
++ * added solid/dashed lines option, additional font types, mixed fonts
++ * Modified November 99 by Jeremy Brenes to add a postscript pointtypes
++ * option, special purpose negative pointtypes, and a pointsize function
++ *
+  */
+ #define HPGL
+ #define PCL
+@@ -96,13 +107,19 @@
+ /* TERM_PUBLIC void HPGL2_reset __PROTO((void)); */
+ TERM_PUBLIC void PCL_reset __PROTO((void));
+ TERM_PUBLIC int HPGL2_justify_text __PROTO((enum JUSTIFY just));
++TERM_PUBLIC int HPGL2_set_font __PROTO((char *font));
++TERM_PUBLIC void HPGL2_point __PROTO((unsigned int x, unsigned int y, int number));
++TERM_PUBLIC void HPGL2_neg_point __PROTO((unsigned int x, unsigned int y, int number));
++TERM_PUBLIC void HPGL2_pointsize __PROTO((double size));
+ #define GOT_HPGL_PROTO
+ #endif /* TERM_PROTO */
+ 
+ #ifndef TERM_PROTO_ONLY
+ #ifdef TERM_BODY
+ /*
+- * The maximum plot size, in plotter units:
++ * The maximum plot size, in plotter units.
++ * Note that the actual size of larger plots may be limited by
++ * available printer memory.
+  */
+ 
+ #define HPGL_PUPI	1016	/* Plotter units per inch */
+@@ -110,14 +127,20 @@
+ #define HPGL_XMAX_A	10000
+ #define HPGL_YMAX_A	7500
+ 
+-#define HPGL_XMAX_B	15200
+-#define HPGL_YMAX_B	10000
++#define HPGL_XMAX_B	13000
++#define HPGL_YMAX_B	7500
++
++#define HPGL_XMAX_C	45333
++#define HPGL_YMAX_C	34000
++
++#define HPGL_XMAX_D	52000
++#define HPGL_YMAX_D	34000
+ 
+ #define HPGL_XMAX	HPGL_XMAX_A
+ #define HPGL_YMAX	HPGL_YMAX_A
+ 
+-#define PCL_XMAX	HPGL_XMAX_A
+-#define PCL_YMAX	(HPGL_YMAX_A-60)
++#define PCL_XMAX	HPGL_XMAX_C
++#define PCL_YMAX	(HPGL_YMAX_C-60)
+ 
+ /*
+  * Tic sizes
+@@ -126,27 +149,40 @@
+ #define HPGL_VTIC	(HPGL_YMAX/70)
+ #define HPGL_HTIC	(HPGL_YMAX/70)
+ 
+-#define PCL_VTIC	(PCL_YMAX/70)
+-#define PCL_HTIC	(PCL_YMAX/70)
++#define PCL_VTIC	((HPGL_YMAX_C-60)/320)
++#define PCL_HTIC	((HPGL_YMAX_C-60)/320)
+ 
+ /*
+  * Font size for HPGL
+  */
+ 
+-#define HPGL_VCHAR	(HPGL_YMAX/100*32/10)	/* 3.2% */
+-#define HPGL_HCHAR	(HPGL_XMAX/100*12/10)	/* 1.2% */
++#define HPGL_VCHAR	(HPGL_YMAX/100*8/10)	/* 0.8% */
++#define HPGL_HCHAR	(HPGL_XMAX/100*3/10)	/* 0.3% */
+ 
+ /*
+  * Font size for HPGL/2
+  */
+ 
+-#define HPGL2_DEF_POINT	14	/* Height of font */
++#define HPGL2_DEF_POINT	12	/* Height of font */
+ 
+ #define HPGL2_DEF_PITCH	(3 * 72 / (HPGL2_DEF_POINT * 2))
+ #define HPGL2_VCHAR	((int) HPGL_PUPI * HPGL2_DEF_POINT / 72)
+ #define HPGL2_HCHAR	(HPGL2_VCHAR * 2 / 3)
+ 
+ /*
++ * Point size for HPGL/2
++ */
++
++static double HPGL2_psize = 1.0;	/* Default point size */
++
++/*
++ * Number of available pointtypes for HPGL/2
++ */
++
++#define  HPGL2_NUM_NOPSPOINTS 6;	/* for nopspoints option */
++#define  HPGL2_NUM_PSPOINTS 75;	/* for pspoints option */
++
++/*
+  * Control constants
+  */
+ 
+@@ -196,15 +232,27 @@
+ 
+ /*
+  * The default font goes first.  Although it is the ugliest,  the
+- * stick font is probably supported by the most devices, so it
+- * becomes the default.
++ * stick font is probably supported by the most devices.
+  */
+ 
+-static struct HPGL2_font_str GPFAR HPGL2_font_table[] =
+-{
++static struct HPGL2_font_str GPFAR HPGL2_font_table[] = {
+     {"u$nivers", "univers", 277, 1, 0.0, HPGL2_DEF_POINT, 0, 0, 4148},
+     {"s$tick", "stick", 277, 0, HPGL2_DEF_PITCH, 0.0, 0, 0, 48},
+-    {"c$g_times", "cg_times", 277, 1, 0.0, HPGL2_DEF_POINT, 0, 0, 4101}
++    {"cg_t$imes", "cg_times", 277, 1, 0.0, HPGL2_DEF_POINT, 0, 0, 4101},
++    {"z$apf_dingbats", "zapf_dingbats", 364, 1, 0.0, HPGL2_DEF_POINT, 0, 0, 4141},
++    {"an$tique_olive", "antique_olive", 277, 1, 0.0, HPGL2_DEF_POINT, 0, 0, 4168},
++    {"ar$ial", "arial", 277, 1, 0.0, HPGL2_DEF_POINT, 0, 0, 16602},
++    {"cou$rier", "courier", 277, 1, 0.0, HPGL2_DEF_POINT, 0, 0, 4099},
++    {"g$aramond_antigua", "garamond_antigua", 277, 1, 0.0, HPGL2_DEF_POINT, 0, 0, 4197},
++    {"l$etter_gothic", "letter_gothic", 277, 1, 0.0, HPGL2_DEF_POINT, 0, 0, 4102},
++    {"cg_o$mega", "cg_omega", 277, 1, 0.0, HPGL2_DEF_POINT, 0, 0, 4113},
++    {"al$bertus", "albertus", 277, 1, 0.0, HPGL2_DEF_POINT, 0, 1, 4362},
++    {"ti$mes_new_roman", "times_new_roman", 277, 1, 0.0, HPGL2_DEF_POINT, 0, 0, 16901},
++    {"cl$arendon", "clarendon", 277, 1, 0.0, HPGL2_DEF_POINT, 4, 3, 4140},
++    {"cor$onet", "coronet", 277, 1, 0.0, HPGL2_DEF_POINT, 1, 0, 4116},
++    {"m$arigold", "marigold", 277, 1, 0.0, HPGL2_DEF_POINT, 0, 0, 4297},
++    {"tr$uetype_symbols", "truetype_symbols", 621, 1, 0.0, HPGL2_DEF_POINT, 0, 0, 16686},
++    {"w$ingdings", "wingdings", 18540, 1, 0.0, HPGL2_DEF_POINT, 1, 0, 31402}
+ };
+ 
+ #define HPGL2_FONTS (sizeof(HPGL2_font_table) / sizeof (struct HPGL2_font_str))
+@@ -215,8 +263,7 @@
+  * most compatable with other HPGL devices.
+  */
+ 
+-static struct PCL_mode_str GPFAR PCL_mode_table[] =
+-{
++static struct PCL_mode_str GPFAR PCL_mode_table[] = {
+     {"l$andscape", "landscape", "\033&l1O", PCL_XMAX, PCL_YMAX},
+     {"p$ortrait", "portrait", "\033&l0O", PCL_YMAX, PCL_XMAX}
+ };
+@@ -225,19 +272,18 @@
+ static struct PCL_mode_str *PCL_mode = &PCL_mode_table[0];
+ 
+ /*
+- * Various line types and widths to distinguish data sets
++ * Various line types and widths to distinguish data sets in monochrome
+  */
+ 
+-static char *HPGL2_lt[] = { "", "4,2", "5,2", "6,2", "7,2", "8,2" },
+-	    *HPGL2_pw[] = { ".15", ".12", ".08" };
++static char *HPGL2_lt[] = { "", ",2", ",2", ",2", ",2", ",2", ",2", ",2" },
++	    *HPGL2_pw[] = { ".24", ".16", ".08"};
+ 
+ #define HPGL2_LINETYPES (sizeof(HPGL2_lt) / sizeof(char *))
+ #define HPGL2_PENWIDTHS (sizeof(HPGL2_pw) / sizeof(char *))
+ 
+ /* encoding vector for cp850 , characters 128 (0200) -> 255 (0377) */
+ 
+-static char hpgl_cp_850[128][4] =
+-{
++static char hpgl_cp_850[128][4] = {
+ 
+ /* 0200 */ "\0164\017",
+ /* 0201 */ "\016O\017",
+@@ -398,8 +444,7 @@
+ 
+ /* encoding vector for iso-8859-1 , characters 128 (0200) -> 255 (0377) */
+ 
+-static char hpgl_iso_8859_1[128][4] =
+-{
++static char hpgl_iso_8859_1[128][4] = {
+ 
+ /* 0200 */ "",
+ /* 0201 */ "",
+@@ -551,8 +596,8 @@
+  * Static variables to keep track of where we are, etc.
+  */
+ 
+-static int HPGL_ang = 0, HPGL_x = UNKNOWN, HPGL_y = UNKNOWN, HPGL_penstate = UNKNOWN, HPGL_pentype
+-= UNKNOWN, HPGL2_in_pe, HPGL2_lost;
++static int HPGL_ang = 0, HPGL_x = UNKNOWN, HPGL_y = UNKNOWN, HPGL_penstate = UNKNOWN, HPGL_pentype, HPGL2_pentype
++    = UNKNOWN, HPGL2_in_pe, HPGL2_lost;
+ 
+ /*
+  * The subroutines, grouped by function for different versions.
+@@ -560,7 +605,8 @@
+ 
+ static int HPGL_numpen, HPGL_eject;
+ 
+-TERM_PUBLIC void HPGL_options()
++TERM_PUBLIC void
++HPGL_options()
+ {
+     HPGL_numpen = 6;		/* default to six pens */
+     HPGL_eject = 0;		/* default to no eject */
+@@ -581,67 +627,156 @@
+     }
+ 
+ 
+-    sprintf(term_options, "%d pens %s", HPGL_numpen,
+-	    HPGL_eject ? "eject" : "noeject");
++    sprintf(term_options, "%d pens %s",
++	    HPGL_numpen, HPGL_eject ? "eject" : "noeject");
+ }
+ 
+-TERM_PUBLIC void HPGL2_options()
++static int HPGL2_color = 1, HPGL2_numpen = 6;	/* default to 6 pen color */
++int HPGL2_dashed = 0;		/* current dashed linetype */
++int HPGL2_solid = 1;		/* default to solid lines */
++int HPGL2_font_num = 0;		/* font from options */
++int HPGL2_font_num_current = 0;	/* current font */
++int pspointset = 0;		/* default to standard point types */
++double HPGL2_point_size = HPGL2_DEF_POINT;	/* pointsize from options */
++double HPGL2_point_size_current = 0;	/* current pointsize */
++
++TERM_PUBLIC void
++HPGL2_options()
+ {
+     struct termentry *t = term;
+     int i;
+-    double point_size;
+-    char tmp_options[MAX_ID_LEN];
+-    if (!END_OF_COMMAND) {
+-	for (i = 0; i < HPGL2_FONTS &&
+-	     !almost_equals(c_token, HPGL2_font_table[i].compare); i++);
+-	if (i < HPGL2_FONTS) {
+-	    HPGL2_font = &HPGL2_font_table[i];
++    char tmp_options[MAX_ID_LEN+1];
++
++    if (!END_OF_COMMAND && almost_equals(c_token, "mono$chrome")) {
++	HPGL2_color = 0;
++	c_token++;
++    } else if (!END_OF_COMMAND && almost_equals(c_token, "col$or")) {
++	HPGL2_color = 1;
++	c_token++;
++	if (!END_OF_COMMAND && isanumber(c_token)) {
++	    HPGL2_numpen = (int) real(&token[c_token].l_val);
++	    if (HPGL2_numpen <= 0) {
++		HPGL2_numpen = 6;
++		int_error("Number of pens must be a positive", c_token);
++	    }
++	    c_token++;
++	}
++    }
++    if (!END_OF_COMMAND && almost_equals(c_token, "sol$id")) {
++	HPGL2_solid = 1;
++	c_token++;
++    } else if (!END_OF_COMMAND && almost_equals(c_token, "das$hed")) {
++	HPGL2_solid = 0;
++	c_token++;
++    }
++    if (!END_OF_COMMAND && almost_equals(c_token, "f$ont")) {
++	c_token++;
++	if (!END_OF_COMMAND) {
++	    for (i = 0; i < HPGL2_FONTS && !almost_equals(c_token, HPGL2_font_table[i].compare); i++);
++	    if (i < HPGL2_FONTS) {
++		HPGL2_font = &HPGL2_font_table[i];
++		HPGL2_font_num = i;
++		HPGL2_font_num_current = HPGL2_font_num;
++	    } else
++		int_error
++		    ("expecting font: stick, cg_times, univers, zapf_dingbats, antique_olive,\narial, courier, garamond_antigua, letter_gothic, cg_omega, albertus,\ntimes_new_roman, clarendon, coronet, marigold, truetype_symbols, or wingdings",
++		     c_token);
++	    c_token++;
+ 	} else
+-	    int_error("expecting font: stick, cg_times, or univers", c_token);
++	    int_error
++		("expecting font: stick, cg_times, univers, zapf_dingbats, antique_olive,\narial, courier, garamond_antigua, letter_gothic, cg_omega, albertus,\ntimes_new_roman, clarendon, coronet, marigold, truetype_symbols, or wingdings",
++		 c_token);
++    }
++    if (!END_OF_COMMAND && almost_equals(c_token, "s$ize")) {
+ 	c_token++;
+ 	if (!END_OF_COMMAND) {
+-	    if ((point_size = real(&token[c_token].l_val)) > 0.0) {
+-		t->v_char = (int) HPGL_PUPI *point_size / 72;
++	    if ((HPGL2_point_size = real(&token[c_token].l_val)) > 0.0) {
++		HPGL2_point_size_current = HPGL2_point_size;
++		t->v_char = (int) HPGL_PUPI *HPGL2_point_size / 72;
+ 		t->h_char = t->v_char * 2 / 3;
+ 		if (HPGL2_font->spacing)
+-		    HPGL2_font->height = point_size;
++		    HPGL2_font->height = HPGL2_point_size;
+ 		else
+-		    HPGL2_font->pitch = 72 * 3 / (point_size * 2);
++		    HPGL2_font->pitch = 72 * 3 / (HPGL2_point_size * 2);
+ 	    } else
+-		int_error("expecting font point size: real number", c_token);
++		int_error("expecting point size: real number", c_token);
+ 	    c_token++;
+-	}
++	} else
++	    int_error("expecting point size: real number", c_token);
+     }
+-    sprintf(tmp_options, " %s", HPGL2_font->name);
++    if (!END_OF_COMMAND && almost_equals(c_token, "n$opspoints")) {
++	c_token++;
++	pspointset = 0;
++    } else if (!END_OF_COMMAND && almost_equals(c_token, "p$spoints")) {
++	c_token++;
++	pspointset = 1;
++    }
++    sprintf(tmp_options, "\ndisplay: %s", HPGL2_color ? "color" : "monochrome");
++    strcat(term_options, tmp_options);
++    if (HPGL2_color == 1) {
++	sprintf(tmp_options, "\npens: %d", HPGL2_numpen);
++	strcat(term_options, tmp_options);
++    }
++    sprintf(tmp_options, "\nlines: %s", HPGL2_solid ? "solid" : "dashed");
++    strcat(term_options, tmp_options);
++    sprintf(tmp_options, "\nfont: %s", HPGL2_font->name);
+     strcat(term_options, tmp_options);
+     if (HPGL2_font->spacing) {
+-	sprintf(tmp_options, " %f",
+-		HPGL2_font->height);
++	sprintf(tmp_options, "\nfont height: %f", HPGL2_font->height);
+ 	strcat(term_options, tmp_options);
+     } else {
+-	sprintf(tmp_options, " %f",
+-		HPGL2_font->pitch);
++	sprintf(tmp_options, "\nfont pitch: %f\n", HPGL2_font->pitch);
+ 	strcat(term_options, tmp_options);
+     }
++    sprintf(tmp_options, "\npoint types: %s", pspointset ? "pspoints" : "nopspoints");
++    strcat(term_options, tmp_options);
+ }
+ 
+-TERM_PUBLIC void PCL_options()
++char *PCL_dim = "noextended";	/* default plotting dimensions */
++
++TERM_PUBLIC void
++PCL_options()
+ {
+     int i;
+-    if (!END_OF_COMMAND) {
+-	for (i = 0; i < PCL_MODES &&
+-	     !almost_equals(c_token, PCL_mode_table[i].compare); i++);
+-	if (i < PCL_MODES)
+-	    PCL_mode = &PCL_mode_table[i];
+-	else
++    if (!END_OF_COMMAND && almost_equals(c_token, "m$ode")) {
++	c_token++;
++	if (!END_OF_COMMAND) {
++	    for (i = 0; i < PCL_MODES && !almost_equals(c_token, PCL_mode_table[i].compare); i++);
++	    if (i < PCL_MODES)
++		PCL_mode = &PCL_mode_table[i];
++	    else
++		int_error("expecting mode: portrait or landscape", c_token);
++	    c_token++;
++	} else
+ 	    int_error("expecting mode: portrait or landscape", c_token);
++    }
++    if (!END_OF_COMMAND && almost_equals(c_token, "ext$ended")) {
++	PCL_mode->xmax = (HPGL_XMAX_D);
++	PCL_mode->ymax = (HPGL_YMAX_D - 60);
++	PCL_dim = "extended";
++	c_token++;
++    } else if (!END_OF_COMMAND && almost_equals(c_token, "noext$ended")) {
++	PCL_mode->xmax = (HPGL_XMAX_C);
++	PCL_mode->ymax = (HPGL_YMAX_C - 60);
++	PCL_dim = "noextended";
++	c_token++;
++    } else if (!END_OF_COMMAND && almost_equals(c_token, "leg$al")) {
++	PCL_mode->xmax = (HPGL_XMAX_B);
++	PCL_mode->ymax = (HPGL_YMAX_B - 60);
++	PCL_dim = "legal";
++	c_token++;
++    } else if (!END_OF_COMMAND && almost_equals(c_token, "let$ter")) {
++	PCL_mode->xmax = (HPGL_XMAX_A);
++	PCL_mode->ymax = (HPGL_YMAX_A - 60);
++	PCL_dim = "letter";
+ 	c_token++;
+     }
+-    sprintf(term_options, " %s", PCL_mode->name);
++    sprintf(term_options, "\nmode: %s\ndimensions: %s", PCL_mode->name, PCL_dim);
+     HPGL2_options();
+ }
+ 
+-TERM_PUBLIC void HPGL_init()
++TERM_PUBLIC void
++HPGL_init()
+ {
+ }
+ 
+@@ -649,7 +784,8 @@
+ {
+ } */
+ 
+-TERM_PUBLIC void PCL_init()
++TERM_PUBLIC void
++PCL_init()
+ {
+     struct termentry *t = term;
+ /*
+@@ -659,9 +795,17 @@
+     fprintf(gpoutfile, "\033E\033&l1X%s\n", PCL_mode->command);
+     t->xmax = PCL_mode->xmax;
+     t->ymax = PCL_mode->ymax;
++/*
++ * Enter HPGL/2 graphics mode
++ * Necessary here to keep the first DI0,1DI1,0 orientation command from being
++ * printed as literal text on the page for some devices. Hopefully this
++ * workaround has no bad consequences elsewhere; omit this line if it does.
++ */
++    fputs("\033%0B", gpoutfile);
+ }
+ 
+-TERM_PUBLIC void HPGL_graphics()
++TERM_PUBLIC void
++HPGL_graphics()
+ {
+     fputs("\033.Y\n\033.I81;;17:\033.N;19:\033.M500:\n", gpoutfile);
+ /*	       1
+@@ -682,7 +826,8 @@
+     HPGL_ang = 0;
+ }
+ 
+-TERM_PUBLIC void HPGL2_graphics()
++TERM_PUBLIC void
++HPGL2_graphics()
+ {
+ /*
+  * IN - Initialize
+@@ -695,8 +840,22 @@
+ 	fprintf(gpoutfile, "4,%f,", HPGL2_font->height);
+     else
+ 	fprintf(gpoutfile, "3,%f,", HPGL2_font->pitch);
+-    fprintf(gpoutfile, "5,%d,6,%d,7,%d\n", HPGL2_font->posture,
+-	    HPGL2_font->stroke_weight, HPGL2_font->typeface);
++    fprintf(gpoutfile, "5,%d,6,%d,7,%d;SS;\n",
++	    HPGL2_font->posture, HPGL2_font->stroke_weight, HPGL2_font->typeface);
++/*
++ * Add a set of user-defined dashed linetypes if the dashed option is
++ * selected. Of course, the UL's below can be edited to user preference.
++ */
++    if (HPGL2_solid == 0) {
++	fprintf(gpoutfile, "UL1,100;\n");
++	fprintf(gpoutfile, "UL2,8,8,9,8,8,9,8,8,9,8,8,9;\n");
++	fprintf(gpoutfile, "UL3,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7;\n");
++	fprintf(gpoutfile, "UL4,5,5,5,10,5,5,5,10,5,5,5,10;\n");
++	fprintf(gpoutfile, "UL5,5,5,5,5,5,8,5,5,5,5,5,8,5,5,5,5,5,9;\n");
++	fprintf(gpoutfile, "UL6,8,8,0,9,8,8,0,9,8,8,0,9;\n");
++	fprintf(gpoutfile, "UL7,4,4,4,4,0,4,4,4,4,4,0,4,4,4,4,4,0,4;\n");
++	fprintf(gpoutfile, "UL8,6,6,6,6,6,6,0,6,6,6,6,6,6,6,0,6;\n");
++    }
+ /*
+  * Control variables
+  */
+@@ -706,7 +865,8 @@
+     HPGL_penstate = UP;		/* Pen is up */
+ }
+ 
+-TERM_PUBLIC void PCL_graphics()
++TERM_PUBLIC void
++PCL_graphics()
+ {
+ /*
+  * Enter HPGL/2 graphics mode
+@@ -715,7 +875,8 @@
+     HPGL2_graphics();
+ }
+ 
+-TERM_PUBLIC void HPGL_text()
++TERM_PUBLIC void
++HPGL_text()
+ {
+     if (HPGL_eject == 0) {
+ 	fputs("PUSP0;\033.Z\n\0", gpoutfile);
+@@ -737,7 +898,8 @@
+ }
+ 
+ #if 0				/* not used */
+-void HPGL2_text()
++void
++HPGL2_text()
+ {
+ /*
+  * If in Polyline Encoded command, leave Polyline Encoded command
+@@ -750,10 +912,12 @@
+  * Pen up, park pen
+  */
+     fputs("PUSP0;", gpoutfile);
++    HPGL_penstate = UP;
+ }
+ #endif
+ 
+-TERM_PUBLIC void PCL_text()
++TERM_PUBLIC void
++PCL_text()
+ {
+     if (HPGL2_in_pe) {
+ 	fputs(";\n", gpoutfile);
+@@ -765,7 +929,8 @@
+     fputs("\033%1A\033&l0H\n\0", gpoutfile);
+ }
+ 
+-TERM_PUBLIC void HPGL_linetype(linetype)
++TERM_PUBLIC void
++HPGL_linetype(linetype)
+ int linetype;
+ {
+ /* allow for set number of pens */
+@@ -778,7 +943,8 @@
+     }
+ }
+ 
+-TERM_PUBLIC void HPGL2_linetype(linetype)
++TERM_PUBLIC void
++HPGL2_linetype(linetype)
+ int linetype;
+ {
+ /*
+@@ -788,31 +954,57 @@
+ 	fputs(";\n", gpoutfile);
+ 	HPGL2_in_pe = 0;
+     }
+-/*
+- * Allow for lots of linetypes
+- */
+-    if (linetype >= 0)
+-	linetype = linetype % (HPGL2_LINETYPES * HPGL2_PENWIDTHS);
+-    if (linetype != HPGL_pentype) {
++/* allow for set number of pens for color displays */
++    if (HPGL2_color == 1) {
+ 	if (linetype >= 0) {
+-	    fprintf(gpoutfile, "PW%sLT%s",
+-		    HPGL2_pw[linetype / HPGL2_LINETYPES],
+-		    HPGL2_lt[linetype % HPGL2_LINETYPES]);
+-	} else if (linetype == -2)
+-/*
+- * Borders and tics
+- */
+-	    fprintf(gpoutfile, "PW.2LT");
+-	else if (linetype == -1)
+-/*
+- * Axes and grids
+- */
+-	    fprintf(gpoutfile, "PW.1LT1,.25");
+-	HPGL_pentype = linetype;
++	    if (HPGL2_solid == 0)
++		HPGL2_dashed = linetype % HPGL2_LINETYPES + 1;
++	    linetype = (linetype + 2) % HPGL2_numpen + 1;
++	}
++/* only select pen if necessary */
++	if (linetype != HPGL2_pentype) {
++	    if (linetype >= 0) {
++		if (HPGL2_solid == 0) {
++		    fprintf(gpoutfile, "PU;\nSP%d;\nLT%d;", linetype, HPGL2_dashed);
++		} else
++		    fprintf(gpoutfile, "PU;\nSP%d;\nLT;", linetype);
++/* Borders and Tics */
++	    } else if (linetype == -2) {
++		fprintf(gpoutfile, "PU;\nSP1;\nPW.2LT");
++/* Axes and Grids */
++	    } else if (linetype == -1)
++		fprintf(gpoutfile, "PU;\nSP1;\nPW.2LT1,.25");
++	    HPGL_penstate = UP;
++	    HPGL2_pentype = linetype;
++	}
++/* allow for lots of linetypes for monochrome displays */
++    } else {
++	if (linetype >= 0) {
++	    if (HPGL2_solid == 0)
++		HPGL2_dashed = linetype % HPGL2_LINETYPES + 1;
++	    linetype = linetype % (HPGL2_LINETYPES * HPGL2_PENWIDTHS);
++	}
++/* only select pen if necessary */
++	if (linetype != HPGL2_pentype) {
++	    if (linetype >= 0) {
++		if (HPGL2_solid == 0) {
++		    fprintf(gpoutfile, "PW%sLT%d%s", HPGL2_pw[linetype / HPGL2_LINETYPES], HPGL2_dashed,
++			    HPGL2_lt[linetype % HPGL2_LINETYPES]);
++		} else
++		    fprintf(gpoutfile, "PW%sLT", HPGL2_pw[linetype / HPGL2_LINETYPES]);
++/* Borders and Tics */
++	    } else if (linetype == -2) {
++		fprintf(gpoutfile, "PW.2LT");
++/* Axes and Grids */
++	    } else if (linetype == -1)
++		fprintf(gpoutfile, "PW.1LT1,.25");
++	    HPGL2_pentype = linetype;
++	}
+     }
+ }
+ 
+-TERM_PUBLIC void HPGL_put_text(x, y, str)
++TERM_PUBLIC void
++HPGL_put_text(x, y, str)
+ unsigned int x, y;
+ char *str;
+ {
+@@ -842,7 +1034,8 @@
+ 	fprintf(gpoutfile, "LB%s\003\n", str);
+ }
+ 
+-TERM_PUBLIC void HPGL2_put_text(x, y, str)
++TERM_PUBLIC void
++HPGL2_put_text(x, y, str)
+ unsigned int x, y;
+ char *str;
+ {
+@@ -867,12 +1060,14 @@
+     fprintf(gpoutfile, "LB%s\003\n", str);
+     HPGL2_lost = 1;
+ }
++
+ /*
+  * Some early HPGL plotters (e.g. HP7220C) require the
+  * Pen Up/Down and Pen (move) Absolute commands to be separate.
+  */
+ 
+-TERM_PUBLIC void HPGL_move(x, y)
++TERM_PUBLIC void
++HPGL_move(x, y)
+ unsigned int x, y;
+ {
+     if (HPGL_x != x || HPGL_y != y) {	/* only move if necessary */
+@@ -883,7 +1078,8 @@
+     }
+ }
+ 
+-TERM_PUBLIC void HPGL_vector(x, y)
++TERM_PUBLIC void
++HPGL_vector(x, y)
+ unsigned int x, y;
+ {
+     if (HPGL_penstate != DOWN) {
+@@ -895,7 +1091,8 @@
+     HPGL_y = y;
+ }
+ 
+-TERM_PUBLIC void HPGL2_move(x, y)
++TERM_PUBLIC void
++HPGL2_move(x, y)
+ unsigned int x, y;
+ {
+     register int dx, dy;
+@@ -931,7 +1128,8 @@
+     HPGL_y = y;
+ }
+ 
+-TERM_PUBLIC void HPGL2_vector(x, y)
++TERM_PUBLIC void
++HPGL2_vector(x, y)
+ unsigned int x, y;
+ {
+     register int dx, dy;
+@@ -977,7 +1175,8 @@
+  * Routine to encode position in base 32 or base 64 characters
+  */
+ 
+-TERM_PUBLIC void HPGL2_encode(d)
++TERM_PUBLIC void
++HPGL2_encode(d)
+ register int d;
+ {
+     register int c;
+@@ -993,7 +1192,8 @@
+     } while (d > 0);
+ }
+ 
+-TERM_PUBLIC int HPGL_text_angle(ang)
++TERM_PUBLIC int
++HPGL_text_angle(ang)
+ int ang;
+ {
+     HPGL_ang = ang;
+@@ -1010,7 +1210,8 @@
+     return TRUE;
+ }
+ 
+-TERM_PUBLIC int HPGL2_text_angle(ang)
++TERM_PUBLIC int
++HPGL2_text_angle(ang)
+ int ang;
+ {
+ /*
+@@ -1034,7 +1235,8 @@
+     return TRUE;
+ }
+ 
+-TERM_PUBLIC void HPGL_reset()
++TERM_PUBLIC void
++HPGL_reset()
+ {
+ /*
+  * do nothing
+@@ -1042,7 +1244,8 @@
+ }
+ 
+ #if 0
+-void HPGL2_reset()
++void
++HPGL2_reset()
+ {
+ /*
+  * Park the pen
+@@ -1054,7 +1257,8 @@
+ 
+ #endif
+ 
+-TERM_PUBLIC void PCL_reset()
++TERM_PUBLIC void
++PCL_reset()
+ {
+ /*
+  * Return to PCL mode
+@@ -1063,7 +1267,8 @@
+     fputs("\033%0A\033E\n", gpoutfile);
+ }
+ 
+-TERM_PUBLIC int HPGL2_justify_text(just)
++TERM_PUBLIC int
++HPGL2_justify_text(just)
+ enum JUSTIFY just;
+ {
+ /*
+@@ -1089,6 +1294,1285 @@
+     return 1;
+ }
+ 
++TERM_PUBLIC int
++HPGL2_set_font(font)
++char *font;
++{
++    struct termentry *t = term;
++    char name[MAX_ID_LEN+1];
++    int i, sep, int_size, sep2;
++    double size;
++/*
++ * If in Polyline Encoded command, leave Polyline Encoded command
++ */
++    if (HPGL2_in_pe) {
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++    }
++/* determine font, use default from options if invalid */
++    sep = strcspn(font, ",");
++    strncpy(name, font, sep);
++    name[sep] = NUL;
++    for (i = 0; i < HPGL2_FONTS; i++) {
++	sep2 = strcspn(HPGL2_font_table[i].compare, "$");
++	if (strncmp(name, HPGL2_font_table[i].compare, sep2) == 0)
++	    break;
++    }
++    if (i >= HPGL2_FONTS)
++	i = HPGL2_font_num;
++/* determine font size, use default from options if invalid */
++    sscanf(&(font[sep + 1]), "%d", &int_size);
++    if (int_size > 0) {
++	size = int_size;
++    } else
++	size = HPGL2_point_size;
++/* apply font changes only if necessary */
++    if (size == HPGL2_point_size_current && i == HPGL2_font_num_current)
++	return FALSE;
++    HPGL2_font = &HPGL2_font_table[i];
++    HPGL2_font_num_current = i;
++    HPGL2_point_size_current = size;
++    t->v_char = (int) HPGL_PUPI *HPGL2_point_size_current / 72;
++    t->h_char = t->v_char * 2 / 3;
++    fprintf(gpoutfile, "SD1,%d,2,%d,",
++	    HPGL2_font->symbol_set, HPGL2_font->spacing);
++    if (HPGL2_font->spacing) {
++	HPGL2_font->height = HPGL2_point_size_current;
++	fprintf(gpoutfile, "4,%f,", HPGL2_font->height);
++    } else {
++	HPGL2_font->pitch = 72 * 3 / (HPGL2_point_size_current * 2);
++	fprintf(gpoutfile, "3,%f,", HPGL2_font->pitch);
++    }
++    fprintf(gpoutfile, "5,%d,6,%d,7,%d;SS;\n",
++	    HPGL2_font->posture,
++	    HPGL2_font->stroke_weight, HPGL2_font->typeface);
++    return TRUE;
++}
++
++TERM_PUBLIC void
++HPGL2_point(x, y, number)
++unsigned int x, y;
++int number;
++{
++    int htic, vtic;
++    if (pspointset) {		/* postscript style points */
++	if (number < 0) {
++	    HPGL2_neg_point(x, y, number);
++	} else {
++	    htic = (int) (HPGL2_psize * PCL_HTIC / 2);
++	    vtic = (int) (HPGL2_psize * PCL_VTIC / 2);
++	    number %= HPGL2_NUM_PSPOINTS;
++	    switch (number) {
++	    case 0:		/* plus */
++		HPGL2_move(x - htic, y);
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x + htic, y);
++		HPGL2_move(x, y - vtic);
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x, y + vtic);
++		break;
++	    case 1:		/* X */
++		HPGL2_move(x - htic, y - vtic);
++		HPGL2_vector(x - htic, y - vtic);
++		HPGL2_vector(x + htic, y + vtic);
++		HPGL2_move(x - htic, y + vtic);
++		HPGL2_vector(x - htic, y + vtic);
++		HPGL2_vector(x + htic, y - vtic);
++		break;
++	    case 2:		/* star */
++		HPGL2_move(x - htic, y);
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x + htic, y);
++		HPGL2_move(x, y - vtic);
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x, y + vtic);
++		HPGL2_move(x - htic, y - vtic);
++		HPGL2_vector(x - htic, y - vtic);
++		HPGL2_vector(x + htic, y + vtic);
++		HPGL2_move(x - htic, y + vtic);
++		HPGL2_vector(x - htic, y + vtic);
++		HPGL2_vector(x + htic, y - vtic);
++		break;
++	    case 3:		/* hollow square 1 */
++		HPGL2_move(x - (3 * htic / 4), y - (3 * vtic / 4));
++		HPGL2_vector(x + (3 * htic / 4), y - (3 * vtic / 4));
++		HPGL2_vector(x + (3 * htic / 4), y + (3 * vtic / 4));
++		HPGL2_vector(x - (3 * htic / 4), y + (3 * vtic / 4));
++		HPGL2_vector(x - (3 * htic / 4), y - (3 * vtic / 4));
++		HPGL2_move(x, y);
++		HPGL2_vector(x, y);
++		break;
++	    case 4:		/* solid square 1 */
++		HPGL2_move(x - (3 * htic / 4), y - (3 * vtic / 4));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%.2f,%.2f;EP;\n", ((double) x + (3 * htic / 4)), ((double) y + (3 * vtic / 4)));
++		break;
++	    case 5:		/* hollow circle 1 */
++		HPGL2_move(x, y);
++		HPGL2_vector(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "CI%.2f;\n", ((double) 3 * (htic) / 4));
++		break;
++	    case 6:		/* solid circle 1 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%.2f,0,360;EP;\n", ((double) 3 * (htic) / 4));
++		break;
++	    case 7:		/* hollow triangle 1 */
++		HPGL2_move(x, y + (3 * vtic / 4));
++		HPGL2_vector(x - (3 * sqrt(3) * htic / 8), y - (3 * vtic / 8));
++		HPGL2_vector(x + (3 * sqrt(3) * htic / 8), y - (3 * vtic / 8));
++		HPGL2_vector(x, y + (3 * vtic / 4));
++		HPGL2_move(x, y);
++		HPGL2_vector(x, y);
++		break;
++	    case 8:		/* solid triangle 1 */
++		HPGL2_move(x, y + (3 * vtic / 4));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x - (3 * sqrt(3) * htic / 8), y - (3 * vtic / 8));
++		HPGL2_vector(x + (3 * sqrt(3) * htic / 8), y - (3 * vtic / 8));
++		HPGL2_vector(x, y + (3 * vtic / 4));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 9:		/* hollow triangle 2 */
++		HPGL2_move(x, y - (3 * vtic / 4));
++		HPGL2_vector(x - (3 * sqrt(3) * htic / 8), y + (3 * vtic / 8));
++		HPGL2_vector(x + (3 * sqrt(3) * htic / 8), y + (3 * vtic / 8));
++		HPGL2_vector(x, y - (3 * vtic / 4));
++		HPGL2_move(x, y);
++		HPGL2_vector(x, y);
++		break;
++	    case 10:		/* solid triangle 2 */
++		HPGL2_move(x, y - (3 * vtic / 4));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x - (3 * sqrt(3) * htic / 8), y + (3 * vtic / 8));
++		HPGL2_vector(x + (3 * sqrt(3) * htic / 8), y + (3 * vtic / 8));
++		HPGL2_vector(x, y - (3 * vtic / 4));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 11:		/* hollow diamond 1 */
++		HPGL2_move(x - (3 * htic / 4), y);
++		HPGL2_vector(x, y - (3 * vtic / 4));
++		HPGL2_vector(x + (3 * htic / 4), y);
++		HPGL2_vector(x, y + (3 * vtic / 4));
++		HPGL2_vector(x - (3 * htic / 4), y);
++		HPGL2_move(x, y);
++		HPGL2_vector(x, y);
++		break;
++	    case 12:		/* solid diamond 1 */
++		HPGL2_move(x - (3 * htic / 4), y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x, y - (3 * vtic / 4));
++		HPGL2_vector(x + (3 * htic / 4), y);
++		HPGL2_vector(x, y + (3 * vtic / 4));
++		HPGL2_vector(x - (3 * htic / 4), y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 13:		/* hollow pentagon 1 */
++		HPGL2_move(x, y + (3 * vtic / 4));
++		HPGL2_vector(x - (cos(.1 * acos(-1)) * 3 * htic / 4), y + (sin(.1 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x - (sin(.2 * acos(-1)) * 3 * htic / 4), y - (cos(.2 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x + (sin(.2 * acos(-1)) * 3 * htic / 4), y - (cos(.2 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x + (cos(.1 * acos(-1)) * 3 * htic / 4), y + (sin(.1 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x, y + (3 * vtic / 4));
++		HPGL2_move(x, y);
++		HPGL2_vector(x, y);
++		break;
++	    case 14:		/* solid pentagon */
++		HPGL2_move(x, y + (3 * vtic / 4));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x - (cos(.1 * acos(-1)) * 3 * htic / 4), y + (sin(.1 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x - (sin(.2 * acos(-1)) * 3 * htic / 4), y - (cos(.2 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x + (sin(.2 * acos(-1)) * 3 * htic / 4), y - (cos(.2 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x + (cos(.1 * acos(-1)) * 3 * htic / 4), y + (sin(.1 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x, y + (3 * vtic / 4));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 15:		/* hollow circle 2 */
++		HPGL2_move(x, y + vtic);
++		HPGL2_vector(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "CI%d;\n", htic);
++		break;
++	    case 16:		/* semisolid circle 1 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%d,0,90;EP;EW%d,90,270;\n", htic, htic);
++		break;
++	    case 17:		/* semisolid circle 2 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%d,90,90;EP;EW%d,180,270;\n", htic, htic);
++		break;
++	    case 18:		/* semisolid circle 3 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%d,0,180;EP;EW%d,180,180;\n", htic, htic);
++		break;
++	    case 19:		/* semisolid circle 4 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%d,180,90;EP;EW%d,270,270;\n", htic, htic);
++		break;
++	    case 20:		/* semisolid circle 5 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%d,0,90;EP;EW%d,90,90;WG%d,180,90;EP;EW%d,270,90;\n", htic, htic, htic, htic);
++		break;
++	    case 21:		/* semisolid circle 6 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%d,90,180;EP;EW%d,270,180;\n", htic, htic);
++		break;
++	    case 22:		/* semisolid circle 7 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%d,0,270;EP;EW%d,270,90;\n", htic, htic);
++		break;
++	    case 23:		/* semisolid circle 8 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%d,270,90;EP;EW%d,0,270;\n", htic, htic);
++		break;
++	    case 24:		/* semisolid circle 9 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%d,270,180;EP;EW%d,90,180;\n", htic, htic);
++		break;
++	    case 25:		/* semisolid circle 10 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%d,90,90;EP;EW%d,180,90;WG%d,270,90;EP;EW%d,0,90;\n", htic, htic, htic, htic);
++		break;
++	    case 26:		/* semisolid circle 11 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%d,270,270;EP;EW%d,180,90;\n", htic, htic);
++		break;
++	    case 27:		/* semisolid circle 12 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%d,180,180;EP;EW%d,0,180;\n", htic, htic);
++		break;
++	    case 28:		/* semisolid circle 13 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%d,180,270;EP;EW%d,90,90;\n", htic, htic);
++		break;
++	    case 29:		/* semisolid circle 14 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%d,90,270;EP;EW%d,0,90;\n", htic, htic);
++		break;
++	    case 30:		/* solid circle 2 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "WG%d,0,360;EP;\n", htic);
++		break;
++	    case 31:		/* hollow square 2 */
++		HPGL2_move(x - htic, y - vtic);
++		HPGL2_vector(x + htic, y - vtic);
++		HPGL2_vector(x + htic, y + vtic);
++		HPGL2_vector(x - htic, y + vtic);
++		HPGL2_vector(x - htic, y - vtic);
++		HPGL2_move(x, y + vtic);
++		HPGL2_vector(x, y);
++		break;
++	    case 32:		/* semisolid square 1 */
++		HPGL2_move(x, y + vtic);
++		HPGL2_vector(x - htic, y + vtic);
++		HPGL2_vector(x - htic, y - vtic);
++		HPGL2_vector(x + htic, y - vtic);
++		HPGL2_vector(x + htic, y);
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x + htic, y + vtic);
++		break;
++	    case 33:		/* semisolid square 2 */
++		HPGL2_move(x - htic, y);
++		HPGL2_vector(x - htic, y - vtic);
++		HPGL2_vector(x + htic, y - vtic);
++		HPGL2_vector(x + htic, y + vtic);
++		HPGL2_vector(x, y + vtic);
++		HPGL2_move(x - htic, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x, y + vtic);
++		break;
++	    case 34:		/* semisolid square 3 */
++		HPGL2_move(x - htic, y);
++		HPGL2_vector(x - htic, y - vtic);
++		HPGL2_vector(x + htic, y - vtic);
++		HPGL2_vector(x + htic, y);
++		HPGL2_move(x - htic, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x + htic, y + vtic);
++		break;
++	    case 35:		/* semisolid square 4 */
++		HPGL2_move(x, y - vtic);
++		HPGL2_vector(x + htic, y - vtic);
++		HPGL2_vector(x + htic, y + vtic);
++		HPGL2_vector(x - htic, y + vtic);
++		HPGL2_vector(x - htic, y);
++		HPGL2_move(x - htic, y - vtic);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x, y);
++		break;
++	    case 36:		/* semisolid square 5 */
++		HPGL2_move(x, y - vtic);
++		HPGL2_vector(x + htic, y - vtic);
++		HPGL2_vector(x + htic, y);
++		HPGL2_move(x, y + vtic);
++		HPGL2_vector(x - htic, y + vtic);
++		HPGL2_vector(x - htic, y);
++		HPGL2_move(x - htic, y - vtic);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x, y);
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x + htic, y + vtic);
++		break;
++	    case 37:		/* semisolid square 6 */
++		HPGL2_move(x, y - vtic);
++		HPGL2_vector(x + htic, y - vtic);
++		HPGL2_vector(x + htic, y + vtic);
++		HPGL2_vector(x, y + vtic);
++		HPGL2_move(x - htic, y - vtic);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x, y + vtic);
++		break;
++	    case 38:		/* semisolid square 7 */
++		HPGL2_move(x, y - vtic);
++		HPGL2_vector(x + htic, y - vtic);
++		HPGL2_vector(x + htic, y);
++		HPGL2_move(x - htic, y - vtic);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x, y + vtic);
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x + htic, y + vtic);
++		break;
++	    case 39:		/* semisolid square 8 */
++		HPGL2_move(x + htic, y);
++		HPGL2_vector(x + htic, y + vtic);
++		HPGL2_vector(x - htic, y + vtic);
++		HPGL2_vector(x - htic, y - vtic);
++		HPGL2_vector(x, y - vtic);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x + htic, y);
++		break;
++	    case 40:		/* semisolid square 9 */
++		HPGL2_move(x, y + vtic);
++		HPGL2_vector(x - htic, y + vtic);
++		HPGL2_vector(x - htic, y - vtic);
++		HPGL2_vector(x, y - vtic);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x + htic, y + vtic);
++		break;
++	    case 41:		/* semisolid square 10 */
++		HPGL2_move(x - htic, y);
++		HPGL2_vector(x - htic, y - vtic);
++		HPGL2_vector(x, y - vtic);
++		HPGL2_move(x + htic, y);
++		HPGL2_vector(x + htic, y + vtic);
++		HPGL2_vector(x, y + vtic);
++		HPGL2_move(x - htic, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x, y + vtic);
++		HPGL2_move(x, y - vtic);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x + htic, y);
++		break;
++	    case 42:		/* semisolid square 11 */
++		HPGL2_move(x - htic, y);
++		HPGL2_vector(x - htic, y - vtic);
++		HPGL2_vector(x, y - vtic);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x + htic, y + vtic);
++		HPGL2_move(x - htic, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x, y + vtic);
++		break;
++	    case 43:		/* semisolid square 12 */
++		HPGL2_move(x + htic, y);
++		HPGL2_vector(x + htic, y + vtic);
++		HPGL2_vector(x - htic, y + vtic);
++		HPGL2_vector(x - htic, y);
++		HPGL2_move(x - htic, y - vtic);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x + htic, y);
++		break;
++	    case 44:		/* semisolid square 13 */
++		HPGL2_move(x, y + vtic);
++		HPGL2_vector(x - htic, y + vtic);
++		HPGL2_vector(x - htic, y);
++		HPGL2_move(x - htic, y - vtic);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x + htic, y);
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x + htic, y + vtic);
++		break;
++	    case 45:		/* semisolid square 14 */
++		HPGL2_move(x + htic, y);
++		HPGL2_vector(x + htic, y + vtic);
++		HPGL2_vector(x, y + vtic);
++		HPGL2_move(x - htic, y - vtic);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x + htic, y);
++		HPGL2_move(x - htic, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x, y + vtic);
++		break;
++	    case 46:		/* solid square 2 */
++		HPGL2_move(x - htic, y - vtic);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "RA%d,%d;EP;\n", x + htic, y + vtic);
++		break;
++	    case 47:		/* hollow diamond 2 */
++		HPGL2_move(x - htic, y);
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x - htic, y);
++		HPGL2_move(x - (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x, y);
++		break;
++	    case 48:		/* semisolid diamond 1 */
++		HPGL2_move(x - (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x + (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x - (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x, y);
++		HPGL2_vector(x + (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 49:		/* semisolid diamond 2 */
++		HPGL2_move(x - (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x - (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x - (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x, y);
++		HPGL2_vector(x - (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 50:		/* semisolid diamond 3 */
++		HPGL2_move(x - (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x + (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x - (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x + (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 51:		/* semisolid diamond 4 */
++		HPGL2_move(x + (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x - (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x, y);
++		HPGL2_vector(x + (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x - (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 52:		/* semisolid diamond 5 */
++		HPGL2_move(x - (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x - (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x, y);
++		HPGL2_vector(x + (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x - (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		HPGL2_move(x + (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x + (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x - (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x, y);
++		HPGL2_vector(x + (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 53:		/* semisolid diamond 6 */
++		HPGL2_move(x + (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x - (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x + (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x - (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 54:		/* semisolid diamond 7 */
++		HPGL2_move(x + (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x + (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x + (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x, y);
++		HPGL2_vector(x + (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 55:		/* semisolid diamond 8 */
++		HPGL2_move(x + (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x + (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x, y);
++		HPGL2_vector(x + (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x + (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 56:		/* semisolid diamond 9 */
++		HPGL2_move(x - (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x + (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x - (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x + (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 57:		/* semisolid diamond 10 */
++		HPGL2_move(x + (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x - (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x, y);
++		HPGL2_vector(x - (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x - (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		HPGL2_move(x - (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x + (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x, y);
++		HPGL2_vector(x + (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x + (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 58:		/* semisolid diamond 11 */
++		HPGL2_move(x - (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x + (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x, y);
++		HPGL2_vector(x - (htic / 2), y - (vtic / 2));
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x + (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 59:		/* semisolid diamond 12 */
++		HPGL2_move(x + (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x - (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x + (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x - (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 60:		/* semisolid diamond 13 */
++		HPGL2_move(x - (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x - (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x - (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x, y);
++		HPGL2_vector(x - (htic / 2), y - (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 61:		/* semisolid diamond 14 */
++		HPGL2_move(x + (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x - (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x + (htic / 2), y + (vtic / 2));
++		HPGL2_vector(x, y);
++		HPGL2_vector(x - (htic / 2), y + (vtic / 2));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 62:		/* solid diamond 2 */
++		HPGL2_move(x - htic, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x - htic, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FP;EP;\n");
++		break;
++	    case 63:		/* hollow square 3 */
++		HPGL2_move(x - (3 * htic / 4), y - (3 * vtic / 4));
++		HPGL2_vector(x + (3 * htic / 4), y - (3 * vtic / 4));
++		HPGL2_vector(x + (3 * htic / 4), y + (3 * vtic / 4));
++		HPGL2_vector(x - (3 * htic / 4), y + (3 * vtic / 4));
++		HPGL2_vector(x - (3 * htic / 4), y - (3 * vtic / 4));
++		break;
++	    case 64:		/* hollow circle 3 */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "CI%.2f;\n", ((double) 3 * (htic) / 4));
++		break;
++	    case 65:		/* hollow triangle 3 */
++		HPGL2_move(x, y + (3 * vtic / 4));
++		HPGL2_vector(x - (3 * sqrt(3) * htic / 8), y - (3 * vtic / 8));
++		HPGL2_vector(x + (3 * sqrt(3) * htic / 8), y - (3 * vtic / 8));
++		HPGL2_vector(x, y + (3 * vtic / 4));
++		break;
++	    case 66:		/* hollow triangle 4 */
++		HPGL2_move(x, y - (3 * vtic / 4));
++		HPGL2_vector(x - (3 * sqrt(3) * htic / 8), y + (3 * vtic / 8));
++		HPGL2_vector(x + (3 * sqrt(3) * htic / 8), y + (3 * vtic / 8));
++		HPGL2_vector(x, y - (3 * vtic / 4));
++		break;
++	    case 67:		/* hollow diamond 3 */
++		HPGL2_move(x - (3 * htic / 4), y);
++		HPGL2_vector(x, y - (3 * vtic / 4));
++		HPGL2_vector(x + (3 * htic / 4), y);
++		HPGL2_vector(x, y + (3 * vtic / 4));
++		HPGL2_vector(x - (3 * htic / 4), y);
++		break;
++	    case 68:		/* hollow pentagon 2 */
++		HPGL2_move(x, y + (3 * vtic / 4));
++		HPGL2_vector(x - (cos(.1 * acos(-1)) * 3 * htic / 4), y + (sin(.1 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x - (sin(.2 * acos(-1)) * 3 * htic / 4), y - (cos(.2 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x + (sin(.2 * acos(-1)) * 3 * htic / 4), y - (cos(.2 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x + (cos(.1 * acos(-1)) * 3 * htic / 4), y + (sin(.1 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x, y + (3 * vtic / 4));
++		break;
++	    case 69:		/* opaque square */
++		HPGL2_move(x - htic, y - vtic);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "FT10,30;RA%d,%d;EP;FT;\n", x + (3 * htic / 4), y + (3 * vtic / 4));
++		break;
++	    case 70:		/* opaque circle */
++		HPGL2_move(x, y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "FT10,30;WG%.2f,0,360;EP;FT;\n", ((double) 3 * (htic) / 4));
++		break;
++	    case 71:		/* opaque triangle 1 */
++		HPGL2_move(x, y + (3 * vtic / 4));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x - (3 * sqrt(3) * htic / 8), y - (3 * vtic / 8));
++		HPGL2_vector(x + (3 * sqrt(3) * htic / 8), y - (3 * vtic / 8));
++		HPGL2_vector(x, y + (3 * vtic / 4));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FT10,30;FP;EP;FT;\n");
++		break;
++	    case 72:		/* opaque triangle 2 */
++		HPGL2_move(x, y - (3 * vtic / 4));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x - (3 * sqrt(3) * htic / 8), y + (3 * vtic / 8));
++		HPGL2_vector(x + (3 * sqrt(3) * htic / 8), y + (3 * vtic / 8));
++		HPGL2_vector(x, y - (3 * vtic / 4));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FT10,30;FP;EP;FT;\n");
++		break;
++	    case 73:		/* opaque diamond */
++		HPGL2_move(x - (3 * htic / 4), y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x, y - (3 * vtic / 4));
++		HPGL2_vector(x + (3 * htic / 4), y);
++		HPGL2_vector(x, y + (3 * vtic / 4));
++		HPGL2_vector(x - (3 * htic / 4), y);
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FT10,30;FP;EP;FT;\n");
++		break;
++	    case 74:		/* opaque pentagon */
++		HPGL2_move(x, y + (3 * vtic / 4));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM0;\n");
++		HPGL2_vector(x - (cos(.1 * acos(-1)) * 3 * htic / 4), y + (sin(.1 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x - (sin(.2 * acos(-1)) * 3 * htic / 4), y - (cos(.2 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x + (sin(.2 * acos(-1)) * 3 * htic / 4), y - (cos(.2 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x + (cos(.1 * acos(-1)) * 3 * htic / 4), y + (sin(.1 * acos(-1)) * 3 * vtic / 4));
++		HPGL2_vector(x, y + (3 * vtic / 4));
++		fputs(";\n", gpoutfile);
++		HPGL2_in_pe = 0;
++		fprintf(gpoutfile, "PM2;FT10,30;FP;EP;FT;\n");
++		break;
++	    }
++	}
++    } else {			/* default style points */
++	if (number < 0) {
++	    HPGL2_neg_point(x, y, number);
++	} else {
++	    htic = (int) (HPGL2_psize * PCL_HTIC / 2);
++	    vtic = (int) (HPGL2_psize * PCL_VTIC / 2);
++	    number %= HPGL2_NUM_NOPSPOINTS;
++	    switch (number) {
++	    case 0:		/* diamond */
++		HPGL2_move(x - htic, y);
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x + htic, y);
++		HPGL2_vector(x, y + vtic);
++		HPGL2_vector(x - htic, y);
++		HPGL2_move(x, y);
++		HPGL2_vector(x, y);
++		break;
++	    case 1:		/* plus */
++		HPGL2_move(x - htic, y);
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x + htic, y);
++		HPGL2_move(x, y - vtic);
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x, y + vtic);
++		break;
++	    case 2:		/* box */
++		HPGL2_move(x - htic, y - vtic);
++		HPGL2_vector(x - htic, y - vtic);
++		HPGL2_vector(x + htic, y - vtic);
++		HPGL2_vector(x + htic, y + vtic);
++		HPGL2_vector(x - htic, y + vtic);
++		HPGL2_vector(x - htic, y - vtic);
++		HPGL2_move(x, y);
++		HPGL2_vector(x, y);
++		break;
++	    case 3:		/* X */
++		HPGL2_move(x - htic, y - vtic);
++		HPGL2_vector(x - htic, y - vtic);
++		HPGL2_vector(x + htic, y + vtic);
++		HPGL2_move(x - htic, y + vtic);
++		HPGL2_vector(x - htic, y + vtic);
++		HPGL2_vector(x + htic, y - vtic);
++		break;
++	    case 4:		/* triangle */
++		HPGL2_move(x, y + (4 * vtic / 3));
++		HPGL2_vector(x - (4 * htic / 3), y - (2 * vtic / 3));
++		HPGL2_vector(x + (4 * htic / 3), y - (2 * vtic / 3));
++		HPGL2_vector(x, y + (4 * vtic / 3));
++		HPGL2_move(x, y);
++		HPGL2_vector(x, y);
++		break;
++	    case 5:		/* star */
++		HPGL2_move(x - htic, y);
++		HPGL2_vector(x - htic, y);
++		HPGL2_vector(x + htic, y);
++		HPGL2_move(x, y - vtic);
++		HPGL2_vector(x, y - vtic);
++		HPGL2_vector(x, y + vtic);
++		HPGL2_move(x - htic, y - vtic);
++		HPGL2_vector(x - htic, y - vtic);
++		HPGL2_vector(x + htic, y + vtic);
++		HPGL2_move(x - htic, y + vtic);
++		HPGL2_vector(x - htic, y + vtic);
++		HPGL2_vector(x + htic, y - vtic);
++		break;
++	    }
++	}
++    }
++}
++
++/*
++ * This is for special purpose negative point types. If they are not needed,
++ * they should be safely ignorable, but the special pointypes can be omitted
++ * if necessary, leaving only the dot (which is -1).
++ */
++
++TERM_PUBLIC void
++HPGL2_neg_point(x, y, number)
++unsigned int x, y;
++int number;
++{
++    int htic, vtic;
++    htic = (int) (HPGL2_psize * PCL_HTIC / 2);
++    vtic = (int) (HPGL2_psize * PCL_VTIC / 2);
++    switch (number) {
++    case -20:			/* well 18 */
++	HPGL2_move(x - htic, y - vtic);
++	HPGL2_vector(x + htic, y + vtic);
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "CI%.2f;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -19:			/* well 17 */
++	HPGL2_move(x, y - vtic);
++	HPGL2_vector(x, y - (vtic / 2));
++	HPGL2_move(x, y + (vtic / 2));
++	HPGL2_vector(x, y + vtic);
++	HPGL2_move(x, y - vtic);
++	HPGL2_vector(x - (htic / 4), y - (3 * vtic / 4));
++	HPGL2_move(x, y - vtic);
++	HPGL2_vector(x + (htic / 4), y - (3 * vtic / 4));
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "CI%.2f;\n", ((double) (htic) / 2));
++	break;
++    case -18:			/* well 16 */
++	HPGL2_move(x - htic, y);
++	HPGL2_vector(x + htic, y);
++	HPGL2_move(x, y - vtic);
++	HPGL2_vector(x, y + vtic);
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "CI%.2f;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -17:			/* well 15 */
++	HPGL2_move(x - htic, y - vtic);
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y - (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x + (sqrt(2) * htic / 2), y - (sqrt(2) * vtic / 2));
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y - (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x + htic, y + vtic);
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - htic, y);
++	HPGL2_vector(x - (3 * htic / 4), y);
++	HPGL2_move(x + (3 * htic / 4), y);
++	HPGL2_vector(x + htic, y);
++	HPGL2_move(x, y - vtic);
++	HPGL2_vector(x, y - (3 * vtic / 4));
++	HPGL2_move(x, y + (3 * vtic / 4));
++	HPGL2_vector(x, y + vtic);
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "EW%.2f,0,180;\n", ((double) 3 * (htic) / 4));
++	fprintf(gpoutfile, "WG%.2f,180,180;EP;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -16:			/* well 14 */
++	HPGL2_move(x - htic, y - vtic);
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y - (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x + htic, y + vtic);
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - htic, y);
++	HPGL2_vector(x - (3 * htic / 4), y);
++	HPGL2_move(x + (3 * htic / 4), y);
++	HPGL2_vector(x + htic, y);
++	HPGL2_move(x, y + (3 * vtic / 4));
++	HPGL2_vector(x, y + vtic);
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "WG%.2f,0,360;EP;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -15:			/* well 13 */
++	HPGL2_move(x - htic, y - vtic);
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y - (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x + (sqrt(2) * htic / 2), y - (sqrt(2) * vtic / 2));
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y - (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x + htic, y + vtic);
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - htic, y);
++	HPGL2_vector(x - (3 * htic / 4), y);
++	HPGL2_move(x + (3 * htic / 4), y);
++	HPGL2_vector(x + htic, y);
++	HPGL2_move(x, y - vtic);
++	HPGL2_vector(x, y - (3 * vtic / 4));
++	HPGL2_move(x, y + (3 * vtic / 4));
++	HPGL2_vector(x, y + vtic);
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "WG%.2f,0,360;EP;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -14:			/* well 12 */
++	HPGL2_move(x - htic, y - vtic);
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y - (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x + (sqrt(2) * htic / 2), y - (sqrt(2) * vtic / 2));
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y - (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x + htic, y + vtic);
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - htic, y);
++	HPGL2_vector(x - (3 * htic / 4), y);
++	HPGL2_move(x + (3 * htic / 4), y);
++	HPGL2_vector(x + htic, y);
++	HPGL2_move(x, y - vtic);
++	HPGL2_vector(x, y - (3 * vtic / 4));
++	HPGL2_move(x, y + (3 * vtic / 4));
++	HPGL2_vector(x, y + vtic);
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "CI%.2f;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -13:			/* well 11 */
++	HPGL2_move(x - htic, y - vtic);
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y - (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x + htic, y + vtic);
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "WG%.2f,0,360;EP;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -12:			/* well 10 */
++	HPGL2_move(x + (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - htic, y);
++	HPGL2_vector(x - (3 * htic / 4), y);
++	HPGL2_move(x + (3 * htic / 4), y);
++	HPGL2_vector(x + htic, y);
++	HPGL2_move(x, y - vtic);
++	HPGL2_vector(x, y - (3 * vtic / 4));
++	HPGL2_move(x, y + (3 * vtic / 4));
++	HPGL2_vector(x, y + vtic);
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "EW%.2f,0,180;\n", ((double) 3 * (htic) / 4));
++	fprintf(gpoutfile, "WG%.2f,180,180;EP;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -11:			/* well 9 */
++	HPGL2_move(x + (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - htic, y);
++	HPGL2_vector(x - (3 * htic / 4), y);
++	HPGL2_move(x + (3 * htic / 4), y);
++	HPGL2_vector(x + htic, y);
++	HPGL2_move(x, y - vtic);
++	HPGL2_vector(x, y - (3 * vtic / 4));
++	HPGL2_move(x, y + (3 * vtic / 4));
++	HPGL2_vector(x, y + vtic);
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "CI%.2f;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -10:			/* well 8 */
++	HPGL2_move(x - htic, y);
++	HPGL2_vector(x - (3 * htic / 4), y);
++	HPGL2_move(x + (3 * htic / 4), y);
++	HPGL2_vector(x + htic, y);
++	HPGL2_move(x, y - vtic);
++	HPGL2_vector(x, y - (3 * vtic / 4));
++	HPGL2_move(x, y + (3 * vtic / 4));
++	HPGL2_vector(x, y + vtic);
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "EW%.2f,0,180;\n", ((double) 3 * (htic) / 4));
++	fprintf(gpoutfile, "WG%.2f,180,180;EP;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -9:			/* well 7 */
++	HPGL2_move(x - (sqrt(2) * htic / 2), y - (sqrt(2) * vtic / 2));
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y - (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x + (sqrt(2) * htic / 2), y - (sqrt(2) * vtic / 2));
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y - (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x + (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - htic, y);
++	HPGL2_vector(x - (3 * htic / 4), y);
++	HPGL2_move(x + (3 * htic / 4), y);
++	HPGL2_vector(x + htic, y);
++	HPGL2_move(x, y - vtic);
++	HPGL2_vector(x, y - (3 * vtic / 4));
++	HPGL2_move(x, y + (3 * vtic / 4));
++	HPGL2_vector(x, y + vtic);
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "EW%.2f,0,180;\n", ((double) 3 * (htic) / 4));
++	fprintf(gpoutfile, "WG%.2f,180,180;EP;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -8:			/* well 6 */
++	HPGL2_move(x + (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - htic, y);
++	HPGL2_vector(x - (3 * htic / 4), y);
++	HPGL2_move(x + (3 * htic / 4), y);
++	HPGL2_vector(x + htic, y);
++	HPGL2_move(x, y + (3 * vtic / 4));
++	HPGL2_vector(x, y + vtic);
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "WG%.2f,0,360;EP;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -7:			/* well 5 */
++	HPGL2_move(x - (sqrt(2) * htic / 2), y - (sqrt(2) * vtic / 2));
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y - (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x + (sqrt(2) * htic / 2), y - (sqrt(2) * vtic / 2));
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y - (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x + (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - htic, y);
++	HPGL2_vector(x - (3 * htic / 4), y);
++	HPGL2_move(x + (3 * htic / 4), y);
++	HPGL2_vector(x + htic, y);
++	HPGL2_move(x, y - vtic);
++	HPGL2_vector(x, y - (3 * vtic / 4));
++	HPGL2_move(x, y + (3 * vtic / 4));
++	HPGL2_vector(x, y + vtic);
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "WG%.2f,0,360;EP;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -6:			/* well 4 */
++	HPGL2_move(x - (sqrt(2) * htic / 2), y - (sqrt(2) * vtic / 2));
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y - (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x + (sqrt(2) * htic / 2), y - (sqrt(2) * vtic / 2));
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y - (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x + (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x + (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - (sqrt(2) * htic / 2), y + (sqrt(2) * vtic / 2));
++	HPGL2_vector(x - (3 * sqrt(2) * htic / 8), y + (3 * sqrt(2) * vtic / 8));
++	HPGL2_move(x - htic, y);
++	HPGL2_vector(x - (3 * htic / 4), y);
++	HPGL2_move(x + (3 * htic / 4), y);
++	HPGL2_vector(x + htic, y);
++	HPGL2_move(x, y - vtic);
++	HPGL2_vector(x, y - (3 * vtic / 4));
++	HPGL2_move(x, y + (3 * vtic / 4));
++	HPGL2_vector(x, y + vtic);
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "CI%.2f;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -5:			/* well 3 */
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "WG%.2f,0,360;EP;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -4:			/* well 2 */
++	HPGL2_move(x - htic, y);
++	HPGL2_vector(x - (3 * htic / 4), y);
++	HPGL2_move(x + (3 * htic / 4), y);
++	HPGL2_vector(x + htic, y);
++	HPGL2_move(x, y - vtic);
++	HPGL2_vector(x, y - (3 * vtic / 4));
++	HPGL2_move(x, y + (3 * vtic / 4));
++	HPGL2_vector(x, y + vtic);
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "CI%.2f;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -3:			/* well 1 */
++	HPGL2_move(x, y);
++	fputs(";\n", gpoutfile);
++	HPGL2_in_pe = 0;
++	fprintf(gpoutfile, "CI%.2f;\n", ((double) 3 * (htic) / 4));
++	break;
++    case -2:			/* v box */
++	HPGL2_move(x - htic, y);
++	HPGL2_vector(x - (3 * htic / 4), y);
++	HPGL2_move(x + (3 * htic / 4), y);
++	HPGL2_vector(x + htic, y);
++	HPGL2_move(x, y - vtic);
++	HPGL2_vector(x, y - (3 * vtic / 4));
++	HPGL2_move(x, y + (3 * vtic / 4));
++	HPGL2_vector(x, y + vtic);
++	HPGL2_move(x - (3 * htic / 4), y - (3 * vtic / 4));
++	HPGL2_vector(x + (3 * htic / 4), y - (3 * vtic / 4));
++	HPGL2_vector(x + (3 * htic / 4), y + (3 * vtic / 4));
++	HPGL2_vector(x - (3 * htic / 4), y + (3 * vtic / 4));
++	HPGL2_vector(x - (3 * htic / 4), y - (3 * vtic / 4));
++	HPGL2_move(x - (htic / 2), y + (vtic / 2));
++	HPGL2_vector(x, y - (vtic / 2));
++	HPGL2_vector(x + (htic / 2), y + (vtic / 2));
++	break;
++    default:			/* dot */
++	HPGL2_move(x, y);
++	HPGL2_vector(x, y);
++	break;
++	return;
++    }
++}
++
++TERM_PUBLIC void
++HPGL2_pointsize(size)
++double size;
++{
++    HPGL2_psize = (size >= 0 ? size : 1);
++}
++
+ #endif /* TERM_BODY */
+ 
+ #ifdef TERM_TABLE
+@@ -1100,25 +2584,21 @@
+     HPGL_linetype, HPGL_put_text, HPGL_text_angle,
+     null_justify_text, do_point, do_arrow, set_font_null
+ TERM_TABLE_END(hpgl_driver)
+-
+ #undef LAST_TERM
+ #define LAST_TERM hpgl_driver
+-
+     TERM_TABLE_START(pcl5_driver)
+-    "pcl5", "HP LaserJet III [mode] [font] [point]",
++    "pcl5", "HP Designjet 750C, HP Laserjet III/IV, etc. (many options)",
+     PCL_XMAX, PCL_YMAX, HPGL2_VCHAR, HPGL2_HCHAR,
+     PCL_VTIC, PCL_HTIC, PCL_options, PCL_init, PCL_reset,
+     PCL_text, null_scale, PCL_graphics, HPGL2_move, HPGL2_vector,
+     HPGL2_linetype, HPGL2_put_text, HPGL2_text_angle,
+-    HPGL2_justify_text, do_point, do_arrow, set_font_null
++    HPGL2_justify_text, HPGL2_point, do_arrow, HPGL2_set_font,
++    HPGL2_pointsize
+ TERM_TABLE_END(pcl5_driver)
+-
+ #undef LAST_TERM
+ #define LAST_TERM pcl5_driver
+ #endif /* TERM_TABLE */
+-
+ #endif /* TERM_PROTO_ONLY */
+-
+ #ifdef TERM_HELP
+ START_HELP(hpgl)
+ "1 hpgl",
+@@ -1135,9 +2615,9 @@
+ "?term pcl5",
+ "?pcl5",
+ " The `hpgl` driver produces HPGL output for devices like the HP7475A plotter.",
+-" There are two options which can be set---the number of pens and \"eject\", which",
+-" tells the plotter to eject a page when done.  The default is to use 6 pens",
+-" and not to eject the page when done.",
++" There are two options which can be set: the number of pens and `eject`,",
++" which tells the plotter to eject a page when done.  The default is to use 6",
++" pens and not to eject the page when done.",
+ "",
+ " The international character sets ISO-8859-1 and CP850 are recognized via",
+ " `set encoding iso_8859_1` or `set encoding cp850` (see `set encoding` for",
+@@ -1156,15 +2636,42 @@
+ "",
+ " is equivalent to the previous `hp7580b` terminal.",
+ "",
+-" The `pcl5` driver supports the Hewlett-Packard Laserjet III.  It actually uses",
+-" HPGL-2, but there is a name conflict among the terminal devices.  It has",
+-" several options",
++" The `pcl5` driver supports plotters such as the Hewlett-Packard Designjet",
++" 750C, the Hewlett-Packard Laserjet III, and the Hewlett-Packard Laserjet IV.",
++" It actually uses HPGL-2, but there is a name conflict among the terminal",
++" devices.  It has several options which must be specified in the order",
++" indicated below:",
+ "",
+ " Syntax:",
+-"       set terminal pcl5 {<mode>} {<font>} {<fontsize>}",
++"       set terminal pcl5 {mode <mode>} {<plotsize>}",
++"           {{color {<number_of_pens>}} | monochrome} {solid | dashed}",
++"           {font <font>} {size <fontsize>} {pspoints | nopspoints}",
++"",
++" <mode> is `landscape` or `portrait`. <plotsize> is the physical",
++" plotting size of the plot, which is one of the following: `letter` for",
++" standard (8 1/2\" X 11\") displays, `legal` for (8 1/2\" X 14\") displays,",
++" `noextended` for (36\" X 48\") displays (a letter size ratio) or,",
++" `extended` for (36\" X 55\") displays (almost a legal size ratio).",
++" `color` is for multi-pen (i.e. color) plots, and <number_of_pens> is",
++" the number of pens (i.e. colors) used in color plots. `monochrome` is for",
++" one (e.g. black) pen plots. 'solid' draws all lines as solid lines, or",
++" 'dashed' will draw lines with different dashed and dotted line patterns.",
++" <font> is `stick`, `univers`, `cg_times`, `zapf_dingbats`, `antique_olive`,",
++" `arial`, `courier`, `garamond_antigua`, `letter_gothic`, `cg_omega`,",
++" `albertus`, `times_new_roman`, `clarendon`, `coronet`, `marigold`,",
++" `truetype_symbols`, or `wingdings`. <fontsize> is the font size in points.",
++" The point type selection can be the standard default set by specifying",
++" nopspoints, or the same set of point types found in the postscript terminal",
++" by specifying pspoints.",
++"",
++" Note that built-in support of some of these options is printer device",
++" dependendent. For instance, all the fonts are supposedly supported by the HP",
++" Laserjet IV, but only a few (e.g. univers, stick) may be supported by the HP",
++" Laserjet III and the Designjet 750C. Also, color obviously won't work on the",
++" the laserjets since they are monochrome devices.",
+ "",
+-" where <mode> is `landscape`, or `portrait`, <font> is `stick`, `univers`, or",
+-" `cg_times`, and <fontsize> is the size in points.",
++" Defaults: landscape, noextended, color (6 pens), solid, univers, 12 point,",
++"           and nopspoints.",
+ "",
+ " With `pcl5` international characters are handled by the printer; you just put",
+ " the appropriate 8-bit character codes into the text strings.  You don't need",
diff --git a/math/gnuplot+/files/patch-xj b/math/gnuplot+/files/patch-xj
new file mode 100644
index 000000000000..cfa430c4f339
--- /dev/null
+++ b/math/gnuplot+/files/patch-xj
@@ -0,0 +1,13 @@
+# save-position
+--- misc.c.ORIG	Wed Sep 29 18:17:27 1999
++++ misc.c	Sun Dec  5 21:46:23 1999
+@@ -1006,8 +1006,7 @@
+ FILE *fp;
+ struct position *pos;
+ {
+-    static char *msg[] =
+-    {"first_axes ", "second axes ", "graph ", "screen "};
++    static char *msg[] = { "first ", "second  ", "graph ", "screen " };
+ 
+     assert(first_axes == 0 && second_axes == 1 && graph == 2 && screen == 3);
+ 
diff --git a/math/gnuplot+/files/patch-xk b/math/gnuplot+/files/patch-xk
new file mode 100644
index 000000000000..f17e69895bc3
--- /dev/null
+++ b/math/gnuplot+/files/patch-xk
@@ -0,0 +1,283 @@
+# command-substitution
+--- command.c.ORIG	Thu Aug 19 15:42:21 1999
++++ command.c	Thu Dec  9 17:13:18 1999
+@@ -248,7 +248,7 @@
+ 	    (void) fputs("!\n", stderr);	/* why do we need this ? */
+ 	return (0);
+     }
+-    num_tokens = scanner(input_line);
++    num_tokens = scanner(&input_line, &input_line_len);
+     c_token = 0;
+     while (c_token < num_tokens) {
+ 	if (command())
+@@ -728,7 +728,7 @@
+     plot_token = 0;		/* whole line to be saved as replot line */
+ 
+     screen_ok = FALSE;
+-    num_tokens = scanner(input_line);
++    num_tokens = scanner(&input_line, &input_line_len);
+     c_token = 1;		/* skip the 'plot' part */
+     if (is_3d_plot)
+ 	plot3drequest();
+@@ -1006,7 +1006,7 @@
+ 		    else
+ 			(void) strcpy(prompt, "Help topic: ");
+ 		    read_line(prompt);
+-		    num_tokens = scanner(input_line);
++		    num_tokens = scanner(&input_line, &input_line_len);
+ 		    c_token = 0;
+ 		    more_help = !(END_OF_COMMAND);
+ 		    if (more_help)
+--- docs/gnuplot.doc.ORIG	Wed Oct 27 11:10:16 1999
++++ docs/gnuplot.doc	Thu Dec  9 17:13:25 1999
+@@ -1257,7 +1257,7 @@
+  blanks.
+ 
+  Command-line substitution can be used anywhere on the `gnuplot` command
+- line.
++ line, except inside strings delimited by single quotes.
+ 
+  Example:
+ 
+@@ -1267,6 +1267,11 @@
+ 
+  or, in VMS
+        f(x) = `run leastsq`
++
++ These will generate labels with the current time and userid:
++       set label "generated on `date +%Y-%m-%d`by `whoami`" at 1,1
++       set timestamp "generated on %Y-%m-%d by `whoami`"
++
+ 2 Syntax
+ ?syntax
+ ?specify
+--- protos.h.ORIG	Fri Oct  1 11:37:23 1999
++++ protos.h	Thu Dec  9 17:13:18 1999
+@@ -224,7 +224,7 @@
+ 
+ /* Prototypes from file "scanner.c" */
+ 
+-int scanner __PROTO((char expression[]));
++int scanner __PROTO((char **expression, int *line_lengthp));
+ 
+ 
+ /* Prototypes from "stdfn.c" */
+--- scanner.c.ORIG	Wed Nov  4 14:49:57 1998
++++ scanner.c	Thu Dec  9 17:13:18 1999
+@@ -37,7 +37,7 @@
+ #include "plot.h"
+ 
+ static int get_num __PROTO((char str[]));
+-static void substitute __PROTO((char *str, int max));
++static void substitute __PROTO((char **strp, int *str_lenp, int current));
+ 
+ #ifdef AMIGA_AC_5
+ #define O_RDONLY	0
+@@ -74,9 +74,10 @@
+ 
+ /*
+  * scanner() breaks expression[] into lexical units, storing them in token[].
+- *   The total number of tokens found is returned as the function value.
+- *   Scanning will stop when '\0' is found in expression[], or when token[]
+- *     is full.
++ *   The total number of tokens found is returned as the function
++ *   value.  Scanning will stop when '\0' is found in expression[], or
++ *   when token[] is full.  extend_input_line() is called to extend
++ *   expression array if needed.
+  *
+  *       Scanning is performed by following rules:
+  *
+@@ -95,13 +96,19 @@
+  *      5.  !,<,>       current char; also next if next is =
+  *      6.  ", '        all chars up until matching quote
+  *      7.  #           this token cuts off scanning of the line (DFK).
++ *      8.  `           (command substitution: all characters through the
++ *                      matching backtic are replaced by the output of
++ *                      the contained command, then scanning is restarted.)
+  *
+  *                      white space between tokens is ignored
+  */
+-int scanner(expression)
+-char expression[];
++int
++scanner(expressionp, expressionlenp)
++char **expressionp;
++int *expressionlenp;
+ {
+     register int current;	/* index of current char in expression[] */
++    char *expression = *expressionp;
+     register int quote;
+     char brace;
+ 
+@@ -118,7 +125,8 @@
+ 	token[t_num].is_token = TRUE;	/* to start with... */
+ 
+ 	if (expression[current] == '`') {
+-	    substitute(&expression[current], MAX_LINE_LEN - current);
++	    substitute(expressionp, expressionlenp, current);
++	    expression = *expressionp; /* expression might have moved */
+ 	    goto again;
+ 	}
+ 	/* allow _ to be the first character of an identifier */
+@@ -165,6 +173,10 @@
+ 			   && expression[current + 1]) {
+ 		    current++;
+ 		    token[t_num].length += 2;
++		} else if (quote == '\"' && expression[current] == '`') {
++		    substitute(expressionp, expressionlenp, current);
++		    expression = *expressionp; /* it might have moved */
++		    current--;
+ 		} else
+ 		    token[t_num].length++;
+ 	    }
+@@ -267,10 +279,6 @@
+ 
+ #if defined(VMS) || defined(PIPES) || (defined(ATARI) || defined(MTOS)) && defined(__PUREC__)
+ 
+-/* this really ought to make use of the dynamic-growth of the
+- * input line in 3.6.  And it definitely should not have
+- * static arrays !
+- */
+ /* A macro to reduce clutter ... */
+ # ifdef AMIGA_AC_5
+ #  define CLOSE_FILE_OR_PIPE ((void) close(fd))
+@@ -280,42 +288,58 @@
+ #  define CLOSE_FILE_OR_PIPE ((void) pclose(f))
+ # endif
+ 
+-static void substitute(str, max)	/* substitute output from ` ` */
+-char *str;
+-int max;
++/* substitute output from ` ` 
++ * *strp points to the input string.  (*strp)[current] is expected to
++ * be the initial back tic.  Characters through the following back tic
++ * are replaced by the output of the command.  extend_input_line()
++* is called to extend *strp array if needed.
++ */
++static void substitute(strp, str_lenp, current)        
++char **strp;
++int *str_lenp;
++int current;
+ {
+     register char *last;
+-    register int i, c;
++    register int c;
+     register FILE *f;
+ # ifdef AMIGA_AC_5
+     int fd;
+ # elif (defined(ATARI) || defined(MTOS)) && defined(__PUREC__)
+     char *atari_tmpfile;
+-    char *atari_pgm[MAX_LINE_LEN+100];
+ # endif /* !AMIGA_AC_5 */
+-    static char pgm[MAX_LINE_LEN+1], output[MAX_LINE_LEN+1];
++    char *str, *pgm, *rest = NULL;
++    int pgm_len, rest_len;
+ 
+ # ifdef VMS
+     int chan, one = 1;
+-    static $DESCRIPTOR(pgmdsc, pgm);
++    struct dsc$descriptor_s pgmdsc = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};
+     static $DESCRIPTOR(lognamedsc, MAILBOX);
+ # endif /* VMS */
+ 
+     /* forgive missing closing backquote at end of line */
+-    i = 0;
++    str = *strp + current;
+     last = str;
+     while (*++last) {
+-	if (*last == '`') {
+-	    ++last;		/* move past it */
++	if (*last == '`')
+ 	    break;
++    }
++    pgm_len = last - str;
++    pgm = gp_alloc(pgm_len, "command string");
++    safe_strncpy(pgm, str + 1, pgm_len); /* omit ` to leave room for NUL */
++
++    /* save rest of line, if any */
++    if (*last) {
++	last++;                 /* advance past ` */
++	rest_len = strlen(last) + 1;
++	if (rest_len > 1) {
++	    rest = gp_alloc(rest_len, "input line copy");
++	    strcpy(rest, last);
+ 	}
+-	pgm[i++] = *last;
+     }
+-    pgm[i] = NUL;		/* end with null */
+-    max -= strlen(last);	/* max is now the max length of output sub. */
+ 
+ # ifdef VMS
+-    pgmdsc.dsc$w_length = i;
++    pgmdsc.dsc$a_pointer = pgm;
++    pgmdsc.dsc$w_length = pgm_len;
+     if (!((vaxc$errno = sys$crembx(0, &chan, 0, 0, 0, 0, &lognamedsc)) & 1))
+ 	os_error("sys$crembx failed", NO_CARET);
+ 
+@@ -327,13 +351,11 @@
+ # elif (defined(ATARI) || defined(MTOS)) && defined(__PUREC__)
+     if (system(NULL) == 0)
+ 	os_error("no command shell", NO_CARET);
+-    if ((strlen(atari_tmpfile) + strlen(pgm) + 5) > MAX_LINE_LEN + 100)
+-	os_error("sorry, command to long", NO_CARET);
+     atari_tmpfile = tmpnam(NULL);
+-    strcpy(atari_pgm, pgm);
+-    strcat(atari_pgm, " >> ");
+-    strcat(atari_pgm, atari_tmpfile);
+-    system(atari_pgm);
++    gp_realloc(pgm, pgm_len + 5 + strlen(atari_tmpfile), "command string");
++    strcat(pgm, " >> ");
++    strcat(pgm, atari_tmpfile);
++    system(pgm);
+     if ((f = fopen(atari_tmpfile, "r")) == NULL)
+ # elif defined(AMIGA_AC_5)
+     if ((fd = open(pgm, "O_RDONLY")) == -1)
+@@ -342,23 +364,36 @@
+ 	os_error("popen failed", NO_CARET);
+ # endif /* !VMS */
+ 
+-    i = 0;
+-    while ((c = getc(f)) != EOF) {
+-	output[i++] = ((c == '\n') ? ' ' : c);	/* newlines become blanks */
+-	if (i == max) {
+-	    CLOSE_FILE_OR_PIPE;
+-	    int_error("substitution overflow", t_num);
+-	}
++    free(pgm);
++
++    /* now replace ` ` with output */
++    while (1) {
++# if defined(AMIGA_AC_5)
++	char ch;
++	if (read(fd, &ch, 1) != 1)
++	    break;
++	c = ch;
++# else
++	if ((c = getc(f)) == EOF)
++	    break;
++# endif /* !AMIGA_AC_5 */
++	/* newlines become blanks */
++	(*strp)[current++] = ((c == '\n') ? ' ' : c); 
++	if (current == *str_lenp)
++	    extend_input_line();
+     }
++    (*strp)[current] = 0;
+ 
+     CLOSE_FILE_OR_PIPE;
+ 
+-    if (i + strlen(last) > max)
+-	int_error("substitution overflowed rest of line", t_num);
+     /* tack on rest of line to output */
+-    safe_strncpy(output + i, last, MAX_LINE_LEN - i);
+-    /* now replace ` ` with output */
+-    safe_strncpy(str, output, max);
++    if (rest) {
++	while (current + rest_len > *str_lenp)
++	    extend_input_line();
++	strcpy(*strp+current, rest);
++	free(rest);
++    }
++
+     screen_ok = FALSE;
+ }
+ 
diff --git a/math/gnuplot+/files/patch-xl b/math/gnuplot+/files/patch-xl
new file mode 100644
index 000000000000..a7f247c6dc60
--- /dev/null
+++ b/math/gnuplot+/files/patch-xl
@@ -0,0 +1,64 @@
+# dynamic-contour-levels
+--- plot.h.ORIG	Tue Oct 19 14:32:17 1999
++++ plot.h	Thu Dec  9 17:57:06 1999
+@@ -131,7 +131,6 @@
+ #define LEVELS_AUTO		0		/* How contour levels are set */
+ #define LEVELS_INCREMENTAL	1		/* user specified start & incremnet */
+ #define LEVELS_DISCRETE		2		/* user specified discrete levels */
+-#define MAX_DISCRETE_LEVELS   30
+ 
+ #define ANGLES_RADIANS	0
+ #define ANGLES_DEGREES	1
+--- set.c.ORIG	Thu Aug 19 15:36:35 1999
++++ set.c	Thu Dec  9 17:57:06 1999
+@@ -44,6 +44,7 @@
+ #include "stdfn.h"
+ #include "setshow.h"
+ #include "national.h"
++#include "alloc.h"
+ 
+ #define DEF_FORMAT   "%g"	/* default format for tic mark labels */
+ #define SIGNIF (0.01)		/* less than one hundredth of a tic mark */
+@@ -198,7 +199,8 @@
+ int contour_levels = 5;
+ double zero = ZERO;		/* zero threshold, not 0! */
+ int levels_kind = LEVELS_AUTO;
+-double levels_list[MAX_DISCRETE_LEVELS];	/* storage for z levels to draw contours at */
++double *levels_list;	/* storage for z levels to draw contours at */
++int max_levels = 0;	/* contour level capacity, before enlarging */
+ 
+ int dgrid3d_row_fineness = 10;
+ int dgrid3d_col_fineness = 10;
+@@ -611,6 +613,10 @@
+ else if (almost_equals(c_token, MIN)) { AUTO |= 1;    ++c_token; } \
+ else if (almost_equals(c_token, MAX)) { AUTO |= 2;    ++c_token; }
+ 
++    if (max_levels == 0)
++	levels_list = (double *)gp_alloc((max_levels = 5)*sizeof(double), 
++					 "contour levels");
++
+     if (almost_equals(c_token, "ar$row")) {
+ 	c_token++;
+ 	set_arrow();
+@@ -813,6 +819,10 @@
+ 		    if (!equals(c_token, ","))
+ 			int_error("expecting comma to separate discrete levels", c_token);
+ 		    c_token++;
++		    if (i == max_levels)
++			levels_list = gp_realloc(levels_list,
++					(max_levels += 10)*sizeof(double),
++					"contour levels");
+ 		    levels_list[i++] = real(const_express(&a));
+ 		}
+ 		contour_levels = i;
+--- setshow.h.ORIG	Sat Oct  3 21:17:47 1998
++++ setshow.h	Thu Dec  9 17:57:06 1999
+@@ -169,7 +169,7 @@
+ extern int			contour_levels;
+ extern double			zero; /* zero threshold, not 0! */
+ extern int			levels_kind;
+-extern double		levels_list[MAX_DISCRETE_LEVELS];
++extern double			*levels_list;
+ 
+ extern int			dgrid3d_row_fineness;
+ extern int			dgrid3d_col_fineness;
diff --git a/math/gnuplot+/files/patch-za b/math/gnuplot+/files/patch-za
new file mode 100644
index 000000000000..730323f0842e
--- /dev/null
+++ b/math/gnuplot+/files/patch-za
@@ -0,0 +1,74 @@
+--- gplt_x11.c.ORIG	Thu Dec  2 17:02:05 1999
++++ gplt_x11.c	Thu Dec  2 17:02:54 1999
+@@ -169,6 +169,10 @@
+ # define EINTR	E_ILLFNC
+ #endif
+ 
++#ifdef __FreeBSD__
++# include <floatingpoint.h>
++#endif
++
+ /* information about one window/plot */
+ 
+ typedef struct plot_struct {
+@@ -301,6 +305,10 @@
+ int argc;
+ char *argv[];
+ {
++#ifdef __FreeBSD__
++  /* allow divide by zero -- Inf */
++  fpsetmask(fpgetmask() & ~(FP_X_DZ | FP_X_INV));
++#endif
+ 
+ #ifndef X11ORG
+    setlocale(LC_ALL, "");
+@@ -335,6 +343,12 @@
+ 	}
+     }
+     XCloseDisplay(dpy);
++
++#ifdef __FreeBSD__
++  fpresetsticky(FP_X_DZ | FP_X_INV);
++  fpsetmask(fpgetmask() | (FP_X_DZ | FP_X_INV));
++#endif
++
+ 
+     FPRINTF((stderr, "exiting\n"));
+ 
+--- plot.c.ORIG	Thu Dec  2 17:02:05 1999
++++ plot.c	Thu Dec  2 17:02:54 1999
+@@ -73,6 +73,10 @@
+ # endif
+ #endif /* _Windows */
+ 
++#ifdef __FreeBSD__
++# include <floatingpoint.h>
++#endif
++
+ extern FILE *gpoutfile;
+ 
+ TBOOLEAN interactive = TRUE;	/* FALSE if stdin not a terminal */
+@@ -347,6 +351,11 @@
+     _control87(MCW_EM, MCW_EM);
+ #endif
+ 
++#ifdef __FreeBSD__
++  /* allow divide by zero -- Inf */
++  fpsetmask(fpgetmask() & ~(FP_X_DZ | FP_X_INV));
++#endif
++
+ #if defined(OS2)
+     int rc;
+     if (_osmode == OS2_MODE) {
+@@ -565,6 +574,11 @@
+ #ifdef OS2
+     if (_osmode == OS2_MODE)
+ 	RexxDeregisterSubcom("GNUPLOT", NULL);
++#endif
++
++#ifdef __FreeBSD__
++  fpresetsticky(FP_X_DZ | FP_X_INV);
++  fpsetmask(fpgetmask() | (FP_X_DZ | FP_X_INV));
+ #endif
+ 
+ #if defined(ATARI) || defined(MTOS)
-- 
cgit v1.2.3