[comp.sources.unix] v14i021: Device-independant graphics system, with drivers

rsalz@bbn.com (Rich Salz) (04/06/88)

Submitted-by: Joe Dellinger <joe@hanauma.STANFORD.EDU>
Posting-number: Volume 14, Issue 21
Archive-name: vplot/part16

#! /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 16 (of 24)."
# Wrapped by rsalz@fig.bbn.com on Fri Mar 25 11:47:26 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Vplot_Kernel/filters/include/vplotfonts/makefont.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Vplot_Kernel/filters/include/vplotfonts/makefont.c'\"
else
echo shar: Extracting \"'Vplot_Kernel/filters/include/vplotfonts/makefont.c'\" \(13926 characters\)
sed "s/^X//" >'Vplot_Kernel/filters/include/vplotfonts/makefont.c' <<'END_OF_FILE'
X/*
X * Copyright 1987 the Board of Trustees of the Leland Stanford Junior
X * University. Official permission to use this software is included in
X * the documentation. It authorizes you to use this file for any
X * non-commercial purpose, provided that this copyright notice is not
X * removed and that any modifications made to this file are commented
X * and dated in the style of my example below.
X */
X
X/*
X *
X *  source file:   ./filters/include/vplotfonts/makefont.c
X *
X * Joe Dellinger (SEP), June 11 1987
X *	Inserted this sample edit history entry.
X *	Please log any further modifications made to this file:
X * Joe Dellinger Oct 18 1987
X *	Made arrays allocated dynamically
X */
X
X/*
X * This program converts easily understandable "Vplot font" files into
X * an "include" form which is suitable for being included into gentext.c,
X * and also simultaneously into a binary ("bin") form that can be loaded at
X * runtime by gentext.c. (The Makefile in this directory shows how the
X * several resulting files must be combined.)
X *
X * makefont font_name < Vplot_font > Vplot_font.include
X *
X * If no font_name is given, it will be called "XXXXX".
X *
X * A "Vplot font" file has the following form:
X * Line 1:   start  end
X * These are the ASCII values of the beginning and ending characters
X * which will be in this font.
X * (Beginning and ending as in lowest and highest numbered in the ASCII
X * collating sequence... it is OK to not have every character in that interval)
X * Line 2: letter line space
X * Space between letters, space between lines, width of a space.
X * Line 3: top cap half base bottom
X * Vertical coordinates for "top" (Top of highest normal character in font,
X * typically), "cap" (Top of typical capital letter), "half" (What you align
X * on for vertical centering), "base" (Bottom of most letters, except those
X * with descenders), "bottom" (Bottom of lowest normal descender)
X * N Lines: Lig val1 val2 val3 ...
X * The first number is the integer ascii value of a glyph which is a ligature
X * of the ascii characters with value val1, val2, ... (up to 6)
X * A blank line signifies the end of the ligatures.
X * Start of a character line: e left right char symb
X * 'e' is simply the Vplot character for "erase", and is fixed.
X * "char" tells what ASCII code to assign this glyph to... (need be in no
X * particular order!) If "char" is outside the normal ASCII range it can also
X * be represented \num , where num is the "ASCII" number of the glyph. num
X * is NOT restricted to be less than 256! These characters can be accessed
X * via the \vnum command of gentext.
X * left, right, give the left and right half-widths
X * of the character (it is assumed that all characters are centered at
X * coordinate zero left and right), symb gives the vertical coordinate for
X * centering if this character is used as a symbol. If "left", "right",
X * or "symb" are unknown, these may be replaced instead by "5555" and
X * this program will calculate them for you. (Also leftright=0 set inside
X * this program will force such calculation of all left and right widths,
X * as will symbol=0 force such calculation of all vertical centering
X * coordinates. Instead of 5555, "symb" can also simply be omitted.)
X * Move line: m xcoordinate ycoordinate
X * Start of actual glyph coordinates... you must always start with a move.
X * Coordinates must be LESS THAN 64 in absolute value.
X * Draw line: d xcoordinate ycoordinate
X * Typically the next line will be a draw.
X * Start polygon line: A npts
X * It is also possible to put in a polygon.
X * Polygon line: tab xcoordinate ycoordinate
X * there should be following a Start Polygon line npts lines of coordinates,
X * each beginning with a tab or a space.
X * Continue in this way until the next 'e' signals the start of the next
X * character.
X *
X * Files in this format may be viewed using plas:
X * plas < Vplot_font | ?pen xcenter=0 ycenter=0 scale=150 ...
X *
X * Refer to the pen.vplot_font file given here as an example.
X *
X * - Joe Dellinger, Stanford University Dept of Earth Science
X */
X
X#include <stdio.h>
X#include "../params.h"
extern char    *malloc ();
X
X#define EOCBIT 0x8000	/* END OF CHARACTER MARK OR POLYGON BIT */
X#define DRAWBIT 0x4000	/* DRAW BIT */
X#define XBIT 0x0040
X#define YBIT 0x2000
X#define UNDEFINED	-1
X
X/* Too big a number to be a possible width or height, which is bounded by 64 */
X#define MAGIC		5555
X#define MAX_LENGTH	10000	/* Max number of lines in input Vplot file */
X#define MAX_FONT	32768	/* Max number of symbols in a font */
X#define MAX_STRING	10	/* Max length of char number */
X
int             length[7] =
X{
X 0, 0, 0, 0, 0, 0, 0
X};
int             length2[7] =
X{
X 0, 0, 0, 0, 0, 0, 0
X};
X
main (argc, argv)
X    int             argc;
X    char          **argv;
X{
char           *mde, *cp;
int            *x, *y, *z, *xp, *yp, *zp;
char           *ch, *chp;
int            *addr;
int             addr_index;
int             xout, xmax, xmin, ymin, ymax, nc = 0;
int            *lwidth, *rwidth;
int            *symb;
int             pad, leftright, symbol;
char            string[133];
int             start, end;
int             first = 1;
int             letter, line, space, top, cap, half, base, bottom;
int             left, right, vsymb, count;
char            name[100];
int             i, j, iaddr;
int             fd;
unsigned short  ushort;
short           sshort;
int             integer;
int             lengtht;
int             lig[7];
X
X    mde = (char *) malloc (MAX_LENGTH * sizeof (char));
X    x = (int *) malloc (MAX_LENGTH * sizeof (int));
X    y = (int *) malloc (MAX_LENGTH * sizeof (int));
X    z = (int *) malloc (MAX_LENGTH * sizeof (int));
X    ch = (char *) malloc (MAX_LENGTH * MAX_STRING * sizeof (char));
X    addr = (int *) malloc (MAX_FONT * sizeof (int));
X    lwidth = (int *) malloc (MAX_FONT * sizeof (int));
X    rwidth = (int *) malloc (MAX_FONT * sizeof (int));
X    symb = (int *) malloc (MAX_FONT * sizeof (int));
X
X    for (i = 0; i < MAX_FONT; i++)
X    {
X	addr[i] = UNDEFINED;
X	lwidth[i] = UNDEFINED;
X	rwidth[i] = UNDEFINED;
X    }
X    for (i = 0; i < MAX_LENGTH; i++)
X    {
X	x[i] = MAGIC;
X	y[i] = MAGIC;
X	z[i] = MAGIC;
X    }
X
X    xp = x;
X    yp = y;
X    zp = z;
X    cp = mde;
X    chp = ch;
X
X/*
X * Change these next 3 lines in order to add padding or to always ignore
X * the given width and height information
X */
X    pad = 0;
X    leftright = 1;
X    symbol = 1;
X
X
X    if (argc == 1)
X    {
X	strcpy (name, "XXXXX");
X    }
X    else
X    {
X	strcpy (name, argv[1]);
X    }
X    strcat (name, "_");
X
X    gets (string);
X    sscanf (string, "%d %d", &start, &end);
X    gets (string);
X    sscanf (string, "%d %d %d", &letter, &line, &space);
X    space -= 2 * letter;
X    gets (string);
X    sscanf (string, "%d %d %d %d %d", &top, &cap, &half, &base, &bottom);
X
X    sprintf (string, "%slig", name);
X    fd = creat (string, 0777);
X    printf ("int %slig[] =\n{\n", name);
X
X    while (1)
X    {
X	gets (string);
X/* At most 6 characters in a ligature! */
X	lig[0] = 0;
X	i = sscanf (string, "%d %d %d %d %d %d %d",
X		 lig, lig + 1, lig + 2, lig + 3, lig + 4, lig + 5, lig + 6);
X	if (i <= 1)
X	{
X	    printf ("%d,  ", 0);
X	    integer = 0;
X	    write (fd, (char *) &integer, sizeof (int));
X	    length[6] += sizeof (int);
X
X	    printf ("\n};\n\n");
X	    close (fd);
X	    break;
X	}
X	else
X	{
X	    printf ("%d,  ", i - 1);
X	    integer = i - 1;
X	    write (fd, (char *) &integer, sizeof (int));
X	    length[6] += sizeof (int);
X
X	    printf ("%d, ", lig[0]);
X	    integer = lig[0];
X	    write (fd, (char *) &integer, sizeof (int));
X	    length[6] += sizeof (int);
X
X	    for (j = 1; j < i; j++)
X	    {
X		printf ("%d,", lig[j]);
X		integer = lig[j];
X		write (fd, (char *) &integer, sizeof (int));
X		length[6] += sizeof (int);
X	    }
X	    printf ("\n");
X	}
X    }
X
X    while (gets (string))
X    {
X	*chp = '\0';
X	*(chp + 1) = '\0';
X	*(chp + 2) = '\0';
X	sscanf (string, "%c %d %d %s %d", cp++, xp++, yp++, chp, zp++);
X	chp += MAX_STRING;
X	nc++;
X    }
X    *cp = 'e';
X    *chp = '\0';
X    nc++;
X
X    printf ("unsigned short %svec[] =\n{\n", name);
X    sprintf (string, "%ssvec", name);
X    fd = creat (string, 0777);
X
X    for (i = 0, iaddr = 0; i < nc; ++i)
X    {
X	switch (mde[i])
X	{
X	case ('e'):
X	    /* Things to do when ending a character */
X	    if (!first)
X	    {
X		xout = EOCBIT;
X		if (!leftright || left == MAGIC || right == MAGIC)
X		{
X		    lwidth[addr_index] = -xmin + pad / 2.;
X		    rwidth[addr_index] = xmax + pad / 2.;
X		}
X		else
X		{
X		    lwidth[addr_index] = left;
X		    rwidth[addr_index] = right;
X		}
X		if (!symbol || vsymb == MAGIC)
X		{
X		    symb[addr_index] = (ymax + ymin) / 2;
X		}
X		else
X		{
X		    symb[addr_index] = vsymb;
X		}
X	    }
X	    else
X		first = 0;
X
X	    /* Things to do when beginning a character */
X	    if (ch[i * MAX_STRING + 0] != '\0')
X	    {
X		count = 0;
X		ymax = -10000;
X		ymin = 10000;
X		xmax = -10000;
X		xmin = 10000;
X		if (ch[i * MAX_STRING + 0] != '\\' || ch[i * MAX_STRING + 1] == '\0')
X		{
X		    addr_index = ch[i * MAX_STRING + 0];
X		}
X		else
X		{
X		    sscanf (&ch[i * MAX_STRING + 0], "\\%d ", &addr_index);
X		}
X		if (addr_index < start || addr_index > end)
X		{
X		    fprintf (stderr, "Character value %d out of promised range %d to %d!\n", addr_index, start, end);
X		    exit (1);
X		}
X		addr_index -= start;
X		addr[addr_index] = iaddr;
X		left = x[i];
X		right = y[i];
X		vsymb = z[i];
X	    }
X	    break;
X	case 'A':
X	    count = x[i];
X	    if (count < 3)
X	    {
X		fprintf (stderr, "Polygon must have more than 2 vertices!\n");
X		exit (2);
X	    }
X	    /* Don't increment iaddr, no output */
X	    continue;
X	    break;
X	case '\t':
X	    mde[i] = ' ';
X	case ' ':
X	    count--;
X	case ('d'):
X	case ('m'):
X	    xout = x[i] < 0 ? -(x[i]) : x[i];
X	    if (x[i] < 0)
X		xout |= XBIT;
X	    xout |= ((y[i] < 0 ? -(y[i]) : y[i]) << 7);
X	    if (y[i] < 0)
X		xout |= YBIT;
X	    if (mde[i] == 'd')
X		xout |= DRAWBIT;
X	    else
X	    if (mde[i] == ' ')
X	    {
X		xout |= DRAWBIT;
X		if (count > 0)
X		    xout |= EOCBIT;
X	    }
X
X	    xmax = x[i] < xmax ? xmax : x[i];
X	    xmin = x[i] > xmin ? xmin : x[i];
X	    ymax = y[i] < ymax ? ymax : y[i];
X	    ymin = y[i] > ymin ? ymin : y[i];
X	    break;
X	default:
X	    /* ignore this line */
X	    continue;
X	    break;
X	}
X
X	/*
X	 * Only increment pointer for those things which output something,
X	 * and also the first time. 
X	 */
X	iaddr++;
X	if (i > 0)
X	{
X	    printf ("%d,", xout);
X	    ushort = xout;
X	    write (fd, (char *) &ushort, sizeof (unsigned short));
X	    length[5] += sizeof (unsigned short);
X	    if (xout == EOCBIT)
X		printf ("\n");
X	}
X    }				/* end for loop  */
X    close (fd);
X
X/*
X * Check info
X */
X    sprintf (string, "%scheck", name);
X    fd = creat (string, 0777);
X    write (fd, (char *) "Vplot Binary fonT  \n", 20);
X    integer = FONTCHECK;
X    write (fd, (char *) &integer, sizeof (int));
X    close (fd);
X
X/*
X * Now write out all the Binary information.
X * We will write out each different sort of thing into a different
X * file, and then use "cat" to put them all together.
X * Keep track of how long each piece is as we write it out
X * so that we construct the "table of contents" to the concatenated file.
X */
X
X    sprintf (string, "%saddr", name);
X    fd = creat (string, 0777);
X
X    printf ("};\n\n\nint %saddr[] =\n{\n", name);
X    for (i = 0; i <= end - start; ++i)
X    {
X	printf ("%d,", addr[i]);
X	integer = addr[i];
X	write (fd, (char *) &integer, sizeof (int));
X	length[1] += sizeof (int);
X    }
X    close (fd);
X
X    sprintf (string, "%swidthl", name);
X    fd = creat (string, 0777);
X
X    printf ("\n};\n\n\nshort %swidthl[] =\n{\n", name);
X    for (i = 0; i <= end - start; ++i)
X    {
X	printf ("%d,", lwidth[i]);
X	sshort = lwidth[i];
X	write (fd, (char *) &sshort, sizeof (short));
X	length[2] += sizeof (short);
X    }
X    close (fd);
X
X    sprintf (string, "%swidthr", name);
X    fd = creat (string, 0777);
X
X    printf ("\n};\n\n\nshort %swidthr[] =\n{\n", name);
X    for (i = 0; i <= end - start; ++i)
X    {
X	printf ("%d,", rwidth[i]);
X	sshort = rwidth[i];
X	write (fd, (char *) &sshort, sizeof (short));
X	length[3] += sizeof (short);
X    }
X    close (fd);
X
X    sprintf (string, "%ssymbol", name);
X    fd = creat (string, 0777);
X
X    printf ("\n};\n\n\nshort %ssymbol[] =\n{\n", name);
X    for (i = 0; i <= end - start; ++i)
X    {
X	printf ("%d,", symb[i]);
X	sshort = symb[i];
X	write (fd, (char *) &sshort, sizeof (short));
X	length[4] += sizeof (short);
X    }
X    close (fd);
X
X    printf ("\n};\n\n\n");
X
X    printf ("short %sdim[] = {%d, %d, %d, %d, %d, %d, %d, %d, %d, %d};\n",
X       name, bottom, base, half, cap, top, letter, line, space, start, end);
X    sprintf (string, "%sdim", name);
X    fd = creat (string, 0777);
X    sshort = bottom;
X    write (fd, (char *) &sshort, sizeof (short));
X    sshort = base;
X    write (fd, (char *) &sshort, sizeof (short));
X    sshort = half;
X    write (fd, (char *) &sshort, sizeof (short));
X    sshort = cap;
X    write (fd, (char *) &sshort, sizeof (short));
X    sshort = top;
X    write (fd, (char *) &sshort, sizeof (short));
X    sshort = letter;
X    write (fd, (char *) &sshort, sizeof (short));
X    sshort = line;
X    write (fd, (char *) &sshort, sizeof (short));
X    sshort = space;
X    write (fd, (char *) &sshort, sizeof (short));
X    sshort = start;
X    write (fd, (char *) &sshort, sizeof (short));
X    sshort = end;
X    write (fd, (char *) &sshort, sizeof (short));
X    length[0] += 10 * sizeof (short);
X    close (fd);
X
X/*
X * Length is an array which says how long each piece is;
X * Length2 says at what offset each begins.
X * Lengtht gives the total length of the whole file (not including the
X * table of contents itself, which goes at the beginning and is of
X * fixed length).
X */
X
X    lengtht = length[0];
X    for (i = 1; i < 7; i++)
X    {
X	length2[i] = length2[i - 1] + length[i - 1];
X	lengtht += length[i];
X    }
X
X    sprintf (string, "%sheader", name);
X    fd = creat (string, 0777);
X    write (fd, (char *) &lengtht, sizeof (int));
X    write (fd, (char *) length2, 7 * sizeof (int));
X    close (fd);
X}
END_OF_FILE
if test 13926 -ne `wc -c <'Vplot_Kernel/filters/include/vplotfonts/makefont.c'`; then
    echo shar: \"'Vplot_Kernel/filters/include/vplotfonts/makefont.c'\" unpacked with wrong size!
