Bell 32V development
authorTom London <tbl@research.uucp>
Mon, 11 Dec 1978 00:26:42 +0000 (19:26 -0500)
committerTom London <tbl@research.uucp>
Mon, 11 Dec 1978 00:26:42 +0000 (19:26 -0500)
Work on file usr/src/cmd/pr.c

Co-Authored-By: John Reiser <jfr@research.uucp>
Synthesized-from: 32v

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

diff --git a/usr/src/cmd/pr.c b/usr/src/cmd/pr.c
new file mode 100644 (file)
index 0000000..880661e
--- /dev/null
@@ -0,0 +1,421 @@
+/*
+ *   print file with headings
+ *  2+head+2+page[56]+5
+ */
+
+#include <stdio.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int    ncol    = 1;
+char   *header;
+int    col;
+int    icol;
+FILE   *file;
+char   *bufp;
+#define        BUFS    6720
+char   buffer[BUFS];   /* for multi-column output */
+char   obuf[BUFSIZ];
+#define        FF      014
+int    line;
+char   *colp[72];
+int    nofile;
+char   isclosed[10];
+FILE   *ifile[10];
+char   **lastarg;
+int    peekc;
+int    fpage;
+int    page;
+int    colw;
+int    nspace;
+int    width   = 72;
+int    length  = 66;
+int    plength = 61;
+int    margin  = 10;
+int    ntflg;
+int    mflg;
+int    tabc;
+char   *tty;
+int    mode;
+char   *ttyname();
+char   *ctime();
+
+main(argc, argv)
+char **argv;
+{
+       int nfdone;
+       int onintr();
+
+       setbuf(stdout, obuf);
+       if (signal(SIGINT, SIG_IGN) != SIG_IGN)
+               signal(SIGINT, onintr);
+       lastarg = &argv[argc-1];
+       fixtty();
+       for (nfdone=0; argc>1; argc--) {
+               argv++;
+               if (**argv == '-') {
+                       switch (*++*argv) {
+                       case 'h':
+                               if (argc>=2) {
+                                       header = *++argv;
+                                       argc--;
+                               }
+                               continue;
+
+                       case 't':
+                               ntflg++;
+                               continue;
+
+                       case 'l':
+                               length = atoi(++*argv);
+                               continue;
+
+                       case 'w':
+                               width = atoi(++*argv);
+                               continue;
+
+                       case 's':
+                               if (*++*argv)
+                                       tabc = **argv;
+                               else
+                                       tabc = '\t';
+                               continue;
+
+                       case 'm':
+                               mflg++;
+                               continue;
+
+                       default:
+                               ncol = atoi(*argv);
+                               continue;
+                       }
+               } else if (**argv == '+') {
+                       fpage = atoi(++*argv);
+               } else {
+                       print(*argv, argv);
+                       nfdone++;
+                       if (mflg)
+                               break;
+               }
+       }
+       if (nfdone==0)
+               print((char *)0, (char **)0);
+       done();
+}
+
+done()
+{
+
+       if (tty)
+               chmod(tty, mode);
+       exit(0);
+}
+
+onintr()
+{
+
+       if (tty)
+               chmod(tty, mode);
+       _exit(1);
+}
+
+fixtty()
+{
+       struct stat sbuf;
+
+       tty = ttyname(1);
+       if (tty == 0)
+               return;
+       stat(tty, &sbuf);
+       mode = sbuf.st_mode&0777;
+       chmod(tty, 0600);
+}
+
+print(fp, argp)
+char *fp;
+char **argp;
+{
+       extern char *sprintf();
+       struct stat sbuf;
+       register sncol;
+       register char *sheader;
+       register char *cbuf;
+       char linebuf[150], *cp;
+
+       if (ntflg)
+               margin = 0;
+       else
+               margin = 10;
+       if (length <= margin)
+               length = 66;
+       if (width <= 0)
+               width = 72;
+       if (ncol>72 || ncol>width) {
+               fprintf(stderr, "pr: No room for columns.\n");
+               done();
+       }
+       if (mflg) {
+               mopen(argp);
+               ncol = nofile;
+       }
+       colw = width/(ncol==0? 1 : ncol);
+       sncol = ncol;
+       sheader = header;
+       plength = length-5;
+       if (ntflg)
+               plength = length;
+       if (--ncol<0)
+               ncol = 0;
+       if (mflg)
+               fp = 0;
+       if (fp) {
+               if((file=fopen(fp, "r"))==NULL) {
+                       if (tty==NULL)
+                               fprintf(stderr, "pr: can't open %s\n", fp);
+                       ncol = sncol;
+                       header = sheader;
+                       return;
+               }
+               stat(fp, &sbuf);
+       } else {
+               file = stdin;
+               time(&sbuf.st_mtime);
+       }
+       if (header == 0)
+               header = fp?fp:"";
+       cbuf = ctime(&sbuf.st_mtime);
+       cbuf[16] = '\0';
+       cbuf[24] = '\0';
+       page = 1;
+       icol = 0;
+       colp[ncol] = bufp = buffer;
+       if (mflg==0)
+               nexbuf();
+       while (mflg&&nofile || (!mflg)&&tpgetc(ncol)>0) {
+               if (mflg==0) {
+                       colp[ncol]--;
+                       if (colp[ncol] < buffer)
+                               colp[ncol] = &buffer[BUFS];
+               }
+               line = 0;
+               if (ntflg==0) {
+                       sprintf(linebuf, "\n\n%s %s  %s Page %d\n\n\n",
+                               cbuf+4, cbuf+20, header, page);
+                       for(cp=linebuf;*cp;) put(*cp++);
+               }
+               putpage();
+               if (ntflg==0)
+                       while(line<length)
+                               put('\n');
+               page++;
+       }
+       fclose(file);
+       ncol = sncol;
+       header = sheader;
+}
+
+mopen(ap)
+char **ap;
+{
+       register char **p, *p1;
+
+       p = ap;
+       while((p1 = *p) && p++ <= lastarg) {
+               if((ifile[nofile]=fopen(p1, "r")) == NULL){
+                       isclosed[nofile] = 1;
+                       nofile--;
+               }
+               else
+                       isclosed[nofile] = 0;
+               if(++nofile>=10) {
+                       fprintf(stderr, "pr: Too many args\n");
+                       done();
+               }
+       }
+}
+
+putpage()
+{
+       register int lastcol, i, c;
+       int j;
+
+       if (ncol==0) {
+               while (line<plength) {
+                       while((c = tpgetc(0)) && c!='\n' && c!=FF)
+                               putcp(c);
+                       putcp('\n');
+                       line++;
+                       if (c==FF)
+                               break;
+               }
+               return;
+       }
+       colp[0] = colp[ncol];
+       if (mflg==0) for (i=1; i<=ncol; i++) {
+               colp[i] = colp[i-1];
+               for (j = margin; j<length; j++)
+                       while((c=tpgetc(i))!='\n')
+                               if (c==0)
+                                       break;
+       }
+       while (line<plength) {
+               lastcol = colw;
+               for (i=0; i<ncol; i++) {
+                       while ((c=pgetc(i)) && c!='\n')
+                               if (col<lastcol || tabc!=0)
+                                       put(c);
+                       if (c==0)
+                               continue;
+                       if (tabc)
+                               put(tabc);
+                       else while (col<lastcol)
+                               put(' ');
+                       lastcol += colw;
+               }
+               while ((c = pgetc(ncol)) && c!='\n')
+                       put(c);
+               put('\n');
+       }
+}
+
+nexbuf()
+{
+       register int n;
+       register char *rbufp;
+
+       rbufp = bufp;
+       n = &buffer[BUFS] - rbufp;
+       if (n>512)
+               n = 512;
+       if((n=fread(rbufp,1,n,file)) <= 0){
+               fclose(file);
+               *rbufp = 0376;
+       }
+       else {
+               rbufp += n;
+               if (rbufp >= &buffer[BUFS])
+                       rbufp = buffer;
+               *rbufp = 0375;
+       }
+       bufp = rbufp;
+}
+
+tpgetc(ai)
+{
+       register char **p;
+       register int c, i;
+
+       i = ai;
+       if (mflg) {
+               if((c=getc(ifile[i])) == EOF) {
+                       if (isclosed[i]==0) {
+                               isclosed[i] = 1;
+                               if (--nofile <= 0)
+                                       return(0);
+                       }
+                       return('\n');
+               }
+               if (c==FF && ncol>0)
+                       c = '\n';
+               return(c);
+       }
+loop:
+       c = **(p = &colp[i]) & 0377;
+       if (c == 0375) {
+               nexbuf();
+               c = **p & 0377;
+       }
+       if (c == 0376)
+               return(0);
+       (*p)++;
+       if (*p >= &buffer[BUFS])
+               *p = buffer;
+       if (c==0)
+               goto loop;
+       return(c);
+}
+
+pgetc(i)
+{
+       register int c;
+
+       if (peekc) {
+               c = peekc;
+               peekc = 0;
+       } else
+               c = tpgetc(i);
+       if (tabc)
+               return(c);
+       switch (c) {
+
+       case '\t':
+               icol++;
+               if ((icol&07) != 0)
+                       peekc = '\t';
+               return(' ');
+
+       case '\n':
+               icol = 0;
+               break;
+
+       case 010:
+       case 033:
+               icol--;
+               break;
+       }
+       if (c >= ' ')
+               icol++;
+       return(c);
+}
+put(ac)
+{
+       register int ns, c;
+
+       c = ac;
+       if (tabc) {
+               putcp(c);
+               if (c=='\n')
+                       line++;
+               return;
+       }
+       switch (c) {
+
+       case ' ':
+               nspace++;
+               col++;
+               return;
+
+       case '\n':
+               col = 0;
+               nspace = 0;
+               line++;
+               break;
+
+       case 010:
+       case 033:
+               if (--col<0)
+                       col = 0;
+               if (--nspace<0)
+                       nspace = 0;
+
+       }
+       while(nspace) {
+               if (nspace>2 && col > (ns=((col-nspace)|07))) {
+                       nspace = col-ns-1;
+                       putcp('\t');
+               } else {
+                       nspace--;
+                       putcp(' ');
+               }
+       }
+       if (c >= ' ')
+               col++;
+       putcp(c);
+}
+
+putcp(c)
+{
+       if (page >= fpage)
+               putchar(c);
+}