131817Sdenise /*
231817Sdenise  *
331817Sdenise  * dver: VAX Versatec driver for the new troff
431817Sdenise  *
531817Sdenise  * Authors:	BWK(BELL)
631817Sdenise  *		VCAT(berkley)
731817Sdenise  *		Richard L. Hyde, Perdue University
831817Sdenise  *		and David Slattengren, U.C. Berkeley
931817Sdenise  *
1031817Sdenise  *		Jaap Akkerhuis
1131817Sdenise  *			added Versatec80 support
1231817Sdenise  *			removed Berkeley specific stuff (like nstips)
1331817Sdenise  *			by #ifdef BERK, allthough a lot of things are
1431817Sdenise  *			around (like polygon and gremlin...)
1531817Sdenise  *
16*31820Sdenise  *		Carol Orange and Denise Draper
1731817Sdenise  *			Changed to make the versatec a Harris typesetter
1831817Sdenise  *			look-alike.
1931817Sdenise  */
20*31820Sdenise #ifndef LINT
21*31820Sdenise static char sccsid[] = "@(#)ndver80	1.2 (CWI) 87/07/10";
22*31820Sdenise #endif
2331817Sdenise /*******************************************************************************
2431817Sdenise 
2531817Sdenise     output language from troff:
2631817Sdenise     all numbers are character strings
2731817Sdenise 
2831817Sdenise #..\n	comment
2931817Sdenise sn	size in points
3031817Sdenise fn	font as number from 1 to n
3131817Sdenise cx	ascii character x
3231817Sdenise Cxyz	funny char \(xyz. terminated by white space
3331817Sdenise Hn	go to absolute horizontal position n
3431817Sdenise Vn	go to absolute vertical position n (down is positive)
3531817Sdenise hn	go n units horizontally (relative)
3631817Sdenise vn	ditto vertically
3731817Sdenise nnc	move right nn, then print c (exactly 2 digits!)
3831817Sdenise 		(this wart is an optimization that shrinks output file size
3931817Sdenise 		 about 35% and run-time about 15% while preserving ascii-ness)
4031817Sdenise pn	new page begins (number n) -- set v to 0
4131817Sdenise P	spread ends -- output it. (Put in by vsort).
4231817Sdenise nb a	end of line (information only -- no action needed)
4331817Sdenise 	b = space before line, a = after
4431817Sdenise w	paddable word space -- no action needed
4531817Sdenise 
4631817Sdenise Dt ..\n	draw operation 't':
4731817Sdenise 	Dl x y .	line from here by x,y (drawing char .)
4831817Sdenise 	Dc d		circle of diameter d with left side here
4931817Sdenise 	De x y		ellipse of axes x,y with left side here
5031817Sdenise 	Da x y r	arc counter-clockwise by x,y of radius r
5131817Sdenise 	D~ x y x y ...	B-spline curve by x,y then x,y ...
5231817Sdenise 			vectors, with extents from miny to maxy (no border)
5331817Sdenise 
5431817Sdenise x ..\n	device control functions:
5531817Sdenise      x i	init
5631817Sdenise      x T s	name of device is s
5731817Sdenise      x r n h v	resolution is n/inch h = min horizontal motion, v = min vert
5831817Sdenise      x p	pause (can restart)
5931817Sdenise      x s	stop -- done for ever
6031817Sdenise      x t	generate trailer
6131817Sdenise      x f n s	font position n contains font s
6231817Sdenise      x H n	set character height to n
6331817Sdenise      x S n	set slant to N
6431817Sdenise 
6531817Sdenise 	Subcommands like "i" are often spelled out like "init".
6631817Sdenise 
6731817Sdenise *******************************************************************************/
6831817Sdenise 
6931817Sdenise #include <sys/vcmd.h>
7031817Sdenise #include "the.h"
7131817Sdenise 
72*31820Sdenise public char	*devname = "har";
7331817Sdenise public char	*fontdir = "/usr/local/lib/ditroff/font";
7431817Sdenise 
7531817Sdenise public int	debug = 0;		/* two different debugging modes	*/
7631817Sdenise public int	dbg = 0;
7731817Sdenise 
7831817Sdenise extern int	virtRES;
7931817Sdenise 					/* externs: set here, used elsewhere	*/
8031817Sdenise extern int	nolist, olist[];
8131817Sdenise extern int	pltmode[], prtmode[];
8231817Sdenise 
8331817Sdenise char *operand();
8431817Sdenise 
8531817Sdenise 
8631817Sdenise 
main(argc,argv)8731817Sdenise main(argc, argv)
8831817Sdenise char *argv[];
8931817Sdenise {
9031817Sdenise 	register FILE *fp;
9131817Sdenise 	char *dummy;
9231817Sdenise 
9331817Sdenise 	while (--argc > 0 && **++argv == '-') {
9431817Sdenise 		switch ((*argv)[1]) {
95*31820Sdenise 		case 'F':
9631817Sdenise 			dummy = operand(&argc, &argv);		/* ignore */
9731817Sdenise 			break;
9831817Sdenise 		case 'D':
9931817Sdenise 			debug = 1;
10031817Sdenise 			break;
10131817Sdenise 		case 'f':
10231817Sdenise 			fontdir = operand(&argc, &argv);
10331817Sdenise 			break;
10431817Sdenise 		case 'o':
10531817Sdenise 			outlist(operand(&argc, &argv));
10631817Sdenise 			break;
10731817Sdenise #ifdef DEBUGABLE
10831817Sdenise 		case 'd':
10931817Sdenise 			dbg = atoi(operand(&argc, &argv));
11031817Sdenise 			if (dbg == 0) dbg = 1;
11131817Sdenise 			break;
11231817Sdenise #endif
11331817Sdenise 		case 'n':
11431817Sdenise 			dummy = operand(&argc, &argv);		/* ignore */
11531817Sdenise 			break;
11631817Sdenise 
11731817Sdenise 		case 'h':
11831817Sdenise 			dummy = operand(&argc, &argv);		/* ignore */
11931817Sdenise 			break;
12031817Sdenise 		case 'x':
12131817Sdenise 		case 'y':
12231817Sdenise 			dummy = operand(&argc, &argv);		/* ignore */
12331817Sdenise 			break;
12431817Sdenise 
12531817Sdenise 		}
12631817Sdenise 	}
12731817Sdenise 	/* ignore accounting argument... */
12831817Sdenise 	argc--;
12931817Sdenise 	argv++;
13031817Sdenise 
13131817Sdenise #ifdef DRIVER
13231817Sdenise 	ioctl(OUTFILE, VSETSTATE, pltmode);
13331817Sdenise #endif
13431817Sdenise 
13531817Sdenise 	initfonts();
13631817Sdenise 	initgraph(virtRES);
13731817Sdenise 
13831817Sdenise 	if (argc < 1)
13931817Sdenise 		conv(stdin);
14031817Sdenise 	else
14131817Sdenise 		while (argc-- > 0) {
14231817Sdenise 			if (strcmp(*argv, "-") == 0)
14331817Sdenise 				fp = stdin;
14431817Sdenise 			else if ((fp = fopen(*argv, "r")) == NULL)
14531817Sdenise 				error(FATAL, "can't open %s", *argv);
14631817Sdenise 			conv(fp);
14731817Sdenise 			fclose(fp);
14831817Sdenise 			argv++;
14931817Sdenise 		}
15031817Sdenise 	exit(0);
15131817Sdenise }
15231817Sdenise 
15331817Sdenise 
15431817Sdenise /*----------------------------------------------------------------------------*
15531817Sdenise  | Routine:	char  * operand (& argc,  & argv)
15631817Sdenise  |
15731817Sdenise  | Results:	returns address of the operand given with a command-line
15831817Sdenise  |		option.  It uses either "-Xoperand" or "-X operand", whichever
15931817Sdenise  |		is present.  The program is terminated if no option is present.
16031817Sdenise  |
16131817Sdenise  | Side Efct:	argc and argv are updated as necessary.
16231817Sdenise  *----------------------------------------------------------------------------*/
16331817Sdenise 
operand(argcp,argvp)16431817Sdenise char *operand(argcp, argvp)
16531817Sdenise int * argcp;
16631817Sdenise char ***argvp;
16731817Sdenise {
16831817Sdenise 	if ((**argvp)[2]) return(**argvp + 2); /* operand immediately follows */
16931817Sdenise 	if ((--*argcp) <= 0) {			/* no operand */
17031817Sdenise 	    error (FATAL, "command-line option operand missing.");
17131817Sdenise 	}
17231817Sdenise 	return(*(++(*argvp)));			/* operand next word */
17331817Sdenise }
17431817Sdenise 
17531817Sdenise 
outlist(s)17631817Sdenise outlist(s)	/* process list of page numbers to be printed */
17731817Sdenise char *s;
17831817Sdenise {
17931817Sdenise 	int n1, n2;
18031817Sdenise #ifdef DEBUGABLE
18131817Sdenise 	int i;
18231817Sdenise #endif
18331817Sdenise 
18431817Sdenise 	nolist = 0;
18531817Sdenise 	while (*s) {
18631817Sdenise 		n1 = 0;
18731817Sdenise 		if (isdigit(*s))
18831817Sdenise 			do
18931817Sdenise 				n1 = 10 * n1 + *s++ - '0';
19031817Sdenise 			while (isdigit(*s));
19131817Sdenise 		else
19231817Sdenise 			n1 = -9999;
19331817Sdenise 		n2 = n1;
19431817Sdenise 		if (*s == '-') {
19531817Sdenise 			s++;
19631817Sdenise 			n2 = 0;
19731817Sdenise 			if (isdigit(*s))
19831817Sdenise 				do
19931817Sdenise 					n2 = 10 * n2 + *s++ - '0';
20031817Sdenise 				while (isdigit(*s));
20131817Sdenise 			else
20231817Sdenise 				n2 = 9999;
20331817Sdenise 		}
20431817Sdenise 		olist[nolist++] = n1;
20531817Sdenise 		olist[nolist++] = n2;
20631817Sdenise 		if (*s != '\0')
20731817Sdenise 			s++;
20831817Sdenise 	}
20931817Sdenise 	olist[nolist] = 0;
21031817Sdenise #ifdef DEBUGABLE
21131817Sdenise 	if (dbg)
21231817Sdenise 		for (i=0; i<nolist; i += 2)
21331817Sdenise 			fprintf(stderr,"%3d %3d\n", olist[i], olist[i+1]);
21431817Sdenise #endif
21531817Sdenise }
21631817Sdenise 
21731817Sdenise 
21831817Sdenise 
21931817Sdenise /*VARARGS1*/
22031817Sdenise 
error(f,s,a1,a2,a3,a4,a5,a6,a7)22131817Sdenise error(f, s, a1, a2, a3, a4, a5, a6, a7)
22231817Sdenise {
22331817Sdenise 	fprintf(stderr, "dver: ");
22431817Sdenise 	/*NOSTRICT*/
22531817Sdenise 	fprintf(stderr, s, a1, a2, a3, a4, a5, a6, a7);
22631817Sdenise 	fprintf(stderr, "\n");
22731817Sdenise 	if (f) exit(ABORT);
22831817Sdenise }
22931817Sdenise 
23031817Sdenise 
23131817Sdenise 
23231817Sdenise 
23331817Sdenise /*VARARGS*/
23431817Sdenise /*NOSTRICT*/
23531817Sdenise 
eprintf(s1,s2,s3,s4,s5,s6,s7,s8)23631817Sdenise eprintf(s1, s2, s3, s4, s5, s6, s7, s8)
23731817Sdenise {
23831817Sdenise 	/*NOSTRICT*/
23931817Sdenise 	fprintf(stderr, s1, s2, s3, s4, s5, s6, s7, s8);
24031817Sdenise }
241