📄 pr.c
字号:
/* * 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 6720char buffer[BUFS]; /* for multi-column output */char obuf[BUFSIZ];#define FF 014int 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);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -