[comp.sources.x] v01i006: xfig: a MacDraw style line editor

mikew@wyse.wyse.com (Mike Wexler) (08/17/88)

Submitted-by: ken@cs.rochester.edu (Ken Yap)
Posting-number: Volume 1, Issue 6
Archive-name: xfig/part05

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 5 (of 11)."
# Contents:  FORMAT1.4 autoarrow.c copy.c draw.c flip.c line.c
# Wrapped by mikew@wyse on Tue Aug 16 13:14:38 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f FORMAT1.4 -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"FORMAT1.4\"
else
echo shar: Extracting \"FORMAT1.4\" \(9334 characters\)
sed "s/^X//" >FORMAT1.4 <<'END_OF_FORMAT1.4'
XThe following is the format of fig output (fig 1.4).
X
X(1) The very first line is a comment line containing the name and version:
X	#FIG 1.4
X
X    The character # at the first column of a line indicates that the line
X    is a comment line which will be ignored.
X
X(2) The first non-comment line consists of two numbers :
X
X	int	fig_resolution		(pixels/inch)
X	int	coordinate_system	(1 : origin is at the lower left corner
X					 2 : Upper left)
X
X    Fig_resolution is the resolution fig is using for the current file.
X    It may not be the same as screen resolution (which can be higher or
X    lower).  I assume that a pixel is square, therefore this number
X    represents drawing resolution in both direction.  I've experimented
X    with fig automatically changing this number according to the resolution
X    of the monitor it is running on (The screen resolution, width and height
X    in pixels, not pixel/inch, can be done by doing a ioctl on the /dev/fb).
X    I've found that for monitors with higher resolution but same size
X    (19" diagonal), I preferred using the pixels for other things than
X    having fig occupying most of the screen.  Thus I opted for a fixed
X    pixel-per-inch number which make fig window smaller on higher resolution
X    monitor (than the standard sun monitor).  This however may change in
X    the future version.
X
X(3) The rest of the file contains various objects.  An object can be one
X    of six classes (or types).
X
X	  i)	Arc.
X	 ii)	Ellipse which is a generalization of circle.
X	iii)	Polyline which includes polygon and box.
X	 iv)	Spline which includes closed/open control/interpolated spline.
X	  v)	Text.
X	 vi)	Compound object which is composed of one or more objects.
X
X    In the following elaboration on object formats, every value of fig
X    output are separated by blank characters or new line ('\n').  The
X    value of the not-used parameters will be -1.
X
X    A number of values are described as unused or not applicable to some
X    object even though they are defined for those objects.  These value
X    will (hopefully) be used in the future version of fig.  The intention
X    of their uses are the following.
X
X	Value			Usage
X	-----			-----
X	area_fill	The stipple pattern (which will be align) for
X			filling object internals.  For example, an filled
X			arc will look like a piece of pie.
X
X	pen		This will be a structure defining the shape of
X			pen used in drawing objects.  It also includes
X			the the stipple pattern for line filling.
X			The default pen is a circular pen with black
X			filling.
X
X	thickness	Every pen has the thickness of one.
X			Thickness scales the size of a pen. 
X
X	depth		This value adds a half dimension to fig.
X			It is useful when we have overlapping filled
X			objects and we want one to obliterate another.
X			An object can have only one depth (including
X			compound object).  An object that is in less
X			depth can obscure the one with greater depth
X			if they overlap.
X	
X	line_style	Only polyline (including polygon and box) can
X			be rendered with dashed line.  However the
X			objects created when the dash-line mode was on
X			will be recorded as such.  Currently the filter
X			f2ps (1) is able to render the desired line style
X			effect on hard copy.  Three line styles are defined.
X
X				0 : SOLID_LINE
X				1 : DASH_LINE
X				2 : DOTTED_LINE
X
X	style_val	For dash style, it is the length of a dash.
X			For dotted line it indicates the approximated
X			gap of consecutive dots. 
X
X    (3.1) ARC
X
X    First line :
X	type	name			(brief description)
X	----	----			-------------------
X	int	object_code		(always 5)
X	int	sub_type		(always	1)
X	int	line_style		(See the end of this section)
X	int	line_thickness		(pixels, not used)
X	int	color			(not used)
X	int	depth			(not used)
X	int	pen			(not used)
X	int	area_fill		(not used)
X	float	style_val		(pixels, not used)
X	int	direction		(0 : clockwise, 1 : counterclockwise)
X	int	forward_arrow		(0: no forward arrow, 1: on)
X	int	backward_arrow		(0: no forward arrow, 1: on)
X	float	center_x, center_y	(center of the arc)
X	int	x1, y1			(pixels, the 1st point the user entered)
X	int	x2, y2			(pixels, the 2nd point)
X	int	x3, y3			(pixels, the last point)
X
X    Forward arrow line (Optional; absent if forward_arrow is 0) :
X	type	name			(brief description)
X	----	----			-------------------
X	int	arrow_type		(not used)
X	int	arrow_style		(not used)
X	int	arrow_thickness		(not used)
X	int	arrow_width		(pixels)
X	int	arrow_height		(pixels)
X
X    Backward arrow line (Optional; absent if backward_arrow is 0) :
X	type	name			(brief description)
X	----	----			-------------------
X	int	arrow_type		(not used)
X	int	arrow_style		(not used)
X	int	arrow_thickness		(not used)
X	int	arrow_width		(pixels)
X	int	arrow_height		(pixels)
X
X    (3.2) COMPOUND
X
X    A line with object code 6 signifies the start of a compound.
X    There are four more numbers on this line which indicate the
X    upper right corner and the lower left corner of the bounding
X    box of this compound.  A line with object code -6 signifies
X    the end of the compound.  Compound may be nested.
X
X    First line :
X	type	name			(brief description)
X	----	----			-------------------
X	int	object_code		(always 6)
X	int	upperright_corner_x	(pixels)
X	int	upperright_corner_y	(pixels)
X	int	lowerleft_corner_x	(pixels)
X	int	lowerleft_corner_y	(pixels)
X
X    Subsequent lines :
X	objects
X	.
X	.
X
X    Last line :
X	-6
X
X    (3.3) ELLIPSE
X
X    First line :
X	type	name			(brief description)
X	----	----			-------------------
X	int	object_code		(always 1)
X	int	sub_type		(1 : ellipse defined by radiuses
X					 2 : ellipse defined by diameters
X					 3 : circle defined by radius
X					 4 : circle defined by diameter)
X	int	line_style		(See the end of this section)
X	int	thickness		(pixels, not used)
X	int	color			(not used)
X	int	depth			(not used)
X	int	pen			(not used)
X	int	area_fill		(not used)
X	float	style_val		(pixels, not used)
X	int	direction		(always 1)
X	float	angle			(radian, the angle of the x-axis)
X	int	center_x, center_y	(pixels)
X	int	radius_x, radius_y	(pixels)
X	int	start_x, start_y	(pixels; the 1st point entered)
X	int	end_x, end_y		(pixels; the last point entered)
X
X    (3.4) POLYLINE
X
X    First line :
X	type	name			(brief description)
X	----	----			-------------------
X	int	object_code		(always 1)
X	int	sub_type		(1 : polyline, 2 : box, 3 : polygon)
X	int	line_style		(See the end of this section)
X	int	thickness		(pixels, not used)
X	int	color			(not used)
X	int	depth			(not used)
X	int	pen			(not used)
X	int	area_fill		(not used)
X	float	style_val		(pixels)
X	int	forward_arrow		(0: off, 1: on)
X	int	backward_arrow		(0: off, 1: on)
X
X    Forward arrow line : same as ARC object
X
X    Backward arrow line : same as ARC object
X
X    Points line :
X	type	name			(brief description)
X	----	----			-------------------
X	int	x1, y1			(pixels)
X	int	x2, y2			(pixels)
X	  .
X	  .
X	int	xn, yn			(this will be the same as the 1st
X					point for polygon and box)
X	int	x, y			(always 9999, 9999; marks the end of
X					point for polygon and box)
X
X    (3.5) SPLINE
X
X    First line :
X	type	name			(brief description)
X	----	----			-------------------
X	int	object_code		(always 1)
X	int	sub_type		(1 : open spline
X					 2 : closed spline
X					 3 : open interpolated spline
X					 4 : closed interpolated spline)
X	int	line_style		(See the end of this section)
X	int	thickness		(pixels, not used)
X	int	color			(not used)
X	int	depth			(not used)
X	int	pen			(not used)
X	int	area_fill		(not used)
X	float	style_val		(pixels, not used)
X	int	forward_arrow		(0: off, 1: on)
X	int	backward_arrow		(0: off, 1: on)
X
X    Forward arrow line : same as ARC object
X
X    Backward arrow line : same as ARC object
X
X    Points line : same as POLYLINE object
X
X    Control points line (absent if sub_type is 1 or 2) :
X	Control points of interpolated spline.  There are two control
X	points for each knots.  A section i, of the spline is drawn
X	using Bezier cubic with the following four points:
X		(x ,y ), (rx ,ry ), (lx	  , ly   ), (x   , y   ).
X		  i  i	    i	i      i+1    i+1     i+1   i+1
X	For closed interpolated spline the last pair of control points,
X	(lxn,lyn) and (rxn,ryn) (which can be ignored), are the same as
X	(lx1,ly1) and (rx1,ry1) respectively.
X
X	type	name			(brief description)
X	----	----			-------------------
X	float	lx1, ly1		(pixels)
X	float	rx1, ry1		(pixels)
X	float	lx2, ly2		(pixels)
X	float	rx2, ry2		(pixels)
X	  .
X	  .
X	float	lxn, lyn		(pixels)
X	float	rxn, ryn		(pixels)
X
X    (3.6) TEXT
X	type	name			(brief description)
X	----	----			-------------------
X	int	object 			(always 4)
X	int	sub_type		(0 : Left justified
X					 1 : Center justified
X					 2 : Right justified)
X	int	font 			(not used)
X	int	font_size 		(not used)
X	int	pen			(not used)
X	int	color			(not used)
X	int	depth			(not used)
X	int	angle			(radian, not used, the angle of the
X					the base line of the string)
X	int	font_style		(not used)
X	int	height			(pixels)
X	int	length			(pixels)
X	int	x, y			(pixels, coordinate of the origin
X					 of the string.  If sub_type = 0, it is
X					 the lower left corner of the string.
X					 If sub_type = 1, it is the lower
X					 center.  Otherwise it is the lower
X					 right corner of the string.)
X	char	string[]		(ascii characters; starts after a blank
X					character following the last number and
X					ends before the character '\1'.  This
X					character is not part of the string.
X					Note that the string may contain '\n'.)
END_OF_FORMAT1.4
if test 9334 -ne `wc -c <FORMAT1.4`; then
    echo shar: \"FORMAT1.4\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f autoarrow.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"autoarrow.c\"
