home *** CD-ROM | disk | FTP | other *** search
- /*
- * 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;
- 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(feof(file) ||
- (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);
- }
-