xref: /original-bsd/old/vfilters/vpltdmp/vpltdmp.c (revision 1403a0cd)
1 /*
2  * Copyright (c) 1983 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  */
6 
7 #ifndef lint
8 static char sccsid[] = "@(#)vpltdmp.c	5.1 (Berkeley) 05/15/85";
9 #endif not lint
10 
11 /*
12  * Copyright (C) 1981, Regents of the University of California
13  *	All rights reserved
14  *
15  *  reads raster file created by vplot and dumps it onto the
16  *  Varian or Versatec plotter.
17  *  Input comes from file descriptor 0, output is to file descriptor 1.
18  */
19 #include <stdio.h>
20 #include <sys/vcmd.h>
21 
22 #define IN	0
23 #define OUT	1
24 
25 static	char *Sid = "@(#)vpltdmp.c	5.1\t05/15/85";
26 
27 int	plotmd[] = { VPLOT };
28 int	prtmd[]  = { VPRINT };
29 
30 char	buf[BUFSIZ];		/* output buffer */
31 
32 int	lines;			/* number of raster lines printed */
33 int	varian;			/* 0 for versatec, 1 for varian. */
34 int	BYTES_PER_LINE;		/* number of bytes per raster line. */
35 int	PAGE_LINES;		/* number of raster lines per page. */
36 
37 char	*name, *host, *acctfile;
38 
39 main(argc, argv)
40 	int argc;
41 	char *argv[];
42 {
43 	register int n;
44 
45 	while (--argc) {
46 		if (**++argv == '-') {
47 			switch (argv[0][1]) {
48 			case 'x':
49 				BYTES_PER_LINE = atoi(&argv[0][2]) / 8;
50 				varian = BYTES_PER_LINE == 264;
51 				break;
52 
53 			case 'y':
54 				PAGE_LINES = atoi(&argv[0][2]);
55 				break;
56 
57 			case 'n':
58 				argc--;
59 				name = *++argv;
60 				break;
61 
62 			case 'h':
63 				argc--;
64 				host = *++argv;
65 			}
66 		} else
67 			acctfile = *argv;
68 	}
69 
70 	n = putplot();
71 
72 	ioctl(OUT, VSETSTATE, prtmd);
73 	if (varian)
74 		write(OUT, "\f", 2);
75 	else
76 		write(OUT, "\n\n\n\n\n", 6);
77 	account(name, host, *argv);
78 	exit(n);
79 }
80 
81 putplot()
82 {
83 	register char *cp;
84 	register int bytes, n;
85 
86 	cp = buf;
87 	bytes = 0;
88 	ioctl(OUT, VSETSTATE, plotmd);
89 	while ((n = read(IN, cp, sizeof(buf))) > 0) {
90 		if (write(OUT, cp, n) != n)
91 			return(1);
92 		bytes += n;
93 	}
94 	/*
95 	 * Make sure we send complete raster lines.
96 	 */
97 	if ((n = bytes % BYTES_PER_LINE) > 0) {
98 		n = BYTES_PER_LINE - n;
99 		for (cp = &buf[n]; cp > buf; )
100 			*--cp = 0;
101 		if (write(OUT, cp, n) != n)
102 			return(1);
103 		bytes += n;
104 	}
105 	lines += bytes / BYTES_PER_LINE;
106 	return(0);
107 }
108 
109 account(who, from, acctfile)
110 	char *who, *from, *acctfile;
111 {
112 	register FILE *a;
113 
114 	if (who == NULL || acctfile == NULL)
115 		return;
116 	if (access(acctfile, 02) || (a = fopen(acctfile, "a")) == NULL)
117 		return;
118 	/*
119 	 * Varian accounting is done by 8.5 inch pages;
120 	 * Versatec accounting is by the (12 inch) foot.
121 	 */
122 	fprintf(a, "t%6.2f\t", (double)lines / (double)PAGE_LINES);
123 	if (from != NULL)
124 		fprintf(a, "%s:", from);
125 	fprintf(a, "%s\n", who);
126 	fclose(a);
127 }
128