else
echo shar: Extracting \"autoarrow.c\" \(9036 characters\)
sed "s/^X//" >autoarrow.c <<'END_OF_autoarrow.c'
X/* 
X *	FIG : Facility for Interactive Generation of figures
X *
X *	Copyright (c) 1985 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU)
X *	January 1985.
X *	1st revision : Aug 1985.
X *
X *	%W%	%G%
X*/
X#include "fig.h"
X#include "resources.h"
X#include "func.h"
X#include "object.h"
X#include "paintop.h"
X
X#define			TOLERANCE	7
X
Xextern			(*canvas_kbd_proc)();
Xextern			(*canvas_locmove_proc)();
Xextern			(*canvas_leftbut_proc)();
Xextern			(*canvas_middlebut_proc)();
Xextern			(*canvas_rightbut_proc)();
Xextern			null_proc();
Xextern			set_popupmenu();
Xextern F_line		*line_point_search();
Xextern F_spline		*spline_point_search();
Xextern F_arc		*arc_point_search();
Xextern F_arrow		*forward_arrow(), *backward_arrow();
X
Xextern int		foreground_color, background_color;
Xextern int		pointmarker_shown;
X
XF_point			*selected_point, *left_point;
Xint			arcpoint_num;
X			add_arrow_head();
X			delete_arrow_head();
X
X#define			round(x)	((int) (x + .5))
X
Xarrow_head_selected()
X{
X	canvas_kbd_proc = null_proc;
X	canvas_locmove_proc = null_proc;
X	canvas_leftbut_proc = add_arrow_head;
X	canvas_middlebut_proc = delete_arrow_head;
X	canvas_rightbut_proc = set_popupmenu;
X	set_cursor(&pick9_cursor);
X	}
X
Xadd_arrow_head(x, y)
Xint	x, y;
X{
X	F_line		*line;
X	F_spline	*spline;
X	F_arc		*arc;
X
X	if ((line = line_point_search(x, y, TOLERANCE,
X		&left_point, &selected_point)) != NULL) {
X		add_linearrow(line);
X	    }
X	else if ((spline = spline_point_search(x, y, 
X		TOLERANCE, &left_point, &selected_point)) != NULL){
X		add_splinearrow(spline);
X	    }
X	else if ((arc = arc_point_search(x, y, TOLERANCE, 
X		&arcpoint_num)) != NULL) {
X		add_arcarrow(arc);
X	    }
X	else
X	    return;
X
X	set_modifiedflag();
X	}
X
Xdelete_arrow_head(x, y)
Xint	x, y;
X{
X	F_line		*line;
X	F_spline	*spline;
X	F_arc		*arc;
X
X	if ((line = line_point_search(x, y, TOLERANCE,
X		&left_point, &selected_point)) != NULL) {
X		delete_linearrow(line);
X	    }
X	else if ((spline = spline_point_search(x, y, 
X		TOLERANCE, &left_point, &selected_point)) != NULL){
X		delete_splinearrow(spline);
X	    }
X	else if ((arc = arc_point_search(x, y, TOLERANCE, 
X		&arcpoint_num)) != NULL) {
X		delete_arcarrow(arc);
X	    }
X	else
X	    return;
X
X	set_modifiedflag();
X	}
X
Xadd_linearrow(line)
XF_line	*line;
X{
X	F_point	*p;
X
X	if (line->type == T_POLYGON || line->type == T_BOX) return;
X	if (line->points->next == NULL) return;	/* A single point line */
X
X	if (left_point == NULL) { /*  selected_point is the first point */
X	    if (line->back_arrow) return;
X	    p = selected_point->next;
X	    line->back_arrow = backward_arrow();
X	    if (pointmarker_shown) toggle_linepointmarker(line);
X	    draw_arrow(p->x, p->y, selected_point->x, selected_point->y, 
X			line->back_arrow, PAINT);
X	    if (pointmarker_shown) toggle_linepointmarker(line);
X	    }
X	else if (selected_point->next == NULL) { /* forward arrow */
X	    if (line->for_arrow) return;
X	    line->for_arrow = forward_arrow();
X	    if (pointmarker_shown) toggle_linepointmarker(line);
X	    draw_arrow(left_point->x, left_point->y, 
X			selected_point->x, selected_point->y, 
X			line->for_arrow, PAINT);
X	    if (pointmarker_shown) toggle_linepointmarker(line);
X	    }
X	clean_up();
X	set_action_object(F_ADD_ARROW_HEAD, O_POLYLINE);
X	}
X
Xadd_arcarrow(arc)
XF_arc	*arc;
X{
X
X	if (arcpoint_num == 0) { /*  backward arrow  */
X	    if (arc->back_arrow) return;
X	    arc->back_arrow = backward_arrow();
X	    if (pointmarker_shown) toggle_arcpointmarker(arc);
X	    draw_arcarrow(arc, foreground_color);
X	    if (pointmarker_shown) toggle_arcpointmarker(arc);
X	    }
X	else if (arcpoint_num == 2) { /*  for_arrow  */
X	    if (arc->for_arrow) return;
X	    arc->for_arrow = forward_arrow();
X	    if (pointmarker_shown) toggle_arcpointmarker(arc);
X	    draw_arcarrow(arc, foreground_color);
X	    if (pointmarker_shown) toggle_arcpointmarker(arc);
X	    }
X	clean_up();
X	set_action_object(F_ADD_ARROW_HEAD, O_ARC);
X	}
X
Xadd_splinearrow(spline)
XF_spline	*spline;
X{
X	F_point		*p;
X	F_control	*c;
X
X	if (closed_spline(spline)) return;
X	if (left_point == NULL) { /* add backward arrow */
X	    if (spline->back_arrow) return;
X	    p = selected_point->next;
X	    spline->back_arrow = backward_arrow();
X	    if (pointmarker_shown) toggle_splinepointmarker(spline);
X	    if (normal_spline(spline)) {
X		draw_arrow(p->x, p->y, selected_point->x,
X			selected_point->y, spline->back_arrow, PAINT);
X		}
X	    else {
X		c = spline->controls;
X		draw_arrow(round(c->rx), round(c->ry), selected_point->x,
X			selected_point->y, spline->back_arrow, PAINT);
X		}
X	    if (pointmarker_shown) toggle_splinepointmarker(spline);
X	    }
X	else if (selected_point->next == NULL) { /* add forward arrow */
X	    if (spline->for_arrow) return;
X	    spline->for_arrow = forward_arrow();
X	    if (pointmarker_shown) toggle_splinepointmarker(spline);
X	    if (normal_spline(spline)) {
X		draw_arrow(left_point->x, left_point->y,
X			selected_point->x, selected_point->y,
X			spline->for_arrow, PAINT);
X		}
X	    else {
X		for (c = spline->controls; c->next != NULL; c = c->next);
X		draw_arrow(round(c->lx), round(c->ly), selected_point->x,
X			selected_point->y, spline->for_arrow, PAINT);
X		}
X	    if (pointmarker_shown) toggle_splinepointmarker(spline);
X	    }
X	clean_up();
X	set_action_object(F_ADD_ARROW_HEAD, O_SPLINE);
X	}
X
Xdelete_linearrow(line)
XF_line	*line;
X{
X	if (line->type == T_POLYGON || line->type == T_BOX) return;
X
X	if (left_point == NULL) { /*  selected_point is the first point */
X	    if (! line->back_arrow) return;
X	    if (pointmarker_shown) toggle_linepointmarker(line);
X	    draw_line(line, INV_PAINT);
X	    line->back_arrow = 0;
X	    free((char*)line->back_arrow);
X	    line->for_arrow = NULL;
X	    draw_line(line, PAINT);
X	    if (pointmarker_shown) toggle_linepointmarker(line);
X	    }
X	else if (selected_point->next == NULL) { /* forward arrow */
X	    if (! line->for_arrow) return;
X	    if (pointmarker_shown) toggle_linepointmarker(line);
X	    draw_line(line, INV_PAINT);
X	    free((char*)line->for_arrow);
X	    line->for_arrow = NULL;
X	    draw_line(line, PAINT);
X	    if (pointmarker_shown) toggle_linepointmarker(line);
X	    }
X	clean_up();
X	set_action_object(F_DELETE_ARROW_HEAD, O_POLYLINE);
X	}
X
Xdelete_arcarrow(arc)
XF_arc	*arc;
X{
X	if (arcpoint_num == 0) { /*  backward arrow  */
X	    if (! arc->back_arrow) return;
X	    if (pointmarker_shown) toggle_arcpointmarker(arc);
X	    draw_arc(arc, background_color);
X	    free((char*)arc->back_arrow);
X	    arc->back_arrow = NULL;
X	    draw_arc(arc, foreground_color);
X	    if (pointmarker_shown) toggle_arcpointmarker(arc);
X	    }
X	else if (arcpoint_num == 2) { /*  for_arrow  */
X	    if (! arc->for_arrow) return;
X	    if (pointmarker_shown) toggle_arcpointmarker(arc);
X	    draw_arc(arc, background_color);
X	    free((char*)arc->for_arrow);
X	    arc->for_arrow = NULL;
X	    draw_arc(arc, foreground_color);
X	    if (pointmarker_shown) toggle_arcpointmarker(arc);
X	    }
X	clean_up();
X	set_action_object(F_DELETE_ARROW_HEAD, O_ARC);
X	}
X
Xdelete_splinearrow(spline)
XF_spline	*spline;
X{
X	F_point	*p;
X
X	if (closed_spline(spline)) return;
X	if (left_point == NULL) { /*  selected_point is the first point */
X	    if (! spline->back_arrow) return;
X	    if (pointmarker_shown) toggle_splinepointmarker(spline);
X	    p = selected_point->next;
X	    if (normal_spline(spline)) {
X		draw_arrow(p->x, p->y, selected_point->x,
X			selected_point->y, spline->back_arrow, ERASE);
X		pw_vector(canvas_pixwin, selected_point->x, selected_point->y,
X			round((p->x+selected_point->x)/2.0),
X			round((p->y+selected_point->y)/2.0), PAINT, 1);
X		}
X	    else {
X		F_control	*a, *b;
X
X		a = spline->controls;
X		b = a->next;
X		draw_arrow(round(a->rx), round(a->ry), selected_point->x,
X			selected_point->y, spline->back_arrow, ERASE);
X		bezier_spline(
X			(float)selected_point->x, (float)selected_point->y,
X			a->rx, a->ry, b->lx, b->ly, (float)p->x, (float)p->y,
X			PAINT);
X		}
X	    free((char*)spline->back_arrow);
X	    spline->back_arrow = NULL;
X	    if (pointmarker_shown) toggle_splinepointmarker(spline);
X	    }
X	else if (selected_point->next == NULL) { /* forward arrow */
X	    if (! spline->for_arrow) return;
X	    if (pointmarker_shown) toggle_splinepointmarker(spline);
X	    if (normal_spline(spline)) {
X		draw_arrow(left_point->x, left_point->y,
X			selected_point->x, selected_point->y,
X			spline->for_arrow, ERASE);
X		pw_vector(canvas_pixwin, selected_point->x, selected_point->y,
X			round((selected_point->x+left_point->x)/2.0),
X			round((selected_point->y+left_point->y)/2.0),
X			PAINT, 1);
X		}
X	    else {
X		F_control	*a, *b;
X
X		a = spline->controls;
X		for (b = a->next; b->next != NULL; a = b, b = b->next);
X		draw_arrow(round(b->lx), round(b->ly), selected_point->x,
X			selected_point->y, spline->for_arrow, ERASE);
X		bezier_spline(
X			(float)left_point->x, (float)left_point->y,
X			a->rx, a->ry, b->lx, b->ly,
X			(float)selected_point->x, (float)selected_point->y,
X			PAINT);
X		}
X	    free((char*)spline->for_arrow);
X	    spline->for_arrow = NULL;
X	    if (pointmarker_shown) toggle_splinepointmarker(spline);
X	    }
X	clean_up();
X	set_action_object(F_DELETE_ARROW_HEAD, O_SPLINE);
X	}
END_OF_autoarrow.c
if test 9036 -ne `wc -c <autoarrow.c`; then
    echo shar: \"autoarrow.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f copy.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"copy.c\"
