|
|
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.