|
|
1.1 root 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,0177,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: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.