else
echo shar: Extracting \"copy.c\" \(7706 characters\)
sed "s/^X//" >copy.c <<'END_OF_copy.c'
X/* 
X *	FIG : Facility for Interactive Generation of figures
X *
X *	Copyright (c) 1985 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU)
X *	January 1985.
X *	1st revision : Aug 1985.
X *
X *	%W%	%G%
X*/
X#include "fig.h"
X#include "resources.h"
X#include "alloc.h"
X#include "func.h"
X#include "object.h"
X#include "paintop.h"
X
X#define			TOLERANCE	7
X
Xextern			(*canvas_kbd_proc)();
Xextern			(*canvas_locmove_proc)();
Xextern			(*canvas_leftbut_proc)();
Xextern			(*canvas_middlebut_proc)();
Xextern			(*canvas_rightbut_proc)();
Xextern			(*return_proc)();
Xextern			null_proc();
Xextern			set_popupmenu();
Xextern F_line		*line_search(), *copy_line();
Xextern F_arc		*arc_search(), *copy_arc();
Xextern F_ellipse	*ellipse_search(), *copy_ellipse();
Xextern F_text		*text_search(), *copy_text();
Xextern F_spline		*spline_search(), *copy_spline();
Xextern F_compound	*compound_search(), *copy_compound();
X
Xextern F_compound	objects;
X
Xextern int		copy_selected();
X			init_copy();
X
Xcopy_selected()
X{
X	canvas_kbd_proc = null_proc;
X	canvas_locmove_proc = null_proc;
X	canvas_leftbut_proc = init_copy;
X	canvas_middlebut_proc = null_proc;
X	canvas_rightbut_proc = set_popupmenu;
X	return_proc = copy_selected;
X	set_cursor(&pick15_cursor);
X	reset_action_on();
X	}
X
Xinit_copy(x, y)
Xint	x, y;
X{
X	F_line		*l, *line;
X	F_ellipse	*e, *ellipse;
X	F_text		*t, *text;
X	F_spline	*s, *spline;
X	F_arc		*a, *arc;
X	F_compound	*c, *compound;
X	int		px, py;
X
X	if ((c = compound_search(x, y, TOLERANCE, &px, &py)) != NULL) {
X	    compound = copy_compound(c);
X	    erase_pointmarker();
X	    set_temp_cursor(&null_cursor);
X	    win_setmouseposition(canvas_swfd, px, py);
X	    clean_up();
X	    set_action_object(F_CREATE, O_COMPOUND);
X	    insert_compound(&objects.compounds, compound);
X	    set_latestcompound(compound);
X	    init_compounddragging(compound, px, py);
X	    }
X	else if ((l = line_search(x, y, TOLERANCE, &px, &py)) != NULL) {
X	    line = copy_line(l);
X	    erase_pointmarker();
X	    set_temp_cursor(&null_cursor);
X	    win_setmouseposition(canvas_swfd, px, py);
X	    clean_up();
X	    set_action_object(F_CREATE, O_POLYLINE);
X	    insert_line(&objects.lines, line);
X	    set_latestline(line);
X	    init_linedragging(line, px, py);
X	    }
X	else if ((t = text_search(x, y)) != NULL) {
X	    text = copy_text(t);
X	    erase_pointmarker();
X	    set_temp_cursor(&null_cursor);
X	    clean_up();
X	    set_action_object(F_CREATE, O_TEXT);
X	    insert_text(&objects.texts, text);
X	    set_latesttext(text);
X	    init_textdragging(text, x, y);
X	    }
X	else if ((e = ellipse_search(x, y, TOLERANCE, &px, &py)) != NULL) {
X	    ellipse = copy_ellipse(e);
X	    erase_pointmarker();
X	    set_temp_cursor(&null_cursor);
X	    win_setmouseposition(canvas_swfd, px, py);
X	    clean_up();
X	    set_action_object(F_CREATE, O_ELLIPSE);
X	    insert_ellipse(&objects.ellipses, ellipse);
X	    set_latestellipse(ellipse);
X	    init_ellipsedragging(ellipse, px, py);
X	    }
X	else if ((a = arc_search(x, y, TOLERANCE, &px, &py)) != NULL) {
X	    arc = copy_arc(a);
X	    erase_pointmarker();
X	    set_temp_cursor(&null_cursor);
X	    win_setmouseposition(canvas_swfd, px, py);
X	    clean_up();
X	    set_action_object(F_CREATE, O_ARC);
X	    insert_arc(&objects.arcs, arc);
X	    set_latestarc(arc);
X	    init_arcdragging(arc, px, py);
X	    }
X	else if ((s = spline_search(x, y, TOLERANCE, &px, &py)) != NULL) {
X	    spline = copy_spline(s);
X	    erase_pointmarker();
X	    set_temp_cursor(&null_cursor);
X	    win_setmouseposition(canvas_swfd, px, py);
X	    clean_up();
X	    set_action_object(F_CREATE, O_SPLINE);
X	    insert_spline(&objects.splines, spline);
X	    set_latestspline(spline);
X	    init_splinedragging(spline, px, py);
X	    }
X	else
X	    return;
X	canvas_leftbut_proc = canvas_rightbut_proc = null_proc;
X	}
X
XF_arc *
Xcopy_arc(a)
XF_arc	*a;
X{
X	F_arc	*arc;
X
X	if (NULL == (Arc_malloc(arc))) {
X	    put_msg(Err_mem);
X	    return(NULL);
X	    }
X	*arc = *a;
X	arc->next = NULL;
X	return(arc);
X	}
X
XF_ellipse *
Xcopy_ellipse(e)
XF_ellipse	*e;
X{
X	F_ellipse	*ellipse;
X
X	if (NULL == (Ellipse_malloc(ellipse))) {
X	    put_msg(Err_mem);
X	    return(NULL);
X	    }
X	*ellipse = *e;
X	ellipse->next = NULL;
X	return(ellipse);
X	}
X
XF_line *
Xcopy_line(l)
XF_line	*l;
X{
X	F_line	*line;
X	F_point	*p, *point, *last_point;
X
X	if (NULL == (Line_malloc(line))) {
X	    put_msg(Err_mem);
X	    return(NULL);
X	    }
X	*line = *l;
X	line->points = Point_malloc(point);
X	last_point = point;
X	p = l->points;
X	*point = *p;
X	point->next = NULL;
X	for (p = p->next; p != NULL; p = p->next) {
X	    last_point->next = Point_malloc(point);
X	    if (point == NULL) return(NULL);
X	    *point = *p;
X	    point->next = NULL;
X	    last_point = point;
X	    }
X	line->next = NULL;
X	return(line);
X	}
X
XF_spline *
Xcopy_spline(s)
XF_spline	*s;
X{
X	F_spline	*spline;
X	F_point		*p, *point, *last_point;
X	F_control	*cntrl_pnt, *cp, *last_cntrl_pnt;
X
X	if (NULL == (Spline_malloc(spline))) {
X	    put_msg(Err_mem);
X	    return(NULL);
X	    }
X	*spline = *s;
X	spline->next = NULL;
X
X	Point_malloc(point);
X	last_point = spline->points = point;
X	p = s->points;
X	*point = *p;
X	for (p = p->next; p != NULL; p = p->next) {
X	    last_point->next = Point_malloc(point);
X	    if (point == NULL) return(NULL);
X	    *point = *p;
X	    last_point = point;
X	    }
X	last_point->next = NULL;
X
X	spline->controls = NULL;
X	if (s->controls == NULL) return(spline);
X
X	last_cntrl_pnt = spline->controls = Control_malloc(cntrl_pnt);
X	cp = s->controls;
X	*cntrl_pnt = *cp;
X	for (cp = cp->next; cp != NULL; cp = cp->next) {
X	    last_cntrl_pnt->next = Control_malloc(cntrl_pnt);
X	    if (cntrl_pnt == NULL) return(NULL);
X	    *cntrl_pnt = *cp;
X	    last_cntrl_pnt = cntrl_pnt;
X	    }
X	last_cntrl_pnt->next = NULL;
X
X	return(spline);
X	}
X
XF_text *
Xcopy_text(t)
XF_text	*t;
X{
X	F_text		*text;
X	extern char	*calloc();
X
X	if (NULL == (Text_malloc(text))) {
X	    put_msg(Err_mem);
X	    return(NULL);
X	    }
X	*text = *t;
X	text->cstring = calloc((unsigned)(strlen(t->cstring)+1), sizeof(char));
X	if (text->cstring == NULL) {
X	    free((char*)text);
X	    put_msg(Err_mem);
X	    return(NULL);
X	    }
X	strcpy(text->cstring, t->cstring);
X	text->next = NULL;
X	return(text);
X	}
X
XF_compound *
Xcopy_compound(c)
XF_compound	*c;
X{
X	F_ellipse	*e, *ee;
X	F_arc		*a, *aa;
X	F_line		*l, *ll;
X	F_spline	*s, *ss;
X	F_text		*t, *tt;
X	F_compound	*cc, *ccc, *compound;
X
X	if (NULL == (Compound_malloc(compound))) {
X	    put_msg(Err_mem);
X	    return(NULL);
X	    }
X	compound->nwcorner = c->nwcorner;
X	compound->secorner = c->secorner;
X	compound->arcs = NULL;
X	compound->ellipses = NULL;
X	compound->lines = NULL;
X	compound->splines = NULL;
X	compound->texts = NULL;
X	compound->compounds = NULL;
X	compound->next = NULL;
X	for (e = c->ellipses; e != NULL; e = e->next) {
X	    if (NULL == (ee = copy_ellipse(e))) {
X		put_msg(Err_mem);
X		return(NULL);
X		}
X	    insert_ellipse(&compound->ellipses, ee);
X	    }
X	for (a = c->arcs; a != NULL; a = a->next) {
X	    if (NULL == (aa = copy_arc(a))) {
X		put_msg(Err_mem);
X		return(NULL);
X		}
X	    insert_arc(&compound->arcs, aa);
X	    }
X	for (l = c->lines; l != NULL; l = l->next) {
X	    if (NULL == (ll = copy_line(l))) {
X		put_msg(Err_mem);
X		return(NULL);
X		}
X	    insert_line(&compound->lines, ll);
X	    }
X	for (s = c->splines; s != NULL; s = s->next) {
X	    if (NULL == (ss = copy_spline(s))) {
X		put_msg(Err_mem);
X		return(NULL);
X		}
X	    insert_spline(&compound->splines, ss);
X	    }
X	for (t = c->texts; t != NULL; t = t->next) {
X	    if (NULL == (tt = copy_text(t))) {
X		put_msg(Err_mem);
X		return(NULL);
X		}
X	    insert_text(&compound->texts, tt);
X	    }
X	for (cc = c->compounds; cc != NULL; cc = cc->next) {
X	    if (NULL == (ccc = copy_compound(cc))) {
X		put_msg(Err_mem);
X		return(NULL);
X		}
X	    insert_compound(&compound->compounds, ccc);
X	    }
X	return(compound);
X	}
END_OF_copy.c
if test 7706 -ne `wc -c <copy.c`; then
    echo shar: \"copy.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f draw.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"draw.c\"
