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