| 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 | }; |