else
echo shar: Extracting \"draw.c\" \(7937 characters\)
sed "s/^X//" >draw.c <<'END_OF_draw.c'
X/* 
X *	FIG : Facility for Interactive Generation of figures
X *
X *	Copyright (c) 1988 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU)
X *	March 1988.
X *
X *	%W%	%G%
X*/
X#include "fig.h"
X#include "resources.h"
X#include "object.h"
X#include "paintop.h"
X
Xextern int		pointmarker_shown, compoundbox_shown;
Xextern int		background_color, foreground_color;
Xextern PIXRECTREC	dot;
X
X/*
Xerase_objects(objects)
XF_compound	*objects;
X{
X	erase_arcs(objects->arcs);
X	erase_ellipses(objects->ellipses);
X	erase_lines(objects->lines);
X	erase_texts(objects->texts);
X	erase_splines(objects->splines);
X	erase_compounds(objects->compounds);
X	}
X*/
X
Xerase_splines(splines)
XF_spline	*splines;
X{
X	F_spline	*s;
X
X	pw_batch_on(canvas_pixwin);
X	for (s = splines; s != NULL; s = s->next) {
X	    if (pointmarker_shown) toggle_splinepointmarker(s);
X	    draw_spline(s, ERASE);
X	    };
X	pw_batch_off(canvas_pixwin);
X	}
X
Xerase_ellipses(ellipses)
XF_ellipse	*ellipses;
X{
X	F_ellipse	*e;
X
X	pw_batch_on(canvas_pixwin);
X	for (e = ellipses; e != NULL; e = e->next) {
X	    if (pointmarker_shown) toggle_ellipsepointmarker(e);
X	    draw_ellipse(e, background_color);
X	    };
X	pw_batch_off(canvas_pixwin);
X	}
X
Xerase_arcs(arcs)
XF_arc	*arcs;
X{
X	F_arc	*a;
X
X	pw_batch_on(canvas_pixwin);
X	for (a = arcs; a != NULL; a = a->next) {
X	    if (pointmarker_shown) toggle_arcpointmarker(a);
X	    draw_arc(a, background_color);
X	    };
X	pw_batch_off(canvas_pixwin);
X	}
X
Xerase_compounds(compounds)
XF_compound	*compounds;
X{
X	F_compound	*c;
X
X	for (c = compounds; c != NULL; c = c->next) {
X	    if (compoundbox_shown) draw_compoundbox(c, INV_PAINT);
X	    erase_compound(c);
X	    };
X	}
X
Xerase_lines(lines)
XF_line	*lines;
X{
X	F_line	*l;
X
X	for (l = lines; l != NULL; l = l->next) {
X	    if (pointmarker_shown) toggle_linepointmarker(l);
X	    draw_line(l, ERASE);
X	    };
X	}
X
Xerase_texts(texts)
XF_text	*texts;
X{
X	F_text	*t;
X
X	for (t = texts; t != NULL; t = t->next) {
X	    draw_text(t, INV_PAINT);
X	    };
X	}
X
X/*
Xdraw_objects(objects)
XF_compound	*objects;
X{
X	draw_arcs(objects->arcs);
X	draw_ellipses(objects->ellipses);
X	draw_lines(objects->lines);
X	draw_texts(objects->texts);
X	draw_splines(objects->splines);
X	draw_compounds(objects->compounds);
X	}
X*/
X
Xdraw_ellipses(ellipses)
XF_ellipse	*ellipses;
X{
X	F_ellipse	*e;
X
X	pw_batch_on(canvas_pixwin);
X	for (e = ellipses; e != NULL; e = e->next) {
X	    draw_ellipse(e, foreground_color);
X	    if (pointmarker_shown) toggle_ellipsepointmarker(e);
X	    };
X	pw_batch_off(canvas_pixwin);
X	}
X
Xdraw_arcs(arcs)
XF_arc	*arcs;
X{
X	F_arc	*a;
X
X	pw_batch_on(canvas_pixwin);
X	for (a = arcs; a != NULL; a = a->next) {
X	    draw_arc(a, foreground_color);
X	    if (pointmarker_shown) toggle_arcpointmarker(a);
X	    };
X	pw_batch_off(canvas_pixwin);
X	}
X
Xdraw_lines(lines)
XF_line	*lines;
X{
X	F_line	*l;
X
X	pw_batch_on(canvas_pixwin);
X	for (l = lines; l != NULL; l = l->next) {
X	    draw_line(l, PAINT);
X	    if (pointmarker_shown) toggle_linepointmarker(l);
X	    };
X	pw_batch_off(canvas_pixwin);
X	}
X
Xdraw_splines(splines)
XF_spline	*splines;
X{
X	F_spline	*s;
X
X	pw_batch_on(canvas_pixwin);
X	for (s = splines; s != NULL; s = s->next) {
X	    draw_spline(s, PAINT);
X	    if (pointmarker_shown) toggle_splinepointmarker(s);
X	    };
X	pw_batch_off(canvas_pixwin);
X	}
X
Xdraw_texts(texts)
XF_text	*texts;
X{
X	F_text	*t;
X
X	for (t = texts; t != NULL; t = t->next) {
X	    draw_text(t, PAINT);
X	    };
X	}
X
Xdraw_compounds(compounds)
XF_compound	*compounds;
X{
X	F_compound	*c;
X
X	for (c = compounds; c != NULL; c = c->next) {
X	    draw_compound(c);
X	    if (compoundbox_shown) draw_compoundbox(c, INV_PAINT);
X	    };
X	}
X
X/*	draw arrow heading from (x1, y1) to (x2, y2)	*/
X
Xdraw_arrow(x1, y1, x2, y2, arrow, op)
Xint	x1, y1, x2, y2, op;
XF_arrow	*arrow;
X{
X	float	x, y, xb, yb, dx, dy, l, sina, cosa;
X	int	xc, yc, xd, yd;
X	float	wid = arrow->wid, ht = arrow->ht;
X
X	dx = x2 - x1;  dy = y1 - y2;
X	l = sqrt((double)(dx*dx + dy*dy));
X	sina = dy / l;  cosa = dx / l;
X	xb = x2*cosa - y2*sina;
X	yb = x2*sina + y2*cosa;
X	x = xb - ht;
X	y = yb - wid / 2;
X	xc = x*cosa + y*sina + .5;
X	yc = -x*sina + y*cosa + .5;
X	y = yb + wid / 2;
X	xd = x*cosa + y*sina + .5;
X	yd = -x*sina + y*cosa + .5;
X	pw_vector(canvas_pixwin, xc, yc, x2, y2, op, 1);
X	pw_vector(canvas_pixwin, xd, yd, x2, y2, op, 1);
X	}
X
Xdraw_spline(spline, op)
XF_spline	*spline;
Xint		op;
X{
X	if (int_spline(spline))
X	    draw_intspline(spline, op);
X	else if (spline->type == T_CLOSED_NORMAL)
X	    draw_closed_spline(spline, op);
X	else if (spline->type == T_OPEN_NORMAL)
X	    draw_open_spline(spline, op);
X	}
X
X#define		STACK_DEPTH		32
Xtypedef		struct stack {
X			float	x1, y1, x2, y2, x3, y3, x4, y4;
X			}
X		Stack;
Xstatic Stack	stack[20];
Xstatic Stack	*stack_top;
Xstatic int	stack_count;
X
Xclear_stack()
X{
X	stack_top = stack;
X	stack_count = 0;
X	}
X
Xpush(x1, y1, x2, y2, x3, y3, x4, y4)
Xfloat	x1, y1, x2, y2, x3, y3, x4, y4;
X{
X	stack_top->x1 = x1;
X	stack_top->y1 = y1;
X	stack_top->x2 = x2;
X	stack_top->y2 = y2;
X	stack_top->x3 = x3;
X	stack_top->y3 = y3;
X	stack_top->x4 = x4;
X	stack_top->y4 = y4;
X	stack_top++;
X	stack_count++;
X	}
X
Xint
Xpop(x1, y1, x2, y2, x3, y3, x4, y4)
Xfloat	*x1, *y1, *x2, *y2, *x3, *y3, *x4, *y4;
X{
X	if (stack_count == 0) return(0);
X	stack_top--;
X	stack_count--;
X	*x1 = stack_top->x1;
X	*y1 = stack_top->y1;
X	*x2 = stack_top->x2;
X	*y2 = stack_top->y2;
X	*x3 = stack_top->x3;
X	*y3 = stack_top->y3;
X	*x4 = stack_top->x4;
X	*y4 = stack_top->y4;
X	return(1);
X	}
X
Xdraw_line(line, op)
XF_line	*line;
Xint	op;
X{
X	F_point			*point;
X	int			xx, yy, x, y;
X
X	point = line->points;
X	x = point->x;
X	y = point->y;
X	if (line->points->next == NULL) { /* A single point */
X#ifndef	X11
X	    pw_write(canvas_pixwin, x, y, 1, 1, op, &dot, 0, 0);
X#else
X		XDrawPoint(tool_d, canvas_pixwin, gccache[op], x, y);
X#endif	X11
X	    return;
X	    }
X	if (line->back_arrow) /* backward arrow  */
X	    draw_arrow(point->next->x, point->next->y, x, y, 
X		line->back_arrow, op);
X	for (point = point->next; point != NULL; point = point->next) {
X	    draw_line_segment(line->style, line->style_val, 
X				x, y, point->x, point->y, op);
X	    xx = x; yy = y;
X	    x = point->x;
X	    y = point->y;
X	    }
X	if (line->for_arrow) 
X	    draw_arrow(xx, yy, x, y, line->for_arrow, op);
X	}
X
X#define		round(x)	((int)((x) + .5))
X#define		dash_length	style_val
X#define		dot_gap		style_val
X
Xdraw_line_segment(line_style, style_val, x1, y1, x2, y2, op)
Xint	line_style, x1, y1, x2, y2, op;
Xfloat	style_val;
X{
X	switch (line_style) {
X	    case SOLID_LINE :
X		pw_vector(canvas_pixwin, x1, y1, x2, y2, op, 1);
X		break;
X	    case DASH_LINE : {
X		float	x, y, leng, dx, dy, dash_x, dash_y;
X		float	spacing_leng, space_x, space_y;
X		int	num_spacing;
X
X		dx = x2 - x1;
X		dy = y2 - y1;
X		leng = sqrt((double)(dx*dx + dy*dy));
X		if (leng <= dash_length) {
X		    pw_vector(canvas_pixwin, x1, y1, x2, y2, op, 1);
X		    break;
X		    }
X		dash_x = dash_length * dx / leng;
X		dash_y = dash_length * dy / leng;
X		num_spacing = (leng - dash_length) / (2 * dash_length);
X		spacing_leng = (leng - dash_length * (num_spacing + 1)) /
X				((float)num_spacing);
X		space_x = spacing_leng * dx / leng;
X		space_y = spacing_leng * dy / leng;
X		dx = dash_x + space_x;  dy = dash_y + space_y;
X		for (x = x1, y = y1; leng > 0; 
X			x += dx, y += dy, leng -= dash_length + spacing_leng) {
X		    pw_vector(canvas_pixwin, round(x), round(y), 
X				round(x + dash_x), round(y + dash_y), op, 1);
X		    }
X		break;
X		}
X	    case DOTTED_LINE : {
X		float	x, y, leng, dx, dy, gap_x, gap_y;
X		int	n, color;
X
X		dot_gap += 1.0;
X		dx = x2 - x1;
X		dy = y2 - y1;
X		leng = sqrt((double)(dx*dx + dy*dy)) - 1;
X		n = round(leng/dot_gap);
X		if (op == PAINT)
X		    color = foreground_color;
X		else
X		    color = background_color;
X		if (n <= 1) {
X		    pw_put(canvas_pixwin, x1, y1, color);
X		    pw_put(canvas_pixwin, x2, y2, color);
X		    break;
X		    }
X		dot_gap = leng / n;
X		gap_x = dot_gap * dx / leng;
X		gap_y = dot_gap * dy / leng;
X		for (x = x1, y = y1; n-- >= 0; x += gap_x, y += gap_y)
X		    pw_put(canvas_pixwin, round(x), round(y), color);
X		break;
X		}
X	    }
X	}
END_OF_draw.c
if test 7937 -ne `wc -c <draw.c`; then
    echo shar: \"draw.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f flip.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"flip.c\"
