Commit | Line | Data |
---|---|---|
c27fc7dd KT |
1 | /* |
2 | * vpr -- Versatek printer filter | |
3 | */ | |
4 | ||
5 | #include <stdio.h> | |
6 | ||
7 | #define LINELN 132 | |
8 | #define EJLINE 63 | |
9 | #define SETSTATE (('v'<<8)+1) | |
10 | ||
11 | int anydone; | |
12 | char linebuf[LINELN+2]; | |
13 | int sppmode[] = {0400, 0, 0}; | |
14 | int pltmode[] = {0200, 0, 0}; | |
15 | int clrcom[] = {0404, 0, 0}; | |
16 | int termcom[] = {0240, 0, 0}; | |
17 | int prtmode[] = {0100, 0, 0}; | |
18 | int ov; | |
19 | char ovbuf[2*LINELN]; | |
20 | FILE *in = stdin; | |
21 | FILE *out; | |
22 | char *ban; | |
23 | int npages = 1; | |
24 | char chrtab[][16]; | |
25 | int lineno; | |
26 | char *ctime(); | |
27 | ||
28 | main(argc, argv) | |
29 | char **argv; | |
30 | { | |
31 | ||
32 | if ((out = fopen("/dev/vp0", "w")) == NULL) { | |
33 | fprintf(stderr, "Can't open printer\n"); | |
34 | exit(1); | |
35 | } | |
36 | if (argc > 2 && argv[1][0]=='-' && argv[1][1]=='b') { | |
37 | argc -= 2; | |
38 | banner(ban = argv[2]); | |
39 | argv += 2; | |
40 | } | |
41 | if (argc<=1) | |
42 | anydone |= send(); | |
43 | else while (argc>1) { | |
44 | if ((in = fopen(argv[1], "r")) == NULL) { | |
45 | fprintf(stderr, "Can't find %s\n", argv[1]); | |
46 | argv++; | |
47 | argc--; | |
48 | anydone |= 01; | |
49 | continue; | |
50 | } | |
51 | anydone |= send(); | |
52 | argc--; | |
53 | argv++; | |
54 | fclose(in); | |
55 | fprintf(out, "\014"); | |
56 | } | |
57 | if (anydone==0) | |
58 | exit(1); | |
59 | fprintf(out, "\004"); | |
60 | if (ferror(out)) { | |
61 | fprintf(out, "Printer IO error\n"); | |
62 | exit(1); | |
63 | } | |
64 | fclose(out); | |
65 | if (ban && access("/usr/adm/vpacct", 02)>=0 | |
66 | && (out = fopen("/usr/adm/vpacct", "a"))!=NULL) { | |
67 | fprintf(out, "%4d %s\n", npages, ban); | |
68 | } | |
69 | return(0); | |
70 | } | |
71 | ||
72 | send() | |
73 | { | |
74 | register nskipped; | |
75 | ||
76 | lineno = 0; | |
77 | nskipped = 0; | |
78 | while (getline()) { | |
79 | if (lineno==0 && linebuf[0]==0 && nskipped<3) { | |
80 | nskipped ++; | |
81 | continue; | |
82 | } | |
83 | if (lineno >= EJLINE) { | |
84 | nskipped = 0; | |
85 | putline(1); | |
86 | lineno = 0; | |
87 | } else { | |
88 | putline(0); | |
89 | lineno++; | |
90 | } | |
91 | } | |
92 | if (lineno>0) | |
93 | npages++; | |
94 | return(1); | |
95 | } | |
96 | ||
97 | getline() | |
98 | { | |
99 | register col, maxcol, c; | |
100 | ||
101 | ov = 0; | |
102 | for (col=0; col<LINELN; col++) { | |
103 | linebuf[col] = ' '; | |
104 | ovbuf[2*col] = ovbuf[2*col+1] = 0; | |
105 | } | |
106 | col = 8; | |
107 | maxcol = 0; | |
108 | for (;;) switch (c = getc(in)) { | |
109 | ||
110 | case EOF: | |
111 | return(0); | |
112 | ||
113 | default: | |
114 | if (c>=' ') { | |
115 | if (col < LINELN) { | |
116 | if (linebuf[col]=='_') { | |
117 | ov++; | |
118 | ovbuf[2*col] = 0377; | |
119 | ovbuf[2*col+1] = 0377; | |
120 | } | |
121 | linebuf[col++] = c; | |
122 | if (col > maxcol) | |
123 | maxcol = col; | |
124 | } | |
125 | } | |
126 | continue; | |
127 | ||
128 | case '\f': | |
129 | lineno = EJLINE; | |
130 | continue; | |
131 | case ' ': | |
132 | col++; | |
133 | continue; | |
134 | ||
135 | ||
136 | case '\t': | |
137 | col = (col|07) + 1; | |
138 | if (col>maxcol) | |
139 | maxcol = col; | |
140 | continue; | |
141 | ||
142 | case '\r': | |
143 | col = 0; | |
144 | continue; | |
145 | ||
146 | case '_': | |
147 | if (col>=LINELN) { | |
148 | col++; | |
149 | continue; | |
150 | } | |
151 | if (linebuf[col]!=' ') { | |
152 | ovbuf[2*col] = 0377; | |
153 | ovbuf[2*col+1] = 0377; | |
154 | ov++; | |
155 | } else | |
156 | linebuf[col] = c; | |
157 | col++; | |
158 | if (col>maxcol) | |
159 | maxcol = col; | |
160 | continue; | |
161 | ||
162 | case '\n': | |
163 | if (maxcol>=LINELN) | |
164 | maxcol = LINELN; | |
165 | linebuf[maxcol] = 0; | |
166 | return(1); | |
167 | ||
168 | case '\b': | |
169 | if (col>0) | |
170 | col--; | |
171 | continue; | |
172 | } | |
173 | } | |
174 | ||
175 | putline(ff) | |
176 | { | |
177 | register char *lp; | |
178 | register c; | |
179 | extern errno; | |
180 | ||
181 | errno = 0; | |
182 | lp = linebuf; | |
183 | while (c = *lp++) | |
184 | putc(c, out); | |
185 | if (ov) { | |
186 | putc('\n', out); | |
187 | fflush(out); | |
188 | ioctl(fileno(out), SETSTATE, pltmode); | |
189 | for (lp=ovbuf; lp < &ovbuf[2*LINELN]; ) | |
190 | putc(*lp++, out); | |
191 | fflush(out); | |
192 | ioctl(fileno(out), SETSTATE, prtmode); | |
193 | } | |
194 | if (ff) { | |
195 | putc('\014', out); | |
196 | npages++; | |
197 | } else if (ov==0) | |
198 | putc('\n', out); | |
199 | if (ferror(out)) { | |
200 | printf("Printer IO error\n"); | |
201 | exit(1); | |
202 | } | |
203 | } | |
204 | ||
205 | banner(s) | |
206 | char *s; | |
207 | { | |
208 | long timeb; | |
209 | register char *sp; | |
210 | int i, j, t; | |
211 | ||
212 | fprintf(out, "\n\n\n\n\n\n\n\n"); | |
213 | for (i=0; i<16; i++) { | |
214 | fprintf(out, " "); | |
215 | for (sp=s; *sp; sp++) { | |
216 | if (*sp<=' '|| *sp >'}') | |
217 | continue; | |
218 | fprintf(out, " "); | |
219 | t = chrtab[*sp - ' '][i]; | |
220 | for (j=7; j>=0; j--) | |
221 | if ((t>>j) & 01) | |
222 | putc('X', out); | |
223 | else | |
224 | putc(' ', out); | |
225 | } | |
226 | putc('\n', out); | |
227 | } | |
228 | fprintf(out, "\n\n\n\n\n\n\n\n"); | |
229 | time(&timeb); | |
230 | fprintf(out, " "); | |
231 | fprintf(out, ctime(&timeb)); | |
232 | fprintf(out, "\014"); | |
233 | } | |
234 | ||
235 | char chrtab[][16] = { | |
236 | 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, sp, */ | |
237 | 0010,0010,0010,0010,0010,0010,0010,0010,0000,0000,0010,0000,0000,0000,0000,0000, /*, !, */ | |
238 | 0024,0024,0024,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, ", */ | |
239 | 0000,0000,0000,0044,0044,0176,0044,0044,0176,0044,0044,0000,0000,0000,0000,0000, /*, #, */ | |
240 | 0000,0010,0010,0010,0076,0101,0100,0076,0001,0101,0076,0010,0010,0000,0000,0000, /*, $, */ | |
241 | 0000,0000,0000,0141,0142,0004,0010,0010,0020,0043,0103,0000,0000,0000,0000,0000, /*, %, */ | |
242 | 0000,0000,0070,0104,0110,0060,0060,0111,0106,0106,0071,0000,0000,0000,0000,0000, /*, &, */ | |
243 | 0004,0010,0020,0040,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, ', */ | |
244 | 0000,0004,0010,0020,0040,0040,0040,0040,0040,0040,0020,0010,0004,0000,0000,0000, /*, (, */ | |
245 | 0000,0040,0020,0010,0004,0004,0004,0004,0004,0004,0010,0020,0040,0000,0000,0000, /*, ), */ | |
246 | 0000,0000,0000,0010,0111,0052,0034,0177,0034,0052,0111,0010,0000,0000,0000,0000, /*, *, */ | |
247 | 0000,0000,0000,0000,0010,0010,0010,0177,0010,0010,0010,0000,0000,0000,0000,0000, /*, +, */ | |
248 | 0000,0000,0000,0000,0000,0000,0000,0000,0000,0030,0030,0010,0020,0000,0000,0000, /*, ,, */ | |
249 | 0000,0000,0000,0000,0000,0000,0000,0176,0000,0000,0000,0000,0000,0000,0000,0000, /*, -, */ | |
250 | 0000,0000,0000,0000,0000,0000,0000,0000,0000,0030,0030,0000,0000,0000,0000,0000, /*, ., */ | |
251 | 0000,0000,0001,0002,0004,0010,0010,0010,0020,0040,0100,0000,0000,0000,0000,0000, /*, /, */ | |
252 | 0000,0030,0044,0102,0102,0102,0102,0102,0102,0044,0030,0000,0000,0000,0000,0000, /*, 0, */ | |
253 | 0000,0010,0030,0010,0010,0010,0010,0010,0010,0010,0034,0000,0000,0000,0000,0000, /*, 1, */ | |
254 | 0000,0070,0104,0004,0004,0010,0020,0040,0100,0100,0174,0000,0000,0000,0000,0000, /*, 2, */ | |
255 | 0000,0176,0004,0004,0010,0014,0002,0002,0002,0104,0070,0000,0000,0000,0000,0000, /*, 3, */ | |
256 | 0000,0004,0014,0024,0044,0104,0176,0004,0004,0004,0004,0000,0000,0000,0000,0000, /*, 4, */ | |
257 | 0000,0174,0100,0100,0130,0144,0002,0002,0102,0044,0030,0000,0000,0000,0000,0000, /*, 5, */ | |
258 | 0000,0074,0102,0100,0130,0144,0102,0102,0102,0044,0030,0000,0000,0000,0000,0000, /*, 6, */ | |
259 | 0000,0176,0004,0004,0010,0010,0020,0020,0040,0040,0040,0000,0000,0000,0000,0000, /*, 7, */ | |
260 | 0000,0034,0042,0101,0042,0076,0101,0101,0101,0101,0076,0000,0000,0000,0000,0000, /*, 8, */ | |
261 | 0000,0034,0042,0101,0101,0101,0043,0036,0004,0010,0020,0040,0000,0000,0000,0000, /*, 9, */ | |
262 | 0000,0000,0000,0000,0000,0000,0030,0030,0000,0030,0030,0000,0000,0000,0000,0000, /*, :, */ | |
263 | 0000,0000,0000,0000,0000,0000,0030,0030,0000,0030,0030,0020,0040,0000,0000,0000, /*, ;, */ | |
264 | 0002,0004,0010,0020,0040,0100,0040,0020,0010,0004,0002,0000,0000,0000,0000,0000, /*, <, */ | |
265 | 0000,0000,0000,0000,0177,0000,0177,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, =, */ | |
266 | 0100,0040,0020,0010,0004,0002,0004,0010,0020,0040,0100,0000,0000,0000,0000,0000, /*, >, */ | |
267 | 0000,0030,0044,0102,0001,0002,0004,0010,0010,0000,0010,0000,0000,0000,0000,0000, /*, ?, */ | |
268 | 0000,0074,0102,0101,0115,0123,0121,0121,0121,0111,0046,0000,0000,0000,0000,0000, /*, @, */ | |
269 | 0000,0010,0024,0042,0101,0101,0177,0101,0101,0101,0101,0000,0000,0000,0000,0000, /*, A, */ | |
270 | 0000,0176,0101,0101,0101,0176,0101,0101,0101,0101,0176,0000,0000,0000,0000,0000, /*, B, */ | |
271 | 0000,0076,0101,0100,0100,0100,0100,0100,0100,0101,0076,0000,0000,0000,0000,0000, /*, C, */ | |
272 | 0000,0176,0101,0101,0101,0101,0101,0101,0101,0101,0176,0000,0000,0000,0000,0000, /*, D, */ | |
273 | 0000,0176,0100,0100,0100,0170,0100,0100,0100,0100,0177,0000,0000,0000,0000,0000, /*, E, */ | |
274 | 0000,0177,0100,0100,0100,0174,0100,0100,0100,0100,0100,0000,0000,0000,0000,0000, /*, F, */ | |
275 | 0000,0076,0101,0100,0100,0117,0101,0101,0101,0101,0076,0000,0000,0000,0000,0000, /*, G, */ | |
276 | 0000,0101,0101,0101,0101,0176,0101,0101,0101,0101,0101,0000,0000,0000,0000,0000, /*, H, */ | |
277 | 0000,0034,0010,0010,0010,0010,0010,0010,0010,0010,0034,0000,0000,0000,0000,0000, /*, I, */ | |
278 | 0000,0016,0004,0004,0004,0004,0004,0004,0104,0104,0070,0000,0000,0000,0000,0000, /*, J, */ | |
279 | 0000,0101,0102,0104,0110,0120,0160,0110,0104,0102,0101,0000,0000,0000,0000,0000, /*, K, */ | |
280 | 0000,0100,0100,0100,0100,0100,0100,0100,0100,0100,0177,0000,0000,0000,0000,0000, /*, L, */ | |
281 | 0000,0101,0143,0125,0111,0101,0101,0101,0101,0101,0101,0000,0000,0000,0000,0000, /*, M, */ | |
282 | 0000,0101,0141,0121,0111,0105,0103,0101,0101,0101,0101,0000,0000,0000,0000,0000, /*, N, */ | |
283 | 0000,0076,0101,0101,0101,0101,0101,0101,0101,0101,0076,0000,0000,0000,0000,0000, /*, O, */ | |
284 | 0000,0176,0101,0101,0101,0176,0100,0100,0100,0100,0100,0000,0000,0000,0000,0000, /*, P, */ | |
285 | 0000,0076,0101,0101,0101,0101,0101,0101,0131,0105,0076,0002,0001,0000,0000,0000, /*, Q, */ | |
286 | 0000,0176,0101,0101,0101,0176,0104,0102,0101,0101,0101,0000,0000,0000,0000,0000, /*, R, */ | |
287 | 0000,0076,0101,0100,0100,0076,0001,0001,0001,0101,0076,0000,0000,0000,0000,0000, /*, S, */ | |
288 | 0000,0177,0010,0010,0010,0010,0010,0010,0010,0010,0010,0000,0000,0000,0000,0000, /*, T, */ | |
289 | 0000,0101,0101,0101,0101,0101,0101,0101,0101,0101,0076,0000,0000,0000,0000,0000, /*, U, */ | |
290 | 0000,0101,0101,0101,0101,0101,0101,0101,0042,0024,0010,0000,0000,0000,0000,0000, /*, V, */ | |
291 | 0000,0101,0101,0101,0101,0111,0111,0125,0143,0101,0101,0000,0000,0000,0000,0000, /*, W, */ | |
292 | 0000,0101,0101,0042,0024,0010,0024,0042,0101,0101,0101,0000,0000,0000,0000,0000, /*, X, */ | |
293 | 0000,0101,0042,0024,0010,0010,0010,0010,0010,0010,0010,0000,0000,0000,0000,0000, /*, Y, */ | |
294 | 0000,0177,0001,0002,0004,0010,0020,0040,0100,0100,0177,0000,0000,0000,0000,0000, /*, Z, */ | |
295 | 0000,0034,0020,0020,0020,0020,0020,0020,0020,0020,0020,0034,0000,0000,0000,0000, /*, [, */ | |
296 | 0000,0000,0100,0040,0020,0010,0010,0010,0004,0002,0001,0000,0000,0000,0000,0000, /*, , \, */ | |
297 | 0000,0070,0010,0010,0010,0010,0010,0010,0010,0010,0010,0070,0000,0000,0000,0000, /*, ], */ | |
298 | 0010,0024,0042,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, ^, */ | |
299 | 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0377,0000,0000, /*, _, */ | |
300 | 0040,0020,0010,0004,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, `, */ | |
301 | 0000,0000,0000,0000,0000,0074,0002,0076,0102,0102,0076,0000,0000,0000,0000,0000, /*, a, */ | |
302 | 0000,0100,0100,0100,0100,0174,0102,0102,0102,0102,0174,0000,0000,0000,0000,0000, /*, b, */ | |
303 | 0000,0000,0000,0000,0000,0074,0102,0100,0100,0102,0074,0000,0000,0000,0000,0000, /*, c, */ | |
304 | 0002,0002,0002,0002,0002,0076,0102,0102,0102,0102,0076,0000,0000,0000,0000,0000, /*, d, */ | |
305 | 0000,0000,0000,0000,0000,0074,0102,0174,0100,0102,0074,0000,0000,0000,0000,0000, /*, e, */ | |
306 | 0000,0016,0020,0020,0020,0176,0020,0020,0020,0020,0020,0000,0000,0000,0000,0000, /*, f, */ | |
307 | 0000,0000,0000,0000,0000,0076,0102,0102,0102,0102,0076,0002,0002,0102,0076,0000, /*, g, */ | |
308 | 0000,0100,0100,0100,0100,0174,0102,0102,0102,0102,0102,0000,0000,0000,0000,0000, /*, h, */ | |
309 | 0000,0000,0000,0010,0000,0030,0010,0010,0010,0010,0034,0000,0000,0000,0000,0000, /*, i, */ | |
310 | 0000,0000,0000,0010,0000,0030,0010,0010,0010,0010,0010,0010,0010,0050,0020,0000, /*, j, */ | |
311 | 0000,0100,0100,0100,0100,0106,0110,0120,0160,0110,0106,0000,0000,0000,0000,0000, /*, k, */ | |
312 | 0000,0030,0010,0010,0010,0010,0010,0010,0010,0010,0034,0000,0000,0000,0000,0000, /*, l, */ | |
313 | 0000,0000,0000,0000,0000,0166,0111,0111,0111,0111,0111,0000,0000,0000,0000,0000, /*, m, */ | |
314 | 0000,0000,0000,0000,0100,0174,0102,0102,0102,0102,0102,0000,0000,0000,0000,0000, /*, n, */ | |
315 | 0000,0000,0000,0000,0000,0074,0102,0102,0102,0102,0074,0000,0000,0000,0000,0000, /*, o, */ | |
316 | 0000,0000,0000,0000,0000,0174,0102,0102,0102,0102,0174,0100,0100,0100,0100,0000, /*, p, */ | |
317 | 0000,0000,0000,0000,0000,0076,0102,0102,0102,0102,0076,0002,0002,0002,0002,0000, /*, q, */ | |
318 | 0000,0000,0000,0000,0000,0134,0142,0100,0100,0100,0100,0000,0000,0000,0000,0000, /*, r, */ | |
319 | 0000,0000,0000,0000,0000,0076,0100,0074,0002,0102,0074,0000,0000,0000,0000,0000, /*, s, */ | |
320 | 0000,0020,0020,0020,0020,0176,0020,0020,0020,0020,0014,0000,0000,0000,0000,0000, /*, t, */ | |
321 | 0000,0000,0000,0000,0000,0102,0102,0102,0102,0102,0075,0000,0000,0000,0000,0000, /*, u, */ | |
322 | 0000,0000,0000,0000,0000,0101,0101,0101,0042,0024,0010,0000,0000,0000,0000,0000, /*, v, */ | |
323 | 0000,0000,0000,0000,0000,0111,0111,0111,0111,0111,0066,0000,0000,0000,0000,0000, /*, w, */ | |
324 | 0000,0000,0000,0000,0000,0102,0044,0030,0030,0044,0102,0000,0000,0000,0000,0000, /*, x, */ | |
325 | 0000,0000,0000,0000,0000,0102,0102,0102,0042,0024,0010,0020,0040,0100,0000,0000, /*, y, */ | |
326 | 0000,0000,0000,0000,0000,0176,0004,0010,0020,0040,0176,0000,0000,0000,0000,0000, /*, z, */ | |
327 | 0000,0014,0020,0020,0020,0020,0040,0020,0020,0020,0020,0014,0000,0000,0000,0000, /*, {, */ | |
328 | 0000,0010,0010,0010,0010,0000,0000,0010,0010,0010,0010,0000,0000,0000,0000,0000, /*, |, */ | |
329 | 0000,0030,0010,0010,0010,0010,0004,0010,0010,0010,0010,0030,0000,0000,0000,0000, /*, }, */ | |
330 | 0020,0052,0004,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, ~, */ | |
331 | 0000,0176,0176,0176,0176,0176,0176,0176,0176,0176,0176,0000,0000,0000,0000,0000, /*, del, */ | |
332 | }; |