BSD 3 development
authorBill Joy <wnj@ucbvax.Berkeley.EDU>
Tue, 27 Feb 1979 12:01:45 +0000 (04:01 -0800)
committerBill Joy <wnj@ucbvax.Berkeley.EDU>
Tue, 27 Feb 1979 12:01:45 +0000 (04:01 -0800)
Work on file usr/src/cmd/versatec/vpf.c

Synthesized-from: 3bsd

usr/src/cmd/versatec/vpf.c [new file with mode: 0644]

diff --git a/usr/src/cmd/versatec/vpf.c b/usr/src/cmd/versatec/vpf.c
new file mode 100644 (file)
index 0000000..c473183
--- /dev/null
@@ -0,0 +1,260 @@
+/*
+ * 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");
+*/
+}