else
echo shar: Extracting \"flip.c\" \(9354 characters\)
sed "s/^X//" >flip.c <<'END_OF_flip.c'
X/* 
X *	FIG : Facility for Interactive Generation of figures
X *
X *	Copyright (c) 1985 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU)
X *	January 1985.
X *	1st revision : Aug 1985.
X *
X *	%W%	%G%
X*/
X#include "fig.h"
X#include "resources.h"
X#include "func.h"
X#include "object.h"
X#include "paintop.h"
X
X#define			TOLERANCE	7
X#define			min(a, b)	(((a) < (b)) ? (a) : (b))
X#define			max(a, b)	(((a) > (b)) ? (a) : (b))
X
Xextern			(*canvas_kbd_proc)();
Xextern			(*canvas_locmove_proc)();
Xextern			(*canvas_leftbut_proc)();
Xextern			(*canvas_middlebut_proc)();
Xextern			(*canvas_rightbut_proc)();
Xextern			null_proc();
Xextern			set_popupmenu();
X
Xextern F_line		*line_search(), *copy_line();
Xextern F_ellipse	*ellipse_search(), *copy_ellipse();
Xextern F_ellipse	*ellipse_point_search();
Xextern F_text		*copy_text();
Xextern F_spline		*spline_search(), *copy_spline();
Xextern F_arc		*arc_point_search(), *copy_arc();
Xextern F_compound	*compound_search(), *copy_compound();
X
Xextern F_compound	objects;
X
Xextern int		flip_axis;
Xextern int		pointmarker_shown;
Xextern int		foreground_color, background_color;
X
Xstatic int		copy;
X			init_flip();
X			init_copynflip();
X
Xflip_selected()
X{
X	canvas_kbd_proc = null_proc;
X	canvas_locmove_proc = null_proc;
X	canvas_leftbut_proc = init_copynflip;
X	canvas_middlebut_proc = init_flip;
X	canvas_rightbut_proc = set_popupmenu;
X	set_cursor(&pick15_cursor);
X	}
X
Xinit_flip(x, y)
Xint	x, y;
X{
X	copy = 0;
X	flip_search(x, y);
X	flip_selected();
X	}
X
Xinit_copynflip(x, y)
Xint	x, y;
X{
X	copy = 1;
X	flip_search(x, y);
X	flip_selected();
X	}
X
Xflip_search(x, y)
Xint	x, y;
X{
X	F_line		*l;
X	F_arc		*a;
X	F_ellipse	*e;
X	F_spline	*s;
X	F_compound	*c;
X	int		px, py;
X
X	if ((l = line_search(x, y, TOLERANCE, &px, &py)) != NULL) {
X	    init_flipline(l, px, py);
X	    }
X	else if ((a = arc_point_search(x, y, TOLERANCE, &px)) != NULL) {
X	    init_fliparc(a, a->point[px].x, a->point[px].y);
X	    }
X	else if ((e = ellipse_point_search(x, y, TOLERANCE, &px)) != NULL) {
X	    if (px == 0) /* start point */
X		init_flipellipse(e, e->start.x, e->start.y);
X	    else
X		init_flipellipse(e, e->end.x, e->end.y);
X	    }
X	else if ((e = ellipse_search(x, y, TOLERANCE, &px, &py)) != NULL) {
X	    init_flipellipse(e, px, py);
X	    }
X	else if ((s = spline_search(x, y, TOLERANCE, &px, &py)) != NULL) {
X	    init_flipspline(s, px, py);
X	    }
X	else if ((c = compound_search(x, y, TOLERANCE, &px, &py)) != NULL) {
X	    init_flipcompound(c, px, py);
X	    }
X	set_modifiedflag();
X	}
X
Xinit_fliparc(a, px, py)
XF_arc	*a;
Xint	px, py;
X{
X	F_arc	*arc;
X
X	win_setmouseposition(canvas_swfd, px, py);
X	if (pointmarker_shown) toggle_arcpointmarker(a);
X	if (copy) {
X	    arc = copy_arc(a);
X	    flip_arc(arc, px, py, flip_axis);
X	    clean_up();
X	    set_action_object(F_CREATE, O_ARC);
X	    insert_arc(&objects.arcs, arc);
X	    }
X	else {
X	    draw_arc(a, background_color);
X	    flip_arc(a, px, py, flip_axis);
X	    clean_up();
X	    set_action_object(F_FLIP, O_ARC);
X	    set_lastaxis(flip_axis);
X	    set_lastposition(px, py);
X	    arc = a;
X	    }
X	draw_arc(arc, foreground_color);
X	if (pointmarker_shown) {
X	    toggle_arcpointmarker(arc);
X	    if (copy) toggle_arcpointmarker(a);
X	    }
X	set_latestarc(arc);
X	}
X
Xinit_flipcompound(c, px, py)
XF_compound	*c;
Xint		px, py;
X{
X	F_compound	*compound;
X
X	win_setmouseposition(canvas_swfd, px, py);
X	set_temp_cursor(&wait_cursor);
X	if (copy) {
X	    compound = copy_compound(c);
X	    flip_compound(compound, px, py, flip_axis);
X	    clean_up();
X	    set_action_object(F_CREATE, O_COMPOUND);
X	    insert_compound(&objects.compounds, compound);
X	    }
X	else {
X	    draw_compoundbox(c, INV_PAINT);
X	    erase_compound(c);
X	    flip_compound(c, px, py, flip_axis);
X	    clean_up();
X	    set_action_object(F_FLIP, O_COMPOUND);
X	    set_lastaxis(flip_axis);
X	    set_lastposition(px, py);
X	    compound = c;
X	    }
X	draw_compoundbox(compound, INV_PAINT);
X	draw_compound(compound);
X	set_latestcompound(compound);
X	set_temp_cursor(cur_cursor);
X	}
X
Xinit_flipellipse(e, px, py)
XF_ellipse	*e;
X{
X	F_ellipse	*ellipse;
X
X	win_setmouseposition(canvas_swfd, px, py);
X	if (pointmarker_shown) toggle_ellipsepointmarker(e);
X	if (copy) {
X	    ellipse = copy_ellipse(e);
X	    flip_ellipse(ellipse, px, py, flip_axis);
X	    clean_up();
X	    set_action_object(F_CREATE, O_ELLIPSE);
X	    insert_ellipse(&objects.ellipses, ellipse);
X	    }
X	else {
X	    draw_ellipse(e, background_color);
X	    flip_ellipse(e, px, py, flip_axis);
X	    clean_up();
X	    set_action_object(F_FLIP, O_ELLIPSE);
X	    set_lastaxis(flip_axis);
X	    set_lastposition(px, py);
X	    ellipse = e;
X	    }
X	draw_ellipse(ellipse, foreground_color);
X	if (pointmarker_shown) {
X	    toggle_ellipsepointmarker(ellipse);
X	    if (copy) toggle_ellipsepointmarker(e);
X	    }
X	set_latestellipse(ellipse);
X	}
X
Xinit_flipline(l, px, py)
XF_line	*l;
Xint	px, py;
X{
X	F_line	*line;
X
X	win_setmouseposition(canvas_swfd, px, py);
X	if (pointmarker_shown) toggle_linepointmarker(l);
X	if (copy) {
X	    line = copy_line(l);
X	    flip_line(line, px, py, flip_axis);
X	    clean_up();
X	    set_action_object(F_CREATE, O_POLYLINE);
X	    insert_line(&objects.lines, line);
X	    }
X	else {
X	    draw_line(l, ERASE);
X	    flip_line(l, px, py, flip_axis);
X	    clean_up();
X	    set_action_object(F_FLIP, O_POLYLINE);
X	    set_lastaxis(flip_axis);
X	    set_lastposition(px, py);
X	    line = l;
X	    }
X	draw_line(line, PAINT);
X	if (pointmarker_shown) {
X	    toggle_linepointmarker(line);
X	    if (copy) toggle_linepointmarker(l);
X	    }
X	set_latestline(line);
X	}
X
Xinit_flipspline(s, px, py)
XF_spline	*s;
Xint		px, py;
X{
X	F_spline	*spline;
X
X	win_setmouseposition(canvas_swfd, px, py);
X	if (pointmarker_shown) toggle_splinepointmarker(s);
X	if (copy) {
X	    spline = copy_spline(s);
X	    flip_spline(spline, px, py, flip_axis);
X	    clean_up();
X	    set_action_object(F_CREATE, O_SPLINE);
X	    insert_spline(&objects.splines, spline);
X	    }
X	else {  /*  delete the original */
X	    draw_spline(s, ERASE);
X	    flip_spline(s, px, py, flip_axis);
X	    clean_up();
X	    set_action_object(F_FLIP, O_SPLINE);
X	    set_lastaxis(flip_axis);
X	    set_lastposition(px, py);
X	    spline = s;
X	    }
X	draw_spline(spline, PAINT);
X	if (pointmarker_shown) {
X	    toggle_splinepointmarker(spline);
X	    if (copy) toggle_splinepointmarker(s);
X	    }
X	set_latestspline(spline);
X	}
X
Xflip_line(l, x, y, flip_axis)
XF_line	*l;
Xint	x, y, flip_axis;
X{
X	F_point	*p;
X
X	switch(flip_axis) {
X	    case 1 :	/*  x axis  */
X		for (p = l->points; p != NULL; p = p->next)
X		    p->y = y + (y - p->y);
X		break;
X	    case 2 :	/*  y axis  */
X		for (p = l->points; p != NULL; p = p->next)
X		    p->x = x + (x - p->x);
X		break;
X	    }
X	}
X
Xflip_spline(s, x, y, flip_axis)
XF_spline	*s;
Xint		x, y, flip_axis;
X{
X	F_point		*p;
X	F_control	*cp;
X
X	switch(flip_axis) {
X	    case 1 :	/*  x axis  */
X		for (p = s->points; p != NULL; p = p->next)
X		    p->y = y + (y - p->y);
X		for (cp = s->controls; cp != NULL; cp = cp->next) {
X		    cp->ly = y + (y - cp->ly);
X		    cp->ry = y + (y - cp->ry);
X		    }
X		break;
X	    case 2 :	/*  y axis  */
X		for (p = s->points; p != NULL; p = p->next)
X		    p->x = x + (x - p->x);
X		for (cp = s->controls; cp != NULL; cp = cp->next) {
X		    cp->lx = x + (x - cp->lx);
X		    cp->rx = x + (x - cp->rx);
X		    }
X		break;
X	    }
X	}
X
Xflip_text(t, x, y, flip_axis)
XF_text	*t;
Xint	x, y, flip_axis;
X{
X	switch(flip_axis) {
X	    case 1 :	/*  x axis  */
X		t->base_y = y + (y - t->base_y);
X		break;
X	    case 2 :	/*  y axis  */
X		t->base_x = x + (x - t->base_x);
X		break;
X	    }
X	}
X
Xflip_ellipse(e, x, y, flip_axis)
XF_ellipse	*e;
Xint		x, y, flip_axis;
X{
X	switch(flip_axis) {
X	    case 1 :	/*  x axis  */
X		e->direction ^= 1;
X		e->center.y = y + (y - e->center.y);
X		e->start.y = y + (y - e->start.y);
X		e->end.y = y + (y - e->end.y);
X		break;
X	    case 2 :	/*  y axis  */
X		e->direction ^= 1;
X		e->center.x = x + (x - e->center.x);
X		e->start.x = x + (x - e->start.x);
X		e->end.x = x + (x - e->end.x);
X		break;
X	    }
X	}
X
Xflip_arc(a, x, y, flip_axis)
XF_arc	*a;
Xint	x, y, flip_axis;
X{
X	switch(flip_axis) {
X	    case 1 :	/*  x axis  */
X		a->direction ^= 1;
X		a->center.y = y + (y - a->center.y);
X		a->point[0].y = y + (y - a->point[0].y);
X		a->point[1].y = y + (y - a->point[1].y);
X		a->point[2].y = y + (y - a->point[2].y);
X		break;
X	    case 2 :	/*  y axis  */
X		a->direction ^= 1;
X		a->center.x = x + (x - a->center.x);
X		a->point[0].x = x + (x - a->point[0].x);
X		a->point[1].x = x + (x - a->point[1].x);
X		a->point[2].x = x + (x - a->point[2].x);
X		break;
X	    }
X	}
X
Xflip_compound(c, x, y, flip_axis)
XF_compound	*c;
Xint		x, y, flip_axis;
X{
X	F_line		*l;
X	F_arc		*a;
X	F_ellipse	*e;
X	F_spline	*s;
X	F_text		*t;
X	int		p, q;
X	
X	switch(flip_axis) {
X	    case 1 :	/*  x axis  */
X		p = y + (y - c->nwcorner.y);
X		q = y + (y - c->secorner.y);
X		c->nwcorner.y = min(p, q);
X		c->secorner.y = max(p, q);
X		break;
X	    case 2 :	/*  y axis  */
X		p = x + (x - c->nwcorner.x);
X		q = x + (x - c->secorner.x);
X		c->nwcorner.x = min(p, q);
X		c->secorner.x = max(p, q);
X		break;
X	    }
X	for (l = c->lines; l != NULL; l = l->next)
X	    flip_line(l, x, y, flip_axis);
X	for (a = c->arcs; a != NULL; a = a->next)
X	    flip_arc(a, x, y, flip_axis);
X	for (e = c->ellipses; e != NULL; e = e->next)
X	    flip_ellipse(e, x, y, flip_axis);
X	for (s = c->splines; s != NULL; s = s->next)
X	    flip_spline(s, x, y, flip_axis);
X	for (t = c->texts; t != NULL; t = t->next)
X	    flip_text(t, x, y, flip_axis);
X	}
END_OF_flip.c
if test 9354 -ne `wc -c <flip.c`; then
    echo shar: \"flip.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f line.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"line.c\"
