|
|
1.1 root 1: /*
2: * vpf -- Versatec printer filter
3: */
4:
5: #include <stdio.h>
6: #include <sgtty.h>
7: #include <sys/vcmd.h>
8:
9: #define VALINELN 132
10: #define VPLINELN 440
11: #define VAEJLINE 58 /*80 for 11" long paper*/
12: #define VPEJLINE 66
13:
14: int LINELN = VALINELN;
15: int EJLINE = VAEJLINE;
16: char linebuf[VPLINELN+2];
17: int pltmode[] = {VPLOT, 0, 0};
18: int prtmode[] = {VPRINT, 0, 0};
19: int ov;
20: char ovbuf[VPLINELN];
21: FILE *in = {stdin};
22: /* FILE *out; */
23: #define out stdout
24: char *ban;
25: int wide;
26: int literal;
27: int npages = 1;
28: char chrtab[][16];
29: int lineno;
30:
31: main(argc, argv)
32: char **argv;
33: {
34: register int i;
35: char obuf[BUFSIZ];
36: char *acctfile;
37:
38: setbuf(stdout, obuf);
39: /* va or vp comes open on 3 from parent so don't feed paper after each file */
40: close(1);
41: dup(3);
42: close(3);
43: ioctl(1, VSETSTATE, prtmode);
44: while (argc > 2 && argv[1][0]=='-') {
45: switch (argv[1][1]) {
46: case 'b':
47: ban = argv[2];
48: argc--;
49: argv++;
50: break;
51:
52: case 'l': /* Print input without throwing away
53: control chars and without putting
54: in page breaks. */
55: literal++;
56: break;
57:
58: case 'W':
59: wide++;
60: LINELN = VPLINELN;
61: EJLINE = VPEJLINE;
62: break;
63: }
64: argc--; argv++;
65: }
66: banner(ban);
67: if (argc<=1)
68: send();
69: else while (argc>1) {
70: if ((in = fopen(argv[1], "r")) == NULL) {
71: fprintf(out, "Can't find %s\n", argv[1]);
72: argv++;
73: argc--;
74: continue;
75: }
76: send();
77: argc--;
78: argv++;
79: fclose(in);
80: }
81: if (ferror(out))
82: exit(1);
83: acctfile = wide ? "/usr/adm/vpacct" : "/usr/adm/vaacct";
84: if (ban && access(acctfile, 02)>=0
85: && freopen(acctfile, "a", out) !=NULL) {
86: fprintf(out, "%7.2f\t%s\n", (float)npages, ban);
87: }
88: exit(0);
89: }
90:
91: send()
92: {
93: register nskipped;
94:
95: lineno = 0;
96: nskipped = 0;
97: while (getline()) {
98: if (!literal && !wide && lineno==0 && linebuf[0]==0 && nskipped<3) {
99: nskipped ++;
100: continue;
101: }
102: if (!wide && lineno >= EJLINE) {
103: nskipped = 0;
104: putline(1);
105: lineno = 0;
106: } else {
107: putline(0);
108: if (!literal) /* Don't make page breaks if -l. */
109: lineno++;
110: }
111: }
112: /* Put out an extra null to ensure varian will get an even
113: number of good characters.
114: */
115: putc('\0', out);
116: npages += (lineno + EJLINE - 1) / EJLINE;
117: return;
118: }
119:
120: getline()
121: {
122: register col, maxcol, c;
123:
124: ov = 0;
125: for (col=0; col<LINELN; col++) {
126: linebuf[col] = ' ';
127: ovbuf[col] = 0;
128: }
129: col = 0;
130: maxcol = 0;
131: for (;;) switch (c = getc(in)) {
132:
133: case EOF:
134: return(0);
135:
136: default:
137: if (c>=' ' || literal) {
138: if (col < LINELN) {
139: if (linebuf[col]=='_') {
140: ov++;
141: ovbuf[col] = 0377;
142: }
143: linebuf[col++] = c;
144: if (col > maxcol)
145: maxcol = col;
146: }
147: }
148: continue;
149:
150: case ' ':
151: col++;
152: continue;
153:
154: case '\t':
155: col = (col|07) + 1;
156: if (col>maxcol)
157: maxcol = col;
158: continue;
159:
160: case '\r':
161: col = 0;
162: continue;
163:
164: case '_':
165: if (col>=LINELN) {
166: col++;
167: continue;
168: }
169: if (linebuf[col]!=' ') {
170: ovbuf[col] = 0377;
171: ov++;
172: } else
173: linebuf[col] = c;
174: col++;
175: if (col>maxcol)
176: maxcol = col;
177: continue;
178:
179: case '\f':
180: /* Fall through, treating a ff as a line break, too... */
181: lineno = EJLINE;
182: case '\n':
183: if (maxcol>=LINELN)
184: maxcol = LINELN;
185: linebuf[maxcol] = 0;
186: return(1);
187:
188: case '\b':
189: if (col>0)
190: col--;
191: continue;
192: }
193: }
194:
195: putline(ff)
196: {
197: register char *lp;
198: register c, i;
199: extern errno;
200:
201: errno = 0;
202: lp = linebuf;
203: while (c = *lp++)
204: putc(c, out);
205: if (ov) {
206: putc('\n', out);
207: putc('\0', out);
208: fflush(out);
209: ioctl(fileno(out), VSETSTATE, pltmode);
210: for (lp=ovbuf; lp < &ovbuf[LINELN]; ) {
211: putc(*lp & 0377, out);
212: putc(*lp++ & 0377, out);
213: }
214: fflush(out);
215: ioctl(fileno(out), VSETSTATE, prtmode);
216: }
217: if (ff) {
218: putc('\014', out);
219: npages++;
220: } else if (ov==0)
221: putc('\n', out);
222: if (ferror(out)) {
223: fprintf(stderr, "%s IO error\n", wide ? "Versatec" : "Varian");
224: exit(1);
225: }
226: }
227:
228: banner(s)
229: char *s;
230: {
231: long timeb;
232: register char *sp;
233: register int i, j, t;
234:
235: if (wide) {
236: time(&timeb);
237: fprintf(out, "\n\n%s: %s", s, ctime(&timeb));
238: for (i = 0; i < LINELN; i++)
239: putc('_', out);
240: putc('\n', out);
241: putc('\0', out);
242: fflush(out);
243: return;
244: }
245:
246: fprintf(out, "\014");
247: fprintf(out, "\n\n\n\n\n\n\n\n");
248: for (i=0; i<16; i++) {
249: fprintf(out, " ");
250: for (sp=s; *sp; sp++) {
251: if (*sp<=' '|| *sp >'}')
252: continue;
253: fprintf(out, " ");
254: t = chrtab[*sp - ' '][i];
255: for (j=7; j>=0; j--)
256: if ((t>>j) & 01)
257: putc('X', out);
258: else
259: putc(' ', out);
260: }
261: putc('\n', out);
262: }
263: fprintf(out, "\n\n\n\n\n\n\n\n");
264: time(&timeb);
265: fprintf(out, " ");
266: fprintf(out, ctime(&timeb));
267: fprintf(out, "\014");
268: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.