fi
# end of 'Vplot_Kernel/filters/include/vplotfonts/makefont.c'
fi
if test -f 'Vplot_Kernel/filters/loclib/getpar_scan.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Vplot_Kernel/filters/loclib/getpar_scan.c'\"
else
echo shar: Extracting \"'Vplot_Kernel/filters/loclib/getpar_scan.c'\" \(14981 characters\)
sed "s/^X//" >'Vplot_Kernel/filters/loclib/getpar_scan.c' <<'END_OF_FILE'
X# include "stdio.h"
X# define U(x) x
X# define NLSTATE yyprevious=YYNEWLINE
X# define BEGIN yybgin = yysvec + 1 +
X# define INITIAL 0
X# define YYLERR yysvec
X# define YYSTATE (yyestate-yysvec-1)
X# define YYOPTIM 1
X# define YYLMAX 200
X# define output(c) putc(c,yyout)
X# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==10?(yylineno++,yytchar):yytchar)==EOF?0:yytchar)
X# define unput(c) {yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar;}
X# define yymore() (yymorfg=1)
X# define ECHO fprintf(yyout, "%s",yytext)
X# define REJECT { nstr = yyreject(); goto yyfussy;}
int yyleng; extern char yytext[];
int yymorfg;
extern char *yysptr, yysbuf[];
int yytchar;
FILE *yyin ={stdin}, *yyout ={stdout};
extern int yylineno;
struct yysvf { 
X	struct yywork *yystoff;
X	struct yysvf *yyother;
X	int *yystops;};
struct yysvf *yyestate;
extern struct yysvf yysvec[], *yybgin;
X/* lexical scanning for fast getpar */
X/* Revised 3-8-86 stew  Added time stamp to enable older method of handling
X *			multiple tags.  Moved par= intiialization to
X *			separate routine to avoid code duplication.
X */
X#include <ctype.h>
X#include "fastpar.h"
X#undef input
X#define input() ((int) *(input_stack[input_depth]++))
X#undef unput
X/* The redundant  =(c) insures side effects of expressions occur */
X#define unput(c) (*(--(input_stack[input_depth]))=(c))
X#define yywrap() getpar_pop_input()
X#define yylex() getpar_lexscan()
X#define yylook() getpar_yylook()
X
X#define MAX_INPUT_DEPTH 10
static int input_depth = -1;
static char *input_stack[MAX_INPUT_DEPTH];
static char *dealloc_stack[MAX_INPUT_DEPTH];
X
static struct {
X	char *tag;  int tlen;
X	char *val;  int vlen;
X       } yy;
X
X
static int  SMALLBLOCK = 4096;
static char
X*suballoc (size)
int size;
X{
X	static char *myblock = (char *) NULL; static int bytesleft = 0;
X	char *ptr; extern char *alloc();
X
X	if(size > SMALLBLOCK) return(alloc(size));
X	else
X	  { 
X	    if(bytesleft < size)
X	       {
X	        myblock = alloc (SMALLBLOCK);
X		bytesleft = SMALLBLOCK - size;
X	       }
X	   else
X	       {
X		bytesleft -= size;
X	       }
X	   ptr = myblock;
X	   myblock += size;
X	   return(ptr);
X	  }
X}
X
static int  prime[10] = {31,29,23,19,17,13,11,7,5,3};
int getpar_hash(array,len)
register char *array;
register int len;
X{
X  register int hash;
X  register int i;
X  if(len >10) len=10;
X  hash=0;
X  for(i=0; i<len; i++)
X    hash += array[i]*prime[i];
X  return(hash);
X}
X
X/* workhorse to decode par files; shell already parses command line */
getpar_scan(queue,qlen)
register hash_item **queue;
register int qlen;
X{
X extern int yylex();
X
X while(yylex()) {
X	getpar_hash_store(queue,qlen,yy.tag,yy.val,yy.tlen,yy.vlen);
X	if(yy.tlen == 3 && 0 == bcmp(yy.tag,"par",3))
X		getpar_stack_par(yy.val);
X	}
X}
X
X/* read parfile into core and put buffer on scan input stack */
getpar_stack_par(val)
char *val;
X{
X register char *buffer;
X register int fd, len;
X extern int file(), fsize();
X extern char *alloc();
X
X    fd = file(val,0);
X    len = fsize(fd);
X    buffer=alloc(len+3);
X    buffer[0]='\n';
X    read(fd,buffer+1,len);
X    buffer[len+1]='\n';
X    buffer[len+2]='\0';
X    getpar_push_input(buffer,1);
X    close(fd);
X}
X
X /* return 1 if match; 0 otherwise */
X#define getpar_hash_compare(next1,tag1,tlen1)  \
X ((next1)->tlen == (tlen1) && 0 == bcmp((next1)->tag,tag1,tlen1))
X
getpar_hash_store(q,qlen,tag,val,tlen,vlen)
hash_item **q;
register char *tag, *val;
register int tlen;
int qlen, vlen;
X{
X register hash_item *hold, *next;
X static int storetime = 0;
X
X hold=(hash_item *) (q+getpar_hash(tag,tlen)%qlen);
X next=hold->next;
X
X while(next != ((hash_item *) NULL)) {
X	if(getpar_hash_compare(next,tag,tlen) ) {
X		next->val = val; next->vlen = vlen;
X		next->timestamp = storetime++; return;
X		}
X	hold = next; next = next->next;
X	}
X
X hold->next = next = (hash_item *) suballoc(sizeof(hash_item));
X next->next = (hash_item *) NULL;
X next->tlen = tlen;
X next->tag = tag;
X next->vlen = vlen;
X next->val = val;
X next->timestamp = storetime++;
X}
X
hash_item *getpar_hash_lookup(q,qlen,tag,tlen)
register hash_item **q;
register char *tag;
register int tlen;
register int qlen;
X{
X register hash_item *next;
X
X next = *(q + getpar_hash(tag,tlen)%qlen);
X
X while(next != ((hash_item *) NULL) ) {
X	if(getpar_hash_compare(next,tag,tlen)) break;
X	next = next->next;
X	}
X return(next);
X}
X
X# define FOUNDTAG 2
X# define YYNEWLINE 10
yylex(){
int nstr; extern int yyprevious;
while((nstr = yylook()) >= 0)
yyfussy: switch(nstr){
case 0:
if(yywrap()) return(0); break;
case 1:
X	{
X			 yy.vlen = yyleng-2; yy.val=suballoc(yy.vlen+1);
X			 yy.vlen = massage(yytext+1,yy.val,yy.vlen,yytext[0]);
X			 yy.val[yy.vlen]='\0'; BEGIN 0; return(FOUNDTAG);
X			 }
break;
case 2:
X	{
X			 yy.vlen = yyleng-2; yy.val=suballoc(yy.vlen+1);
X			 yy.vlen = massage(yytext+1,yy.val,yy.vlen,yytext[0]);
X			 yy.val[yy.vlen]='\0'; BEGIN 0; return(FOUNDTAG);
X			 }
break;
case 3:
X{
X				 yy.vlen=yyleng; yy.val=suballoc(yy.vlen+1);
X		 		 bcopy(yytext,yy.val,yy.vlen+1); BEGIN 0;
X				 return(FOUNDTAG);
X				 }
break;
case 4:
X{
X			 yy.tlen=yyleng-1; yy.tag=suballoc(yy.tlen+1);
X			 bcopy(yytext,yy.tag,yy.tlen);
X			 yy.tag[yy.tlen]='\0'; BEGIN FOUNDTAG;
X			 }
break;
case 5:
X{
X			 yy.tlen=yyleng-2; yy.tag=suballoc(yy.tlen+1);
X			 bcopy(yytext+1,yy.tag,yy.tlen);
X			 yy.tag[yy.tlen]='\0'; BEGIN FOUNDTAG;
X			 }
break;
case 6:
X/* skip comment lines */;
break;
case 7:
case 8:
X;
break;
case -1:
break;
default:
fprintf(yyout,"bad switch yylook %d",nstr);
X} return(0); }
X/* end of yylex */
X	getpar_push_input(buffer,dealloc)
X	register char *buffer;
X	register int dealloc;
X	{
X	  if(input_depth++ == MAX_INPUT_DEPTH)
X		err("too many nested par files\n");
X	  input_stack[input_depth] = buffer;
X	  if(dealloc) dealloc_stack[input_depth] = buffer;
X	  else dealloc_stack[input_depth] = (char *) NULL;
X	}
X
X	int
X	yywrap()
X	{
X	  if(((char *) NULL) != dealloc_stack[input_depth]) {
X		free(dealloc_stack[input_depth]);
X		dealloc_stack[input_depth] = (char *) NULL;
X		}
X	  input_stack[input_depth--] = (char *) NULL;
X	  if(input_depth < 0) return(1);
X	  return(0);
X	}
X
X	static int
X	massage(string,out,len,quote)
X	register char *string, *out;
X	register int len, quote;
X	{
X 	register int i,j;
X	
X	for(i=0,j=0; i<len-1; j++) {
X		out[j]=string[i++];
X		if(out[j]==quote) /* compress doubled quotes */
X			if(string[i]==quote) i++;
X		}
X	if(i<len) out[j++] = string[i];
X	return(j);
X	}
int yyvstop[] ={
X0,
X
X7,
X0,
X
X7,
X0,
X
X8,
X0,
X
X6,
X7,
X0,
X
X7,
X0,
X
X3,
X7,
X0,
X
X3,
X7,
X0,
X
X3,
X8,
X0,
X
X7,
X0,
X
X7,
X0,
X
X3,
X6,
X7,
X0,
X
X3,
X7,
X0,
X
X6,
X0,
X
X-4,
X0,
X
X3,
X0,
X
X3,
X0,
X
X2,
X0,
X
X2,
X0,
X
X1,
X0,
X
X1,
X0,
X
X3,
X6,
X0,
X
X3,
X0,
X
X3,
X-4,
X0,
X
X-5,
X0,
X
X4,
X0,
X
X3,
X-5,
X0,
X
X3,
X4,
X0,
X
X5,
X0,
X
X3,
X5,
X0,
X0};
X# define YYTYPE char
struct yywork { YYTYPE verify, advance; } yycrank[] ={
X0,0,	0,0,	1,5,	0,0,	
X0,0,	3,10,	0,0,	0,0,	
X0,0,	0,0,	1,6,	1,7,	
X0,0,	3,11,	3,12,	18,0,	
X12,0,	12,0,	0,0,	21,0,	
X21,0,	0,0,	0,0,	0,0,	
X0,0,	0,0,	0,0,	35,0,	
X35,0,	0,0,	37,0,	37,0,	
X0,0,	0,0,	0,0,	1,5,	
X0,0,	2,8,	3,13,	12,0,	
X1,5,	4,15,	21,0,	3,14,	
X25,23,	28,26,	1,5,	11,0,	
X11,0,	3,10,	35,0,	0,0,	
X17,17,	37,0,	0,0,	17,17,	
X17,17,	17,17,	17,17,	17,17,	
X17,17,	17,17,	17,17,	17,17,	
X17,17,	0,0,	1,5,	2,9,	
X17,32,	3,10,	11,0,	4,16,	
X6,17,	6,17,	6,17,	6,17,	
X6,17,	6,17,	6,17,	6,17,	
X6,17,	6,17,	6,17,	6,17,	
X6,17,	6,17,	6,17,	6,17,	
X6,17,	6,17,	6,17,	6,17,	
X6,17,	6,17,	6,17,	6,17,	
X6,17,	6,17,	0,0,	0,0,	
X0,0,	0,0,	17,17,	11,22,	
X6,17,	6,17,	6,17,	6,17,	
X6,17,	6,17,	6,17,	6,17,	
X6,17,	6,17,	6,17,	6,17,	
X6,17,	6,17,	6,17,	6,17,	
X6,17,	6,17,	6,17,	6,17,	
X6,17,	6,17,	6,17,	6,17,	
X6,17,	6,17,	8,18,	0,0,	
X0,0,	0,0,	0,0,	0,0,	
X16,0,	16,0,	8,18,	8,0,	
X0,0,	0,0,	0,0,	0,0,	
X0,0,	0,0,	0,0,	0,0,	
X0,0,	0,0,	0,0,	0,0,	
X0,0,	0,0,	0,0,	0,0,	
X0,0,	0,0,	0,0,	16,0,	
X0,0,	0,0,	0,0,	8,18,	
X0,0,	0,0,	0,0,	0,0,	
X8,18,	0,0,	0,0,	0,0,	
X16,30,	0,0,	8,18,	9,19,	
X0,0,	0,0,	9,19,	9,19,	
X9,19,	9,19,	9,19,	9,19,	
X9,19,	9,19,	9,19,	9,19,	
X16,31,	0,0,	0,0,	9,20,	
X16,30,	0,0,	8,18,	9,19,	
X9,19,	9,19,	9,19,	9,19,	
X9,19,	9,19,	9,19,	9,19,	
X9,19,	9,19,	9,19,	9,19,	
X9,19,	9,19,	9,19,	9,19,	
X9,19,	9,19,	9,19,	9,19,	
X9,19,	9,19,	9,19,	9,19,	
X9,19,	0,0,	0,0,	0,0,	
X0,0,	9,19,	0,0,	9,19,	
X9,19,	9,19,	9,19,	9,19,	
X9,19,	9,19,	9,19,	9,19,	
X9,19,	9,19,	9,19,	9,19,	
X9,19,	9,19,	9,19,	9,19,	
X9,19,	9,19,	9,19,	9,19,	
X9,19,	9,19,	9,19,	9,19,	
X9,19,	10,21,	0,0,	13,23,	
X0,0,	14,26,	22,0,	22,0,	
X0,0,	10,0,	10,0,	13,23,	
X13,24,	14,26,	14,27,	15,29,	
X0,0,	0,0,	0,0,	20,33,	
X0,0,	0,0,	29,29,	0,0,	
X15,0,	0,0,	0,0,	20,0,	
X20,0,	22,0,	0,0,	29,0,	
X10,0,	0,0,	10,21,	0,0,	
X13,25,	0,0,	14,26,	10,21,	
X0,0,	13,23,	22,22,	14,28,	
X0,0,	10,21,	0,0,	13,23,	
X15,29,	14,26,	20,0,	0,0,	
X20,33,	15,29,	0,0,	29,29,	
X0,0,	20,33,	22,34,	15,29,	
X29,29,	0,0,	22,22,	20,33,	
X31,35,	10,21,	29,29,	13,23,	
X0,0,	14,26,	30,0,	30,0,	
X31,0,	31,0,	0,0,	0,0,	
X32,36,	0,0,	0,0,	15,29,	
X34,37,	0,0,	0,0,	20,33,	
X32,0,	32,0,	29,29,	0,0,	
X34,0,	34,0,	0,0,	0,0,	
X0,0,	30,0,	0,0,	31,0,	
X0,0,	31,35,	0,0,	0,0,	
X0,0,	0,0,	31,35,	0,0,	
X0,0,	0,0,	30,30,	32,0,	
X31,35,	32,36,	0,0,	34,0,	
X0,0,	34,37,	32,36,	0,0,	
X0,0,	0,0,	34,37,	0,0,	
X32,36,	0,0,	30,31,	0,0,	
X34,37,	0,0,	30,30,	0,0,	
X31,35,	0,0,	0,0,	0,0,	
X0,0,	0,0,	0,0,	0,0,	
X0,0,	0,0,	0,0,	0,0,	
X32,36,	0,0,	0,0,	0,0,	
X34,37,	0,0,	0,0,	0,0,	
X0,0};
struct yysvf yysvec[] ={
X0,	0,	0,
yycrank+-1,	0,		0,	
yycrank+-2,	yysvec+1,	0,	
yycrank+-4,	0,		0,	
yycrank+-6,	yysvec+3,	0,	
yycrank+0,	0,		yyvstop+1,
yycrank+7,	0,		yyvstop+3,
yycrank+0,	0,		yyvstop+5,
yycrank+-129,	0,		yyvstop+7,
yycrank+130,	0,		yyvstop+10,
yycrank+-252,	0,		yyvstop+12,
yycrank+-38,	yysvec+10,	yyvstop+15,
yycrank+-7,	yysvec+10,	yyvstop+18,
yycrank+-254,	0,		yyvstop+21,
yycrank+-256,	0,		yyvstop+23,
yycrank+-266,	yysvec+8,	yyvstop+25,
yycrank+-127,	yysvec+10,	yyvstop+29,
yycrank+7,	yysvec+6,	0,	
yycrank+-5,	yysvec+8,	yyvstop+32,
yycrank+0,	yysvec+9,	0,	
yycrank+-270,	0,		yyvstop+34,
yycrank+-10,	yysvec+10,	yyvstop+36,
yycrank+-249,	yysvec+10,	yyvstop+38,
yycrank+0,	yysvec+13,	0,	
yycrank+0,	0,		yyvstop+40,
yycrank+10,	0,		yyvstop+42,
yycrank+0,	yysvec+14,	0,	
yycrank+0,	0,		yyvstop+44,
yycrank+6,	0,		yyvstop+46,
yycrank+-273,	yysvec+8,	yyvstop+48,
yycrank+-313,	yysvec+10,	yyvstop+51,
yycrank+-315,	0,		yyvstop+53,
yycrank+-327,	0,		yyvstop+56,
yycrank+0,	0,		yyvstop+58,
yycrank+-331,	0,		yyvstop+60,
yycrank+-18,	yysvec+10,	yyvstop+63,
yycrank+0,	0,		yyvstop+66,
yycrank+-21,	yysvec+10,	yyvstop+68,
X0,	0,	0};
struct yywork *yytop = yycrank+396;
struct yysvf *yybgin = yysvec+1;
char yymatch[] ={
X00  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
X01  ,011 ,012 ,01  ,01  ,01  ,01  ,01  ,
X01  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
X01  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
X011 ,01  ,'"' ,01  ,01  ,01  ,01  ,047 ,
X01  ,01  ,01  ,01  ,01  ,'-' ,01  ,01  ,
X'-' ,'-' ,'-' ,'-' ,'-' ,'-' ,'-' ,'-' ,
X'-' ,'-' ,01  ,01  ,01  ,01  ,01  ,01  ,
X01  ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
X'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
X'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
X'A' ,'A' ,'A' ,01  ,01  ,01  ,01  ,'-' ,
X01  ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
X'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
X'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
X'A' ,'A' ,'A' ,01  ,01  ,01  ,01  ,01  ,
X0};
char yyextra[] ={
X0,0,0,0,1,1,0,0,
X0,0,0,0,0,0,0,0,
X0};
X/*	ncform	4.1	83/08/11	*/
X
int yylineno =1;
X# define YYU(x) x
X# define NLSTATE yyprevious=YYNEWLINE
char yytext[YYLMAX];
struct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp;
char yysbuf[YYLMAX];
char *yysptr = yysbuf;
int *yyfnd;
extern struct yysvf *yyestate;
int yyprevious = YYNEWLINE;
yylook(){
X	register struct yysvf *yystate, **lsp;
X	register struct yywork *yyt;
X	struct yysvf *yyz;
X	int yych;
X	struct yywork *yyr;
X# ifdef LEXDEBUG
X	int debug;
X# endif
X	char *yylastch;
X	/* start off machines */
X# ifdef LEXDEBUG
X	debug = 0;
X# endif
X	if (!yymorfg)
X		yylastch = yytext;
X	else {
X		yymorfg=0;
X		yylastch = yytext+yyleng;
X		}
X	for(;;){
X		lsp = yylstate;
X		yyestate = yystate = yybgin;
X		if (yyprevious==YYNEWLINE) yystate++;
X		for (;;){
X# ifdef LEXDEBUG
X			if(debug)fprintf(yyout,"state %d\n",yystate-yysvec-1);
X# endif
X			yyt = yystate->yystoff;
X			if(yyt == yycrank){		/* may not be any transitions */
X				yyz = yystate->yyother;
X				if(yyz == 0)break;
X				if(yyz->yystoff == yycrank)break;
X				}
X			*yylastch++ = yych = input();
X		tryagain:
X# ifdef LEXDEBUG
X			if(debug){
X				fprintf(yyout,"char ");
X				allprint(yych);
X				putchar('\n');
X				}
X# endif
X			yyr = yyt;
X			if ( (int)yyt > (int)yycrank){
X				yyt = yyr + yych;
X				if (yyt <= yytop && yyt->verify+yysvec == yystate){
X					if(yyt->advance+yysvec == YYLERR)	/* error transitions */
X						{unput(*--yylastch);break;}
X					*lsp++ = yystate = yyt->advance+yysvec;
X					goto contin;
X					}
X				}
X# ifdef YYOPTIM
X			else if((int)yyt < (int)yycrank) {		/* r < yycrank */
X				yyt = yyr = yycrank+(yycrank-yyt);
X# ifdef LEXDEBUG
X				if(debug)fprintf(yyout,"compressed state\n");
X# endif
X				yyt = yyt + yych;
X				if(yyt <= yytop && yyt->verify+yysvec == yystate){
X					if(yyt->advance+yysvec == YYLERR)	/* error transitions */
X						{unput(*--yylastch);break;}
X					*lsp++ = yystate = yyt->advance+yysvec;
X					goto contin;
X					}
X				yyt = yyr + YYU(yymatch[yych]);
X# ifdef LEXDEBUG
X				if(debug){
X					fprintf(yyout,"try fall back character ");
X					allprint(YYU(yymatch[yych]));
X					putchar('\n');
X					}
X# endif
X				if(yyt <= yytop && yyt->verify+yysvec == yystate){
X					if(yyt->advance+yysvec == YYLERR)	/* error transition */
X						{unput(*--yylastch);break;}
X					*lsp++ = yystate = yyt->advance+yysvec;
X					goto contin;
X					}
X				}
X			if ((yystate = yystate->yyother) && (yyt= yystate->yystoff) != yycrank){
X# ifdef LEXDEBUG
X				if(debug)fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1);
X# endif
X				goto tryagain;
X				}
X# endif
X			else
X				{unput(*--yylastch);break;}
X		contin:
X# ifdef LEXDEBUG
X			if(debug){
X				fprintf(yyout,"state %d char ",yystate-yysvec-1);
X				allprint(yych);
X				putchar('\n');
X				}
X# endif
X			;
X			}
X# ifdef LEXDEBUG
X		if(debug){
X			fprintf(yyout,"stopped at %d with ",*(lsp-1)-yysvec-1);
X			allprint(yych);
X			putchar('\n');
X			}
X# endif
X		while (lsp-- > yylstate){
X			*yylastch-- = 0;
X			if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){
X				yyolsp = lsp;
X				if(yyextra[*yyfnd]){		/* must backup */
X					while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){
X						lsp--;
X						unput(*yylastch--);
X						}
X					}
X				yyprevious = YYU(*yylastch);
X				yylsp = lsp;
X				yyleng = yylastch-yytext+1;
X				yytext[yyleng] = 0;
X# ifdef LEXDEBUG
X				if(debug){
X					fprintf(yyout,"\nmatch ");
X					sprint(yytext);
X					fprintf(yyout," action %d\n",*yyfnd);
X					}
X# endif
X				return(*yyfnd++);
X				}
X			unput(*yylastch);
X			}
X		if (yytext[0] == 0  /* && feof(yyin) */)
X			{
X			yysptr=yysbuf;
X			return(0);
X			}
X		yyprevious = yytext[0] = input();
X		if (yyprevious>0)
X			output(yyprevious);
X		yylastch=yytext;
X# ifdef LEXDEBUG
X		if(debug)putchar('\n');
X# endif
X		}
X	}
yyback(p, m)
X	int *p;
X{
if (p==0) return(0);
while (*p)
X	{
X	if (*p++ == m)
X		return(1);
X	}
return(0);
X}
X	/* the following are only used in the lex library */
yyinput(){
X	return(input());
X	}
yyoutput(c)
X  int c; {
X	output(c);
X	}
yyunput(c)
X   int c; {
X	unput(c);
X	}
END_OF_FILE
if test 14981 -ne `wc -c <'Vplot_Kernel/filters/loclib/getpar_scan.c'`; then
    echo shar: \"'Vplot_Kernel/filters/loclib/getpar_scan.c'\" unpacked with wrong size!