else
echo shar: Extracting \"line.c\" \(8978 characters\)
sed "s/^X//" >line.c <<'END_OF_line.c'
X/* 
X *	FIG : Facility for Interactive Generation of figures
X *
X *	Copyright (c) 1985 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU)
X *	January 1985.
X *	1st revision : Aug 1985.
X *
X *	%W%	%G%
X*/
X#include "fig.h"
X#include "resources.h"
X#include "alloc.h"
X#include "func.h"
X#include "object.h"
X#include "paintop.h"
X
Xextern			(*canvas_kbd_proc)();
Xextern			(*canvas_locmove_proc)();
Xextern			(*canvas_leftbut_proc)();
Xextern			(*canvas_middlebut_proc)();
Xextern			(*canvas_rightbut_proc)();
Xextern			null_proc();
Xextern			set_popupmenu();
X
Xextern int		fix_x, fix_y, cur_x, cur_y;
X
Xextern int		cur_command;
Xextern int		manhattan_mode, mountain_mode;
Xextern int		latexline_mode, latexarrow_mode;
Xextern int		magnet_mode, latexarrow_mode;
Xextern int		autoforwardarrow_mode, autobackwardarrow_mode;
Xextern int		cur_line_style, line_thickness;
Xextern float		cur_styleval;
Xextern int		cur_color;
Xextern F_compound	objects;
Xextern int		num_point;
Xextern int		latex_endpoint();
X
Xextern F_point		*first_point, *cur_point; 
X
X/*************************** locally global variables *********************/
X
Xstatic int		firstx, firsty;
X			init_line_drawing();
X
Xint			create_lineobject();
X			create_latexobject();
X			determine_angle();
X			freehand_elasticline();
X			latex_elasticline();
X			angle0_elasticline(), angle90_elasticline(); 
X			angle45_elasticline(), angle135_elasticline(); 
X			get_direction(), get_intermediatepoint(),
X			get_latexpoint();
X
X/**********************  polyline and polygon section  **********************/
X
Xline_drawing_selected()
X{
X	canvas_kbd_proc = null_proc;
X	canvas_locmove_proc = null_proc;
X	canvas_leftbut_proc = init_line_drawing;
X	canvas_middlebut_proc = null_proc;
X	canvas_rightbut_proc = set_popupmenu;
X	set_cursor(&arrow_cursor);
X	reset_action_on();
X	}
X
Xinit_line_drawing(x, y)
Xint	x, y;
X{
X	first_point = Point_malloc(cur_point);
X	if (cur_point == NULL) {
X	    blink_msg();
X	    put_msg(Err_mem);
X	    return;
X	    }
X	canvas_rightbut_proc = null_proc;
X	set_action_on();
X	cur_point->x = firstx = fix_x = cur_x = x;
X	cur_point->y = firsty = fix_y = cur_y = y;
X	cur_point->next = NULL;
X	num_point = 1;
X	if (latexline_mode || latexarrow_mode) {
X	    canvas_locmove_proc = latex_elasticline;
X	    canvas_leftbut_proc = get_latexpoint;
X	    canvas_middlebut_proc = create_latexobject;
X	    }
X	else if (manhattan_mode || mountain_mode) {
X	    canvas_locmove_proc = determine_angle;
X	    canvas_leftbut_proc = get_direction;
X	    canvas_middlebut_proc = create_lineobject;
X	    }
X	else {
X	    canvas_locmove_proc = freehand_elasticline;
X	    canvas_leftbut_proc = get_intermediatepoint;
X	    canvas_middlebut_proc = create_lineobject;
X	    }
X	set_temp_cursor(&null_cursor);
X	cur_cursor = &null_cursor;
X	draw_elasticline();
X	}
X
Xdraw_elasticline()
X{
X	pw_vector(canvas_pixwin, fix_x, fix_y, cur_x, cur_y, INV_PAINT,1);
X	}
X
Xfreehand_elasticline(x, y)
Xint	x, y;
X{
X	draw_elasticline();
X	cur_x = x;  
X	cur_y = y;
X	draw_elasticline();
X	}
X
Xdraw_latexline()
X{
X	int  x, y;
X	CURSOR c;
X
X	latex_endpoint(fix_x, fix_y, cur_x, cur_y, &x, &y, latexarrow_mode, (magnet_mode)? 5: 1);
X	pw_vector(canvas_pixwin, fix_x, fix_y, x, y, INV_PAINT,1);
X	c = (x == cur_x  &&  y == cur_y)? &null_cursor: &crosshair_cursor;
X	if (c != cur_cursor) {
X	    set_temp_cursor(c);
X	    cur_cursor = c;
X	    }
X	}
X
Xlatex_elasticline(x, y)
Xint	x, y;
X{
X	draw_latexline();
X	cur_x = x;  
X	cur_y = y;
X	draw_latexline();
X	}
X
Xangle0_elasticline(x, y)
Xint	x, y;
X{
X	if (x == cur_x && y == cur_y) return;
X	pw_vector(canvas_pixwin, fix_x, fix_y, cur_x, cur_y, INV_PAINT,1);
X	cur_x = x;
X	pw_vector(canvas_pixwin, fix_x, fix_y, cur_x, cur_y, INV_PAINT,1);
X	win_setmouseposition(canvas_swfd, cur_x, cur_y);
X	}
X
Xangle90_elasticline(x, y)
Xint	x, y;
X{
X	if (x == cur_x && y == cur_y) return;
X	pw_vector(canvas_pixwin, fix_x, fix_y, cur_x, cur_y, INV_PAINT,1);
X	cur_y = y;
X	pw_vector(canvas_pixwin, fix_x, fix_y, cur_x, cur_y, INV_PAINT,1);
X	win_setmouseposition(canvas_swfd, cur_x, cur_y);
X	}
X
Xangle45_elasticline(x, y)
Xint	x, y;
X{
X	if (x == cur_x && y == cur_y) return;
X	pw_vector(canvas_pixwin, fix_x, fix_y, cur_x, cur_y, INV_PAINT,1);
X	if (abs(x - cur_x) < abs(y - cur_y)) {
X	    cur_x += cur_y - y;
X	    cur_y = y;
X	    }
X	else {
X	    cur_y -= x - cur_x;
X	    cur_x = x;
X	    }
X	pw_vector(canvas_pixwin, fix_x, fix_y, cur_x, cur_y, INV_PAINT,1);
X	win_setmouseposition(canvas_swfd, cur_x, cur_y);
X	}
X
Xangle135_elasticline(x, y)
Xint	x, y;
X{
X	if (x == cur_x && y == cur_y) return;
X	pw_vector(canvas_pixwin, fix_x, fix_y, cur_x, cur_y, INV_PAINT,1);
X	if (abs(x - cur_x) < abs(y - cur_y)) {
X	    cur_x += y - cur_y;
X	    cur_y = y;
X	    }
X	else {
X	    cur_y += x - cur_x;
X	    cur_x = x;
X	    }
X	pw_vector(canvas_pixwin, fix_x, fix_y, cur_x, cur_y, INV_PAINT,1);
X	win_setmouseposition(canvas_swfd, cur_x, cur_y);
X	}
X
Xget_direction(x, y)
Xint	x, y;
X{
X	(*canvas_locmove_proc) (x, y);
X	canvas_locmove_proc = determine_angle;
X	get_intermediatepoint(cur_x, cur_y);
X	}
X
Xdetermine_angle(x, y)
Xint	x, y;
X{
X	float	angle, dx, dy;
X
X	dx = x - fix_x;  dy = fix_y - y;
X	if (sqrt((double)(dx*dx + dy*dy)) < 7) return;
X	if (dx == 0)
X	    angle = -90;
X	else
X	    angle = 180 * atan((double)(dy / dx)) / 3.1416;
X
X	if (manhattan_mode) {
X	    if (mountain_mode) {
X		if (angle < -67.5) canvas_locmove_proc = angle90_elasticline;
X		else if (angle < -22.5) canvas_locmove_proc = angle135_elasticline;
X		else if (angle <  22.5) canvas_locmove_proc = angle0_elasticline;
X		else if (angle <  67.5) canvas_locmove_proc = angle45_elasticline;
X		else canvas_locmove_proc = angle90_elasticline;
X		}
X	    else {
X		if (angle < -45) canvas_locmove_proc = angle90_elasticline;
X		else if (angle < 45) canvas_locmove_proc = angle0_elasticline;
X		else canvas_locmove_proc = angle90_elasticline;
X		}
X	    }
X	else {
X	    if (angle < 0) canvas_locmove_proc = angle135_elasticline;
X	    else canvas_locmove_proc = angle45_elasticline;
X	    }
X	    
X	(*canvas_locmove_proc)(x, y);
X	}
X
Xget_latexpoint(x, y)
Xint	x, y;
X{
X	draw_latexline();
X	latex_endpoint(fix_x, fix_y, x, y, &cur_x, &cur_y, latexarrow_mode, (magnet_mode)? 5: 1);
X	if (cur_cursor != &null_cursor) {
X	    set_temp_cursor(&null_cursor);
X	    cur_cursor = &null_cursor;
X	    }
X	win_setmouseposition(canvas_swfd, cur_x, cur_y);
X	get_intermediatepoint(cur_x, cur_y);
X	}
X
Xget_intermediatepoint(x, y)
Xint	x, y;
X{
X	draw_elasticline();  /* erase elastic line */
X	cur_x = x;
X	cur_y = y;
X	if (cur_command == F_POLYLINE || cur_command == F_POLYGON)
X	    draw_line_segment(cur_line_style, cur_styleval, fix_x, fix_y, x, y, 
X				PAINT);
X	else
X	    draw_elasticline();
X	num_point++;
X	fix_x = x;
X	fix_y = y;
X	draw_elasticline();
X	append_point(fix_x, fix_y, &cur_point);
X	}
X
Xcreate_latexobject(x, y)
Xint	x, y;
X{
X	if (x != fix_x || y != fix_y || num_point == 1) {
X	    draw_latexline();
X	    latex_endpoint(fix_x, fix_y, x, y, &cur_x, &cur_y, latexarrow_mode, (magnet_mode)? 5: 1);
X	    if (cur_cursor != &null_cursor) {
X		set_temp_cursor(&null_cursor);
X		cur_cursor = &null_cursor;
X		}
X	    win_setmouseposition(canvas_swfd, cur_x, cur_y);
X	    }
X	create_lineobject(cur_x, cur_y);
X	}
X
Xcreate_lineobject(x, y)
Xint	x, y;
X{
X	extern F_arrow	*forward_arrow(), *backward_arrow();
X	F_point		*p, *q;
X	F_line		*line;
X	int		dot;
X
X	dot = 0;
X	if (x != fix_x || y != fix_y) {
X	    get_intermediatepoint(x, y);
X	    draw_elasticline();
X	    }
X	else if (num_point == 1) {
X	    dot = 1;
X	    get_intermediatepoint(x, y);
X	    draw_elasticline();
X	    }
X	if (NULL == (Line_malloc(line))) {
X	    put_msg(Err_mem);
X	    line_drawing_selected();
X	    return;
X	    }
X	line->type = T_POLYLINE;
X	line->style = cur_line_style;
X	line->thickness = line_thickness;
X	line->style_val = cur_styleval;
X	line->color = cur_color;
X	line->depth = 0;
X	line->area_fill = NULL;
X	line->pen = NULL;
X	line->points = first_point;
X	line->next = NULL;
X	line->for_arrow = NULL;
X	line->back_arrow = NULL;
X	if (cur_command == F_POLYGON) {
X	    if (num_point >= 3) {
X		line->type = T_POLYGON;
X		num_point++;
X		append_point(firstx, firsty, &cur_point);
X		draw_line_segment(cur_line_style, cur_styleval, 
X			firstx, firsty, fix_x, fix_y, PAINT);
X		}
X	    }
X	else if (dot) {
X	    pw_vector(canvas_pixwin, fix_x, fix_y, cur_x, cur_y, PAINT, 1);
X	    line->style = SOLID_LINE;
X	    }
X	else if (num_point > 1) {
X	    if (autoforwardarrow_mode) {
X		line->for_arrow = forward_arrow();
X		for (p = line->points; p != cur_point; q = p, p = p->next);
X		draw_arrow(q->x, q->y, p->x, p->y, line->for_arrow, PAINT);
X		}
X	    if (autobackwardarrow_mode) {
X		line->back_arrow = backward_arrow();
X		p = line->points->next;
X		draw_arrow(p->x, p->y, firstx, firsty, line->back_arrow, PAINT);
X		}
X	    }
X	clean_up();
X	set_action_object(F_CREATE, O_POLYLINE);
X	insert_line(&objects.lines, line);
X	set_latestline(line);
X	set_modifiedflag();
X	line_drawing_selected();
X	}
X
Xappend_point(x, y, point)
Xint	x, y;
XF_point	**point;
X{
X	F_point	*p;
X
X	if (NULL == (Point_malloc(p))) {
X	    put_msg(Err_mem);
X	    return;
X	    }
X	p->x = x;
X	p->y = y;
X	p->next = NULL;
X	(*point)->next = p;
X	*point = p;
X	}
END_OF_line.c
if test 8978 -ne `wc -c <line.c`; then
    echo shar: \"line.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 5 \(of 11\).
cp /dev/null ark5isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 11 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Mike Wexler(wyse!mikew)    Phone: (408)433-1000 x1330