home *** CD-ROM | disk | FTP | other *** search
- /*
- * vpr -- Versatek printer filter
- */
-
- #include <stdio.h>
-
- #define LINELN 132
- #define EJLINE 63
- #define SETSTATE (('v'<<8)+1)
-
- int anydone;
- char linebuf[LINELN+2];
- int sppmode[] = {0400, 0, 0};
- int pltmode[] = {0200, 0, 0};
- int clrcom[] = {0404, 0, 0};
- int termcom[] = {0240, 0, 0};
- int prtmode[] = {0100, 0, 0};
- int ov;
- char ovbuf[2*LINELN];
- FILE *in = stdin;
- FILE *out;
- char *ban;
- int npages = 1;
- char chrtab[][16];
- int lineno;
- char *ctime();
-
- main(argc, argv)
- char **argv;
- {
-
- if ((out = fopen("/dev/vp0", "w")) == NULL) {
- fprintf(stderr, "Can't open printer\n");
- exit(1);
- }
- if (argc > 2 && argv[1][0]=='-' && argv[1][1]=='b') {
- argc -= 2;
- banner(ban = argv[2]);
- argv += 2;
- }
- if (argc<=1)
- anydone |= send();
- else while (argc>1) {
- if ((in = fopen(argv[1], "r")) == NULL) {
- fprintf(stderr, "Can't find %s\n", argv[1]);
- argv++;
- argc--;
- anydone |= 01;
- continue;
- }
- anydone |= send();
- argc--;
- argv++;
- fclose(in);
- fprintf(out, "\014");
- }
- if (anydone==0)
- exit(1);
- fprintf(out, "\004");
- if (ferror(out)) {
- fprintf(out, "Printer IO error\n");
- exit(1);
- }
- fclose(out);
- if (ban && access("/usr/adm/vpacct", 02)>=0
- && (out = fopen("/usr/adm/vpacct", "a"))!=NULL) {
- fprintf(out, "%4d %s\n", npages, ban);
- }
- return(0);
- }
-
- send()
- {
- register nskipped;
-
- lineno = 0;
- nskipped = 0;
- while (getline()) {
- if (lineno==0 && linebuf[0]==0 && nskipped<3) {
- nskipped ++;
- continue;
- }
- if (lineno >= EJLINE) {
- nskipped = 0;
- putline(1);
- lineno = 0;
- } else {
- putline(0);
- lineno++;
- }
- }
- if (lineno>0)
- npages++;
- return(1);
- }
-
- getline()
- {
- register col, maxcol, c;
-
- ov = 0;
- for (col=0; col<LINELN; col++) {
- linebuf[col] = ' ';
- ovbuf[2*col] = ovbuf[2*col+1] = 0;
- }
- col = 8;
- maxcol = 0;
- for (;;) switch (c = getc(in)) {
-
- case EOF:
- return(0);
-
- default:
- if (c>=' ') {
- if (col < LINELN) {
- if (linebuf[col]=='_') {
- ov++;
- ovbuf[2*col] = 0377;
- ovbuf[2*col+1] = 0377;
- }
- linebuf[col++] = c;
- if (col > maxcol)
- maxcol = col;
- }
- }
- continue;
-
- case '\f':
- lineno = EJLINE;
- continue;
- case ' ':
- col++;
- continue;
-
-
- case '\t':
- col = (col|07) + 1;
- if (col>maxcol)
- maxcol = col;
- continue;
-
- case '\r':
- col = 0;
- continue;
-
- case '_':
- if (col>=LINELN) {
- col++;
- continue;
- }
- if (linebuf[col]!=' ') {
- ovbuf[2*col] = 0377;
- ovbuf[2*col+1] = 0377;
- ov++;
- } else
- linebuf[col] = c;
- col++;
- if (col>maxcol)
- maxcol = col;
- continue;
-
- case '\n':
- if (maxcol>=LINELN)
- maxcol = LINELN;
- linebuf[maxcol] = 0;
- return(1);
-
- case '\b':
- if (col>0)
- col--;
- continue;
- }
- }
-
- putline(ff)
- {
- register char *lp;
- register c;
- extern errno;
-
- errno = 0;
- lp = linebuf;
- while (c = *lp++)
- putc(c, out);
- if (ov) {
- putc('\n', out);
- fflush(out);
- ioctl(fileno(out), SETSTATE, pltmode);
- for (lp=ovbuf; lp < &ovbuf[2*LINELN]; )
- putc(*lp++, out);
- fflush(out);
- ioctl(fileno(out), SETSTATE, prtmode);
- }
- if (ff) {
- putc('\014', out);
- npages++;
- } else if (ov==0)
- putc('\n', out);
- if (ferror(out)) {
- printf("Printer IO error\n");
- exit(1);
- }
- }
-
- banner(s)
- char *s;
- {
- long timeb;
- register char *sp;
- int i, j, t;
-
- fprintf(out, "\n\n\n\n\n\n\n\n");
- for (i=0; i<16; i++) {
- fprintf(out, " ");
- for (sp=s; *sp; sp++) {
- if (*sp<=' '|| *sp >'}')
- continue;
- fprintf(out, " ");
- t = chrtab[*sp - ' '][i];
- for (j=7; j>=0; j--)
- if ((t>>j) & 01)
- putc('X', out);
- else
- putc(' ', out);
- }
- putc('\n', out);
- }
- fprintf(out, "\n\n\n\n\n\n\n\n");
- time(&timeb);
- fprintf(out, " ");
- fprintf(out, ctime(&timeb));
- fprintf(out, "\014");
- }
-
- char chrtab[][16] = {
- 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, sp, */
- 0010,0010,0010,0010,0010,0010,0010,0010,0000,0000,0010,0000,0000,0000,0000,0000, /*, !, */
- 0024,0024,0024,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, ", */
- 0000,0000,0000,0044,0044,0176,0044,0044,0176,0044,0044,0000,0000,0000,0000,0000, /*, #, */
- 0000,0010,0010,0010,0076,0101,0100,0076,0001,0101,0076,0010,0010,0000,0000,0000, /*, $, */
- 0000,0000,0000,0141,0142,0004,0010,0010,0020,0043,0103,0000,0000,0000,0000,0000, /*, %, */
- 0000,0000,0070,0104,0110,0060,0060,0111,0106,0106,0071,0000,0000,0000,0000,0000, /*, &, */
- 0004,0010,0020,0040,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, ', */
- 0000,0004,0010,0020,0040,0040,0040,0040,0040,0040,0020,0010,0004,0000,0000,0000, /*, (, */
- 0000,0040,0020,0010,0004,0004,0004,0004,0004,0004,0010,0020,0040,0000,0000,0000, /*, ), */
- 0000,0000,0000,0010,0111,0052,0034,0177,0034,0052,0111,0010,0000,0000,0000,0000, /*, *, */
- 0000,0000,0000,0000,0010,0010,0010,0177,0010,0010,0010,0000,0000,0000,0000,0000, /*, +, */
- 0000,0000,0000,0000,0000,0000,0000,0000,0000,0030,0030,0010,0020,0000,0000,0000, /*, ,, */
- 0000,0000,0000,0000,0000,0000,0000,0176,0000,0000,0000,0000,0000,0000,0000,0000, /*, -, */
- 0000,0000,0000,0000,0000,0000,0000,0000,0000,0030,0030,0000,0000,0000,0000,0000, /*, ., */
- 0000,0000,0001,0002,0004,0010,0010,0010,0020,0040,0100,0000,0000,0000,0000,0000, /*, /, */
- 0000,0030,0044,0102,0102,0102,0102,0102,0102,0044,0030,0000,0000,0000,0000,0000, /*, 0, */
- 0000,0010,0030,0010,0010,0010,0010,0010,0010,0010,0034,0000,0000,0000,0000,0000, /*, 1, */
- 0000,0070,0104,0004,0004,0010,0020,0040,0100,0100,0174,0000,0000,0000,0000,0000, /*, 2, */
- 0000,0176,0004,0004,0010,0014,0002,0002,0002,0104,0070,0000,0000,0000,0000,0000, /*, 3, */
- 0000,0004,0014,0024,0044,0104,0176,0004,0004,0004,0004,0000,0000,0000,0000,0000, /*, 4, */
- 0000,0174,0100,0100,0130,0144,0002,0002,0102,0044,0030,0000,0000,0000,0000,0000, /*, 5, */
- 0000,0074,0102,0100,0130,0144,0102,0102,0102,0044,0030,0000,0000,0000,0000,0000, /*, 6, */
- 0000,0176,0004,0004,0010,0010,0020,0020,0040,0040,0040,0000,0000,0000,0000,0000, /*, 7, */
- 0000,0034,0042,0101,0042,0076,0101,0101,0101,0101,0076,0000,0000,0000,0000,0000, /*, 8, */
- 0000,0034,0042,0101,0101,0101,0043,0036,0004,0010,0020,0040,0000,0000,0000,0000, /*, 9, */
- 0000,0000,0000,0000,0000,0000,0030,0030,0000,0030,0030,0000,0000,0000,0000,0000, /*, :, */
- 0000,0000,0000,0000,0000,0000,0030,0030,0000,0030,0030,0020,0040,0000,0000,0000, /*, ;, */
- 0002,0004,0010,0020,0040,0100,0040,0020,0010,0004,0002,0000,0000,0000,0000,0000, /*, <, */
- 0000,0000,0000,0000,0177,0000,0177,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, =, */
- 0100,0040,0020,0010,0004,0002,0004,0010,0020,0040,0100,0000,0000,0000,0000,0000, /*, >, */
- 0000,0030,0044,0102,0001,0002,0004,0010,0010,0000,0010,0000,0000,0000,0000,0000, /*, ?, */
- 0000,0074,0102,0101,0115,0123,0121,0121,0121,0111,0046,0000,0000,0000,0000,0000, /*, @, */
- 0000,0010,0024,0042,0101,0101,0177,0101,0101,0101,0101,0000,0000,0000,0000,0000, /*, A, */
- 0000,0176,0101,0101,0101,0176,0101,0101,0101,0101,0176,0000,0000,0000,0000,0000, /*, B, */
- 0000,0076,0101,0100,0100,0100,0100,0100,0100,0101,0076,0000,0000,0000,0000,0000, /*, C, */
- 0000,0176,0101,0101,0101,0101,0101,0101,0101,0101,0176,0000,0000,0000,0000,0000, /*, D, */
- 0000,0176,0100,0100,0100,0170,0100,0100,0100,0100,0177,0000,0000,0000,0000,0000, /*, E, */
- 0000,0177,0100,0100,0100,0174,0100,0100,0100,0100,0100,0000,0000,0000,0000,0000, /*, F, */
- 0000,0076,0101,0100,0100,0117,0101,0101,0101,0101,0076,0000,0000,0000,0000,0000, /*, G, */
- 0000,0101,0101,0101,0101,0176,0101,0101,0101,0101,0101,0000,0000,0000,0000,0000, /*, H, */
- 0000,0034,0010,0010,0010,0010,0010,0010,0010,0010,0034,0000,0000,0000,0000,0000, /*, I, */
- 0000,0016,0004,0004,0004,0004,0004,0004,0104,0104,0070,0000,0000,0000,0000,0000, /*, J, */
- 0000,0101,0102,0104,0110,0120,0160,0110,0104,0102,0101,0000,0000,0000,0000,0000, /*, K, */
- 0000,0100,0100,0100,0100,0100,0100,0100,0100,0100,0177,0000,0000,0000,0000,0000, /*, L, */
- 0000,0101,0143,0125,0111,0101,0101,0101,0101,0101,0101,0000,0000,0000,0000,0000, /*, M, */
- 0000,0101,0141,0121,0111,0105,0103,0101,0101,0101,0101,0000,0000,0000,0000,0000, /*, N, */
- 0000,0076,0101,0101,0101,0101,0101,0101,0101,0101,0076,0000,0000,0000,0000,0000, /*, O, */
- 0000,0176,0101,0101,0101,0176,0100,0100,0100,0100,0100,0000,0000,0000,0000,0000, /*, P, */
- 0000,0076,0101,0101,0101,0101,0101,0101,0131,0105,0076,0002,0001,0000,0000,0000, /*, Q, */
- 0000,0176,0101,0101,0101,0176,0104,0102,0101,0101,0101,0000,0000,0000,0000,0000, /*, R, */
- 0000,0076,0101,0100,0100,0076,0001,0001,0001,0101,0076,0000,0000,0000,0000,0000, /*, S, */
- 0000,0177,0010,0010,0010,0010,0010,0010,0010,0010,0010,0000,0000,0000,0000,0000, /*, T, */
- 0000,0101,0101,0101,0101,0101,0101,0101,0101,0101,0076,0000,0000,0000,0000,0000, /*, U, */
- 0000,0101,0101,0101,0101,0101,0101,0101,0042,0024,0010,0000,0000,0000,0000,0000, /*, V, */
- 0000,0101,0101,0101,0101,0111,0111,0125,0143,0101,0101,0000,0000,0000,0000,0000, /*, W, */
- 0000,0101,0101,0042,0024,0010,0024,0042,0101,0101,0101,0000,0000,0000,0000,0000, /*, X, */
- 0000,0101,0042,0024,0010,0010,0010,0010,0010,0010,0010,0000,0000,0000,0000,0000, /*, Y, */
- 0000,0177,0001,0002,0004,0010,0020,0040,0100,0100,0177,0000,0000,0000,0000,0000, /*, Z, */
- 0000,0034,0020,0020,0020,0020,0020,0020,0020,0020,0020,0034,0000,0000,0000,0000, /*, [, */
- 0000,0000,0100,0040,0020,0010,0010,0010,0004,0002,0001,0000,0000,0000,0000,0000, /*, , \, */
- 0000,0070,0010,0010,0010,0010,0010,0010,0010,0010,0010,0070,0000,0000,0000,0000, /*, ], */
- 0010,0024,0042,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, ^, */
- 0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0377,0000,0000, /*, _, */
- 0040,0020,0010,0004,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, `, */
- 0000,0000,0000,0000,0000,0074,0002,0076,0102,0102,0076,0000,0000,0000,0000,0000, /*, a, */
- 0000,0100,0100,0100,0100,0174,0102,0102,0102,0102,0174,0000,0000,0000,0000,0000, /*, b, */
- 0000,0000,0000,0000,0000,0074,0102,0100,0100,0102,0074,0000,0000,0000,0000,0000, /*, c, */
- 0002,0002,0002,0002,0002,0076,0102,0102,0102,0102,0076,0000,0000,0000,0000,0000, /*, d, */
- 0000,0000,0000,0000,0000,0074,0102,0174,0100,0102,0074,0000,0000,0000,0000,0000, /*, e, */
- 0000,0016,0020,0020,0020,0176,0020,0020,0020,0020,0020,0000,0000,0000,0000,0000, /*, f, */
- 0000,0000,0000,0000,0000,0076,0102,0102,0102,0102,0076,0002,0002,0102,0076,0000, /*, g, */
- 0000,0100,0100,0100,0100,0174,0102,0102,0102,0102,0102,0000,0000,0000,0000,0000, /*, h, */
- 0000,0000,0000,0010,0000,0030,0010,0010,0010,0010,0034,0000,0000,0000,0000,0000, /*, i, */
- 0000,0000,0000,0010,0000,0030,0010,0010,0010,0010,0010,0010,0010,0050,0020,0000, /*, j, */
- 0000,0100,0100,0100,0100,0106,0110,0120,0160,0110,0106,0000,0000,0000,0000,0000, /*, k, */
- 0000,0030,0010,0010,0010,0010,0010,0010,0010,0010,0034,0000,0000,0000,0000,0000, /*, l, */
- 0000,0000,0000,0000,0000,0166,0111,0111,0111,0111,0111,0000,0000,0000,0000,0000, /*, m, */
- 0000,0000,0000,0000,0100,0174,0102,0102,0102,0102,0102,0000,0000,0000,0000,0000, /*, n, */
- 0000,0000,0000,0000,0000,0074,0102,0102,0102,0102,0074,0000,0000,0000,0000,0000, /*, o, */
- 0000,0000,0000,0000,0000,0174,0102,0102,0102,0102,0174,0100,0100,0100,0100,0000, /*, p, */
- 0000,0000,0000,0000,0000,0076,0102,0102,0102,0102,0076,0002,0002,0002,0002,0000, /*, q, */
- 0000,0000,0000,0000,0000,0134,0142,0100,0100,0100,0100,0000,0000,0000,0000,0000, /*, r, */
- 0000,0000,0000,0000,0000,0076,0100,0074,0002,0102,0074,0000,0000,0000,0000,0000, /*, s, */
- 0000,0020,0020,0020,0020,0176,0020,0020,0020,0020,0014,0000,0000,0000,0000,0000, /*, t, */
- 0000,0000,0000,0000,0000,0102,0102,0102,0102,0102,0075,0000,0000,0000,0000,0000, /*, u, */
- 0000,0000,0000,0000,0000,0101,0101,0101,0042,0024,0010,0000,0000,0000,0000,0000, /*, v, */
- 0000,0000,0000,0000,0000,0111,0111,0111,0111,0111,0066,0000,0000,0000,0000,0000, /*, w, */
- 0000,0000,0000,0000,0000,0102,0044,0030,0030,0044,0102,0000,0000,0000,0000,0000, /*, x, */
- 0000,0000,0000,0000,0000,0102,0102,0102,0042,0024,0010,0020,0040,0100,0000,0000, /*, y, */
- 0000,0000,0000,0000,0000,0176,0004,0010,0020,0040,0176,0000,0000,0000,0000,0000, /*, z, */
- 0000,0014,0020,0020,0020,0020,0040,0020,0020,0020,0020,0014,0000,0000,0000,0000, /*, {, */
- 0000,0010,0010,0010,0010,0000,0000,0010,0010,0010,0010,0000,0000,0000,0000,0000, /*, |, */
- 0000,0030,0010,0010,0010,0010,0004,0010,0010,0010,0010,0030,0000,0000,0000,0000, /*, }, */
- 0020,0052,0004,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, /*, ~, */
- 0000,0176,0176,0176,0176,0176,0176,0176,0176,0176,0176,0000,0000,0000,0000,0000, /*, del, */
- };
-