1 /*
2  *
3  * dver: VAX Versatec driver for the new troff
4  *
5  * Authors:	BWK(BELL)
6  *		VCAT(berkley)
7  *		Richard L. Hyde, Perdue University
8  *		and David Slattengren, U.C. Berkeley
9  *
10  *		Jaap Akkerhuis
11  *			added Versatec80 support
12  *			removed Berkeley specific stuff (like nstips)
13  *			by #ifdef BERK, allthough a lot of things are
14  *			around (like polygon and gremlin...)
15  *
16  *		Carol Orange and Denise Draper
17  *			Changed to make the versatec a Harris typesetter
18  *			look-alike.
19  */
20 #ifndef LINT
21 static char sccsid[] = "@(#)ndver80	1.2 (CWI) 87/07/10";
22 #endif
23 /*******************************************************************************
24 
25     output language from troff:
26     all numbers are character strings
27 
28 #..\n	comment
29 sn	size in points
30 fn	font as number from 1 to n
31 cx	ascii character x
32 Cxyz	funny char \(xyz. terminated by white space
33 Hn	go to absolute horizontal position n
34 Vn	go to absolute vertical position n (down is positive)
35 hn	go n units horizontally (relative)
36 vn	ditto vertically
37 nnc	move right nn, then print c (exactly 2 digits!)
38 		(this wart is an optimization that shrinks output file size
39 		 about 35% and run-time about 15% while preserving ascii-ness)
40 pn	new page begins (number n) -- set v to 0
41 P	spread ends -- output it. (Put in by vsort).
42 nb a	end of line (information only -- no action needed)
43 	b = space before line, a = after
44 w	paddable word space -- no action needed
45 
46 Dt ..\n	draw operation 't':
47 	Dl x y .	line from here by x,y (drawing char .)
48 	Dc d		circle of diameter d with left side here
49 	De x y		ellipse of axes x,y with left side here
50 	Da x y r	arc counter-clockwise by x,y of radius r
51 	D~ x y x y ...	B-spline curve by x,y then x,y ...
52 			vectors, with extents from miny to maxy (no border)
53 
54 x ..\n	device control functions:
55      x i	init
56      x T s	name of device is s
57      x r n h v	resolution is n/inch h = min horizontal motion, v = min vert
58      x p	pause (can restart)
59      x s	stop -- done for ever
60      x t	generate trailer
61      x f n s	font position n contains font s
62      x H n	set character height to n
63      x S n	set slant to N
64 
65 	Subcommands like "i" are often spelled out like "init".
66 
67 *******************************************************************************/
68 
69 #include <sys/vcmd.h>
70 #include "the.h"
71 
72 public char	*devname = "har";
73 public char	*fontdir = "/usr/local/lib/ditroff/font";
74 
75 public int	debug = 0;		/* two different debugging modes	*/
76 public int	dbg = 0;
77 
78 extern int	virtRES;
79 					/* externs: set here, used elsewhere	*/
80 extern int	nolist, olist[];
81 extern int	pltmode[], prtmode[];
82 
83 char *operand();
84 
85 
86 
87 main(argc, argv)
88 char *argv[];
89 {
90 	register FILE *fp;
91 	char *dummy;
92 
93 	while (--argc > 0 && **++argv == '-') {
94 		switch ((*argv)[1]) {
95 		case 'F':
96 			dummy = operand(&argc, &argv);		/* ignore */
97 			break;
98 		case 'D':
99 			debug = 1;
100 			break;
101 		case 'f':
102 			fontdir = operand(&argc, &argv);
103 			break;
104 		case 'o':
105 			outlist(operand(&argc, &argv));
106 			break;
107 #ifdef DEBUGABLE
108 		case 'd':
109 			dbg = atoi(operand(&argc, &argv));
110 			if (dbg == 0) dbg = 1;
111 			break;
112 #endif
113 		case 'n':
114 			dummy = operand(&argc, &argv);		/* ignore */
115 			break;
116 
117 		case 'h':
118 			dummy = operand(&argc, &argv);		/* ignore */
119 			break;
120 		case 'x':
121 		case 'y':
122 			dummy = operand(&argc, &argv);		/* ignore */
123 			break;
124 
125 		}
126 	}
127 	/* ignore accounting argument... */
128 	argc--;
129 	argv++;
130 
131 #ifdef DRIVER
132 	ioctl(OUTFILE, VSETSTATE, pltmode);
133 #endif
134 
135 	initfonts();
136 	initgraph(virtRES);
137 
138 	if (argc < 1)
139 		conv(stdin);
140 	else
141 		while (argc-- > 0) {
142 			if (strcmp(*argv, "-") == 0)
143 				fp = stdin;
144 			else if ((fp = fopen(*argv, "r")) == NULL)
145 				error(FATAL, "can't open %s", *argv);
146 			conv(fp);
147 			fclose(fp);
148 			argv++;
149 		}
150 	exit(0);
151 }
152 
153 
154 /*----------------------------------------------------------------------------*
155  | Routine:	char  * operand (& argc,  & argv)
156  |
157  | Results:	returns address of the operand given with a command-line
158  |		option.  It uses either "-Xoperand" or "-X operand", whichever
159  |		is present.  The program is terminated if no option is present.
160  |
161  | Side Efct:	argc and argv are updated as necessary.
162  *----------------------------------------------------------------------------*/
163 
164 char *operand(argcp, argvp)
165 int * argcp;
166 char ***argvp;
167 {
168 	if ((**argvp)[2]) return(**argvp + 2); /* operand immediately follows */
169 	if ((--*argcp) <= 0) {			/* no operand */
170 	    error (FATAL, "command-line option operand missing.");
171 	}
172 	return(*(++(*argvp)));			/* operand next word */
173 }
174 
175 
176 outlist(s)	/* process list of page numbers to be printed */
177 char *s;
178 {
179 	int n1, n2;
180 #ifdef DEBUGABLE
181 	int i;
182 #endif
183 
184 	nolist = 0;
185 	while (*s) {
186 		n1 = 0;
187 		if (isdigit(*s))
188 			do
189 				n1 = 10 * n1 + *s++ - '0';
190 			while (isdigit(*s));
191 		else
192 			n1 = -9999;
193 		n2 = n1;
194 		if (*s == '-') {
195 			s++;
196 			n2 = 0;
197 			if (isdigit(*s))
198 				do
199 					n2 = 10 * n2 + *s++ - '0';
200 				while (isdigit(*s));
201 			else
202 				n2 = 9999;
203 		}
204 		olist[nolist++] = n1;
205 		olist[nolist++] = n2;
206 		if (*s != '\0')
207 			s++;
208 	}
209 	olist[nolist] = 0;
210 #ifdef DEBUGABLE
211 	if (dbg)
212 		for (i=0; i<nolist; i += 2)
213 			fprintf(stderr,"%3d %3d\n", olist[i], olist[i+1]);
214 #endif
215 }
216 
217 
218 
219 /*VARARGS1*/
220 
221 error(f, s, a1, a2, a3, a4, a5, a6, a7)
222 {
223 	fprintf(stderr, "dver: ");
224 	/*NOSTRICT*/
225 	fprintf(stderr, s, a1, a2, a3, a4, a5, a6, a7);
226 	fprintf(stderr, "\n");
227 	if (f) exit(ABORT);
228 }
229 
230 
231 
232 
233 /*VARARGS*/
234 /*NOSTRICT*/
235 
236 eprintf(s1, s2, s3, s4, s5, s6, s7, s8)
237 {
238 	/*NOSTRICT*/
239 	fprintf(stderr, s1, s2, s3, s4, s5, s6, s7, s8);
240 }
241