/* * vpr -- Versatec printer filter */ #include <stdio.h> #include <sgtty.h> #define LINELN 440 #define EJLINE 66 #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[LINELN]; FILE *in = {stdin}; /* FILE *out; */ #define out stdout char *ban; int npages = 1; char chrtab[][16]; int lineno; main(argc, argv) char **argv; { register int i; char obuf[BUFSIZ]; setbuf(stdout, obuf); /* vtex comes open on 3 from parent so don't feed paper after each file */ close(1); dup(3); close(3); ioctl(1, SETSTATE, prtmode); /* 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); } */ if (ban && access("/usr/adm/vpacct", 02)>=0 && freopen("/usr/adm/vpacct", "a", out) !=NULL) { fprintf(out, "%7.2f\t%s\n", npages * (11.0 / 12.0), 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++; /* } */ } npages = (lineno + EJLINE - 1) / EJLINE; return(1); } getline() { register col, maxcol, c; ov = 0; for (col=0; col<LINELN; col++) { linebuf[col] = ' '; ovbuf[col] = 0; } col = 0; maxcol = 0; for (;;) switch (c = getc(in)) { case EOF: return(0); default: if (c>=' ') { if (col < LINELN) { if (linebuf[col]=='_') { ov++; ovbuf[col] = 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[col] = 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, i; 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[LINELN]; ) { putc(*lp & 0377, out); putc(*lp++ & 0377, out); } fflush(out); ioctl(fileno(out), SETSTATE, &prtmode); } if (ff) { putc('\014', out); npages++; } else if (ov==0) putc('\n', out); if (ferror(out)) { fprintf(stderr, "Printer IO error\n"); exit(1); } } banner(s) char *s; { long timeb; register int i; time(&timeb); fprintf(out, "\n\n%s: %s", s, ctime(&timeb)); for (i = 0; i < LINELN; i++) putc('_', out); putc('\n', out); fflush(out); /* 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"); */ }