fi
# end of 'Vplot_Kernel/filters/loclib/getpar_scan.c'
fi
if test -f 'Vplot_Kernel/filters/main_vplot.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Vplot_Kernel/filters/main_vplot.c'\"
else
echo shar: Extracting \"'Vplot_Kernel/filters/main_vplot.c'\" \(12441 characters\)
sed "s/^X//" >'Vplot_Kernel/filters/main_vplot.c' <<'END_OF_FILE'
X/*
X * Copyright 1987 the Board of Trustees of the Leland Stanford Junior
X * University. Official permission to use this software is included in
X * the documentation. It authorizes you to use this file for any
X * non-commercial purpose, provided that this copyright notice is not
X * removed and that any modifications made to this file are commented
X * and dated in the style of my example below.
X */
X
X/*
X *
X *  source file:   ./filters/main_vplot.c
X *
X * Joe Dellinger (SEP), June 11 1987
X *	Inserted this sample edit history entry.
X *	Please log any further modifications made to this file:
X */
X
X/*
X * generic pen -  VPLOT filter for whatever
X * Keyword: graphics vplot pen
X */
X
X/*
X *  Edit History
X *
X *  "Pen" written 1979 for a PDP-11, Rob Clayton
X *  Eventually modified into "tekpen" by Glenn Kroeger early 1984
X *  Made device independent and extensively modified into "screenpen"
X *  by Joe Dellinger 1984 through 1985
X *  Reworked to be more GKS-like by Glenn and Michel Debiche, 1985
X *  Cleaned up, Joe 1986
X *  Added 'wstype' variable so one program can support multiple
X *		terminal types		-- Chuck Karish, Nov 1986
X *  Raster capability added -- Joe and Steve Cole 1987
X *  Cleaned up and documented for public release, Joe Dellinger 1987
X *  Whew!
X *
X *  Changed system("stty ...") calls to ioctls.  The system() calls
X *  are hanging for jon under 6.0.  Added sigblock() to cleanup
X *  error handler to avoid exit() problems.  Also shut down output
X *  translations to tty graphics terminals.  Stewart A. Levin  6-23-87
X *
X *  Shut down output translations with LLITOUT now that I've gotten
X *  the magic incantation that makes it stick on buggy BSD systems.
X *  Stewart A. Levin  7-5-87
X *
X *  Made "scale" a global so dovplot could use it.
X *  Joe Dellinger Oct 18 1987
X *
X *  Gather up all the incoming plot files, and then have "genreader"
X *  process them all. This allows someone to make a vplot-editor that
X *  can re-order plot files, repeat them, etc, etc. Added "buffer_input"
X *  and "allow_pipe" as part of this.
X *  Joe Dellinger Dec 16 1987
X *
X *  Added "hclose_done" to SEPlib version.
X *  Joe Dellinger Dec 19 1987
X *
X *  Added "reset_parameters" to frontend and dovplot
X *  Joe Dellinger Jan 8 1988
X *
X *  Added group_name, group_number, pltname
X *  Joe Dellinger Jan 20 1988
X *
X *  Inverted window should mean that everything gets clipped.
X *  Make it possible to override standard defaults for SEP.
X *  Joe Dellinger Feb 12 1988
X *
X *  Just use getpar, not getpar_.
X *  Joe Dellinger Feb 16 1988
X *
X *  Split "frontend.c" into 3 files,
X *  main_vplot, init_vplot, and proc_vplot.
X *  This so that other programs can use vplot and still keep their own
X *  mains.
X *  Joe Dellinger Feb 18 1988
X */
X
X#ifdef SEP
extern void     sepwhere ();
extern char     sepoutwhere[];
extern char     sepheadwhere[];
X
X#define		OUT	sepoutwhere
X#define		HEAD	sepheadwhere
X#define		SOURCE  "\014Joe Dellinger, Stanford Exploration Project\014"
X#include	<sep.main>
X#define		GETPAR	fetch
X
X#else SEP
X#include	<stdio.h>
X#include	<math.h>
X#define		GETPAR	getpar
X#endif SEP
X
X
X#include	<sys/ioctl.h>
X#include	<sys/types.h>
X#include	<sys/stat.h>
X#include	<sgtty.h>
X#include	<ctype.h>
X#include	<strings.h>
X#include	<signal.h>
X
X#include	<vplot.h>
X
X#include	"./include/params.h"	/* for machine dependencies */
X#include	"./include/enum.h"
X#include	"./include/err.h"
X#include	"./include/attrcom.h"
X#include	"./include/intcom.h"
X#include	"./include/mesgcom.h"
X#include	"./include/erasecom.h"
X#include	"./include/closestat.h"
X#include	"./include/pat.h"
X#include	"./include/vertex.h"
X#include	"./include/round.h"
X#include	"./include/extern.h"
X
X
X/*
X * signal catching
X */
int             cleanup ();
int             sigvec ();
int             signum[] =
X{
X SIGHUP, SIGINT, SIGQUIT, SIGIOT, SIGEMT, SIGPIPE, SIGTERM, SIGXCPU, SIGXFSZ
X};
X#define NOSIG (sizeof (signum)/sizeof (int))	/* number of signals caught */
struct sigvec   errhandler =
X{
X cleanup, 0, 0
X};
struct sigvec   ignored =
X{
X SIG_IGN, 0, 0
X};
struct sigvec   oldvec;
X
extern struct sgttyb tty_clean_state;	/* external for utilities */
extern int      tty_clean_local_mode;
extern int      allow_pipe;
extern char     callname[];
extern int      nplots;
extern int      allowecho;
X
X/*
X * file and terminal control variables
X */
extern int      genmessage ();
extern int      (*message) ();
extern FILE    *pltout;
X
FILE           *fopen ();
FILE           *fdopen ();
X
extern FILE    *pltinarray[MAXIN];
extern char     pltinname[MAXIN][MAXFLEN + 1];
extern int      infileno;
extern int      pltoutfd;
X
X/*
X * This routine is responsible for finding the input files,
X * setting up the input and output, and calling init_vplot
X * and proc_vplot. You can link to vplot without using this
X * routine, and so have your own main. See vplothacker.doc to
X * learn how to do this. (Especially you, Jon!)
X */
X
X#ifdef SEP
int             xxargc;
char          **xxargv;
char            scrap[MAXFLEN + 1];
int             hclose_done = NO;
int             fake_header = NO;
MAIN ()
X
X#else SEP
int             xargc;
char          **xargv;	/* for getpar */
main (argc, argv)
X    int             argc;
X    char           *argv[];
X#endif SEP
X{
X#ifndef SEP
int             in_isatty, num_vplot, docflag;
char            instring[MAXFLEN + 1];
X#endif SEP
X
char           *cptr;
char           *stringptr;
int             ii;
FILE           *temp;
char            string[MAXFLEN + 1];
X
X
X    nulldev ();			/* Just to make sure it gets loaded */
X
X#ifndef SEP
X    if (stringptr = rindex (argv[0], '/'))
X	strncpy (callname, ++stringptr, 24);
X    else
X	strncpy (callname, argv[0], 24);
X#else SEP
X    if (stringptr = rindex (xargv[0], '/'))
X	strncpy (callname, ++stringptr, 24);
X    else
X	strncpy (callname, xargv[0], 24);
X#endif SEP
X
X#ifdef SEP
X    pltout = outstream;
X    if (redout ())
X    {
X	getch ("head", "s", scrap);
X	if (strcmp (scrap, "/dev/null") == 0 &&
X	    strcmp (sepheadwhere, "/dev/null") == 0)
X	{
X	    fake_header = YES;
X	    getch ("out", "s", scrap);
X	    if (strcmp (scrap, "stdout") != 0)
X	    {
X		/*
X		 * They probably want the header output into the redirected
X		 * output. (SEP only) 
X		 */
X		headstream = stdout;
X		headfd = fileno (headstream);
X		Puthead ("Fake header for special device-dependent data only.\n");
X		Puthead ("To get input history passed along, over-ride default with head = stdout\n");
X		/*
X		 * If the output is going into a file, then put this
X		 * information into the header file. 
X		 */
X		if (strcmp (scrap, "/dev/tty") != 0)
X		{
X		    fullnm (scrap, MAXFLEN + 1);
X		    Puthead ("\tin=%s\n", scrap);
X		}
X		else
X		{
X		    Puthead ("\tin= nowhere\n");
X		    Puthead ("\t(Sorry, the data went to the terminal; it's gone now!)\n");
X		}
X
X		/*
X		 * Have to use my own puthead routine. Standard ones such as
X		 * putch, etc, don't work with this. They remember where the
X		 * header used to be. Puthead does this, checking for
X		 * headstream not null. This is so this will work without
X		 * sep, as well. 
X		 */
X	    }
X	}
X    }
X
X    if (!fake_header)
X    {
X	Puthead ("\tn3 = unknown\n\t(Sorry, SEPlib requires the header be closed now)\n");
X	hclose ();
X	hclose_done = YES;
X    }
X#else SEP
X
X    /*
X     * If no arguments, and not in a pipeline, self document "wstype="
X     * doesn't count as an argument for our purposes 
X     */
X    in_isatty = isatty ((int) (fileno (stdin)));
X    xargc = argc;
X    xargv = argv;
X    docflag = 0;
X    if (argc == 1)
X	docflag = 1;
X    if ((argc == 2) && !strncmp ("wstype=", argv[1], 7))
X	docflag = 1;
X    getpar ("selfdoc", "1", &docflag);
X    if (in_isatty && docflag)
X    {
X	for (ii = 0; ii < doclength; ii++)
X	    printf ("%s\n", documentation[ii]);
X	exit (0);
X    }
X
X    pltout = stdout;
X#endif SEP
X
X    /*
X     * This getpar for signal is only included for debugging purposes. By
X     * using a signal option, one can stop any signals from being caught. 
X     */
X    if (getpar ("signal", "s", string) == 0)
X    {
X	for (ii = 0; ii < NOSIG; ++ii)
X	{
X	    if (-1 == sigvec (signum[ii], &ignored, &oldvec))
X	    {
X		ERR (FATAL, name, "Bad sigvec call!");
X	    }
X	    if (oldvec.sv_handler == ignored.sv_handler)
X		(void) sigvec (signum[ii], &oldvec, (struct sigvec *) NULL);
X	    else
X		(void) sigvec (signum[ii], &errhandler, (struct sigvec *) NULL);
X	}
X    }
X
X/*
X ****************************************************************************
X * Set all global variables, open the device.
X ****************************************************************************
X */
X    init_vplot ();
X
X/*
X ****************************************************************************
X * Start processing input files
X ****************************************************************************
X */
X
X#ifdef SEP
X    if (instream != NULL)
X    {
X	if (!allow_pipe && isapipe (fileno (instream)))
X	{
X	    ERR (WARN, name, "cannot use pipes with this device");
X	}
X	else
X	{
X	    if (infileno >= MAXIN)
X	    {
X		ERR (FATAL, name, "too many input files (%d max)", MAXIN);
X	    }
X	    strcpy (pltinname[infileno], "Pipe");
X	    pltinarray[infileno] = instream;
X	    infileno++;
X	}
X    }
X    else
X	ERR (WARN, name, "cannot read input pipe");
X
X    xxargc = xargc;
X    xxargv = xargv;
X
X    for (xxargc--, xxargv++; xxargc; xxargc--, xxargv++)
X    {
X	cptr = *xxargv;
X	while (*cptr)
X	{
X	    if (*cptr == '=')
X		break;
X	    cptr++;
X	}
X	if (*cptr)
X	    continue;
X	/* Ignore dummy arguments */
X	if (strcmp (*xxargv, "dummy") == 0)
X	    continue;
X	if ((temp = fopen (*xxargv, "r")) == NULL)
X	{
X	    ERR (WARN, name, "cannot open header file %s", *xxargv);
X	    continue;
X	}
X	fclose (temp);
X	if (getch2 ("in", "s", string, *xxargv))
X	{
X	    if ((temp = fopen (string, "r")) != NULL)
X	    {
X		Puthead ("   +  %s --> in = %s\n", *xxargv, string);
X		if (infileno >= MAXIN)
X		{
X		    ERR (FATAL, name, "too many input files (%d max)", MAXIN);
X		}
X		strcpy (pltinname[infileno], string);
X		pltinarray[infileno] = temp;
X		infileno++;
X	    }
X	    else
X	    {
X		ERR (WARN, name, "cannot open input file %s", string);
X	    }
X	}
X    }
X
X#else SEP
X    /*
X     * first process pipe input 
X     */
X    if (!in_isatty)
X    {
X	if (!allow_pipe)
X	{
X	    ERR (WARN, name, "cannot use pipes with this device");
X	}
X	else
X	{
X	    if (infileno >= MAXIN)
X	    {
X		ERR (FATAL, name, "too many input files (%d max)", MAXIN);
X	    }
X	    strcpy (pltinname[infileno], "stdin");
X	    pltinarray[infileno] = stdin;
X	    infileno++;
X	}
X    }
X
X    /*
X     * next process in= inputfiles If they set num_vplot, also look for in1=
X     * in2= etc 
X     */
X
X    num_vplot = 0;
X    getpar ("numvplot", "d", &num_vplot);
X
X    for (ii = 0; ii <= num_vplot; ii++)
X    {
X	if (ii == 0)
X	    strcpy (instring, "in");
X	else
X	    sprintf (instring, "in%d", ii);
X
X	if (getpar (instring, "s", string))
X	{
X	    if ((temp = fopen (string, "r")) != NULL)
X	    {
X		if (infileno >= MAXIN)
X		{
X		    ERR (FATAL, name, "too many input files (%d max)", MAXIN);
X		}
X		strcpy (pltinname[infileno], string);
X		pltinarray[infileno] = temp;
X		infileno++;
X	    }
X	    else
X	    {
X		ERR (WARN, name, "cannot open %s", string);
X	    }
X	}
X    }
X
X    /*
X     * finally process input line for non-getpar arguments and assume they
X     * are also input files 
X     */
X    for (argc--, argv++; argc; argc--, argv++)
X    {
X	cptr = *argv;
X	while (*cptr)
X	{
X	    if (*cptr == '=')
X		break;
X	    cptr++;
X	}
X	if (*cptr)
X	    continue;
X	cptr = *argv;
X	if ((temp = fopen (cptr, "r")) != NULL)
X	{
X	    if (infileno >= MAXIN)
X	    {
X		ERR (FATAL, name, "too many input files (%d max)", MAXIN);
X	    }
X	    strcpy (pltinname[infileno], cptr);
X	    pltinarray[infileno] = temp;
X	    infileno++;
X	}
X	else
X	{
X	    ERR (WARN, name, "cannot open %s", cptr);
X	}
X    }
X#endif SEP
X
X/*
X ****************************************************************************
X * Go do the plots
X ****************************************************************************
X */
X    proc_vplot ();
X
X#ifdef SEP
X    if (!hclose_done)
X    {
X	Puthead ("\tn3=%d\n", nplots);
X	hclose ();
X	hclose_done = YES;
X    }
X#endif SEP
X
X    exit (0);
X}
X
cleanup ()
X{
X    sigblock (~(SIGKILL | SIGSTOP | SIGCONT));
X    dev.close (CLOSE_INTERRUPT);
X    message (MESG_ON);
X    ERR (COMMENT, name, "Interrupted out.");
X    dev.close (CLOSE_DONE);
X    /*
X     * Let them see what they are doing again 
X     */
X    if (!allowecho)
X    {
X	ioctl (pltoutfd, TIOCLSET, (char *) (&tty_clean_local_mode));
X	ioctl (pltoutfd, TIOCSETN, (char *) (&tty_clean_state));
X    }
X    exit (0);
X}
END_OF_FILE
if test 12441 -ne `wc -c <'Vplot_Kernel/filters/main_vplot.c'`; then
    echo shar: \"'Vplot_Kernel/filters/main_vplot.c'\" unpacked with wrong size!
fi
# end of 'Vplot_Kernel/filters/main_vplot.c'
fi
echo shar: End of archive 16 \(of 24\).
cp /dev/null ark16isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 24 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
-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.