|
|
1.1 root 1: /*
2: * print file with headings
3: * 2+head+2+page[56]+5
4: */
5:
6: #include <stdio.h>
7: #include <signal.h>
8: #include <sys/types.h>
9: #include <sys/stat.h>
10:
11: int ncol = 1;
12: char *header;
13: int col;
14: int icol;
15: FILE *file;
16: char *bufp;
17: #define BUFS 6720
18: char buffer[BUFS]; /* for multi-column output */
19: char obuf[BUFSIZ];
20: #define FF 014
21: int line;
22: char *colp[72];
23: int nofile;
24: char isclosed[10];
25: FILE *ifile[10];
26: char **lastarg;
27: int peekc;
28: int fpage;
29: int page;
30: int colw;
31: int nspace;
32: int width = 72;
33: int length = 66;
34: int plength = 61;
35: int margin = 10;
36: int ntflg;
37: int mflg;
38: int tabc;
39: char *tty;
40: int mode;
41: char *ttyname();
42: char *ctime();
43:
44: main(argc, argv)
45: char **argv;
46: {
47: int nfdone;
48: int onintr();
49:
50: setbuf(stdout, obuf);
51: if (signal(SIGINT, SIG_IGN) != SIG_IGN)
52: signal(SIGINT, onintr);
53: lastarg = &argv[argc-1];
54: fixtty();
55: for (nfdone=0; argc>1; argc--) {
56: argv++;
57: if (**argv == '-') {
58: switch (*++*argv) {
59: case 'h':
60: if (argc>=2) {
61: header = *++argv;
62: argc--;
63: }
64: continue;
65:
66: case 't':
67: ntflg++;
68: continue;
69:
70: case 'l':
71: length = atoi(++*argv);
72: continue;
73:
74: case 'w':
75: width = atoi(++*argv);
76: continue;
77:
78: case 's':
79: if (*++*argv)
80: tabc = **argv;
81: else
82: tabc = '\t';
83: continue;
84:
85: case 'm':
86: mflg++;
87: continue;
88:
89: default:
90: ncol = atoi(*argv);
91: continue;
92: }
93: } else if (**argv == '+') {
94: fpage = atoi(++*argv);
95: } else {
96: print(*argv, argv);
97: nfdone++;
98: if (mflg)
99: break;
100: }
101: }
102: if (nfdone==0)
103: print((char *)0, (char **)0);
104: done();
105: }
106:
107: done()
108: {
109:
110: if (tty)
111: chmod(tty, mode);
112: exit(0);
113: }
114:
115: onintr()
116: {
117:
118: if (tty)
119: chmod(tty, mode);
120: _exit(1);
121: }
122:
123: fixtty()
124: {
125: struct stat sbuf;
126:
127: tty = ttyname(1);
128: if (tty == 0)
129: return;
130: stat(tty, &sbuf);
131: mode = sbuf.st_mode&0777;
132: chmod(tty, 0600);
133: }
134:
135: print(fp, argp)
136: char *fp;
137: char **argp;
138: {
139: extern char *sprintf();
140: struct stat sbuf;
141: register sncol;
142: register char *sheader;
143: register char *cbuf;
144: char linebuf[150], *cp;
145:
146: if (ntflg)
147: margin = 0;
148: else
149: margin = 10;
150: if (length <= margin)
151: length = 66;
152: if (width <= 0)
153: width = 72;
154: if (ncol>72 || ncol>width) {
155: fprintf(stderr, "pr: No room for columns.\n");
156: done();
157: }
158: if (mflg) {
159: mopen(argp);
160: ncol = nofile;
161: }
162: colw = width/(ncol==0? 1 : ncol);
163: sncol = ncol;
164: sheader = header;
165: plength = length-5;
166: if (ntflg)
167: plength = length;
168: if (--ncol<0)
169: ncol = 0;
170: if (mflg)
171: fp = 0;
172: if (fp) {
173: if((file=fopen(fp, "r"))==NULL) {
174: if (tty==NULL)
175: fprintf(stderr, "pr: can't open %s\n", fp);
176: ncol = sncol;
177: header = sheader;
178: return;
179: }
180: stat(fp, &sbuf);
181: } else {
182: file = stdin;
183: time(&sbuf.st_mtime);
184: }
185: if (header == 0)
186: header = fp?fp:"";
187: cbuf = ctime(&sbuf.st_mtime);
188: cbuf[16] = '\0';
189: cbuf[24] = '\0';
190: page = 1;
191: icol = 0;
192: colp[ncol] = bufp = buffer;
193: if (mflg==0)
194: nexbuf();
195: while (mflg&&nofile || (!mflg)&&tpgetc(ncol)>0) {
196: if (mflg==0) {
197: colp[ncol]--;
198: if (colp[ncol] < buffer)
199: colp[ncol] = &buffer[BUFS];
200: }
201: line = 0;
202: if (ntflg==0) {
203: sprintf(linebuf, "\n\n%s %s %s Page %d\n\n\n",
204: cbuf+4, cbuf+20, header, page);
205: for(cp=linebuf;*cp;) put(*cp++);
206: }
207: putpage();
208: if (ntflg==0)
209: while(line<length)
210: put('\n');
211: page++;
212: }
213: fclose(file);
214: ncol = sncol;
215: header = sheader;
216: }
217:
218: mopen(ap)
219: char **ap;
220: {
221: register char **p, *p1;
222:
223: p = ap;
224: while((p1 = *p) && p++ <= lastarg) {
225: if((ifile[nofile]=fopen(p1, "r")) == NULL){
226: isclosed[nofile] = 1;
227: nofile--;
228: }
229: else
230: isclosed[nofile] = 0;
231: if(++nofile>=10) {
232: fprintf(stderr, "pr: Too many args\n");
233: done();
234: }
235: }
236: }
237:
238: putpage()
239: {
240: register int lastcol, i, c;
241: int j;
242:
243: if (ncol==0) {
244: while (line<plength) {
245: while((c = tpgetc(0)) && c!='\n' && c!=FF)
246: putcp(c);
247: putcp('\n');
248: line++;
249: if (c==FF)
250: break;
251: }
252: return;
253: }
254: colp[0] = colp[ncol];
255: if (mflg==0) for (i=1; i<=ncol; i++) {
256: colp[i] = colp[i-1];
257: for (j = margin; j<length; j++)
258: while((c=tpgetc(i))!='\n')
259: if (c==0)
260: break;
261: }
262: while (line<plength) {
263: lastcol = colw;
264: for (i=0; i<ncol; i++) {
265: while ((c=pgetc(i)) && c!='\n')
266: if (col<lastcol || tabc!=0)
267: put(c);
268: if (c==0)
269: continue;
270: if (tabc)
271: put(tabc);
272: else while (col<lastcol)
273: put(' ');
274: lastcol += colw;
275: }
276: while ((c = pgetc(ncol)) && c!='\n')
277: put(c);
278: put('\n');
279: }
280: }
281:
282: nexbuf()
283: {
284: register int n;
285: register char *rbufp;
286:
287: rbufp = bufp;
288: n = &buffer[BUFS] - rbufp;
289: if (n>512)
290: n = 512;
291: if((n=fread(rbufp,1,n,file)) <= 0){
292: fclose(file);
293: *rbufp = 0376;
294: }
295: else {
296: rbufp += n;
297: if (rbufp >= &buffer[BUFS])
298: rbufp = buffer;
299: *rbufp = 0375;
300: }
301: bufp = rbufp;
302: }
303:
304: tpgetc(ai)
305: {
306: register char **p;
307: register int c, i;
308:
309: i = ai;
310: if (mflg) {
311: if((c=getc(ifile[i])) == EOF) {
312: if (isclosed[i]==0) {
313: isclosed[i] = 1;
314: if (--nofile <= 0)
315: return(0);
316: }
317: return('\n');
318: }
319: if (c==FF && ncol>0)
320: c = '\n';
321: return(c);
322: }
323: loop:
324: c = **(p = &colp[i]) & 0377;
325: if (c == 0375) {
326: nexbuf();
327: c = **p & 0377;
328: }
329: if (c == 0376)
330: return(0);
331: (*p)++;
332: if (*p >= &buffer[BUFS])
333: *p = buffer;
334: if (c==0)
335: goto loop;
336: return(c);
337: }
338:
339: pgetc(i)
340: {
341: register int c;
342:
343: if (peekc) {
344: c = peekc;
345: peekc = 0;
346: } else
347: c = tpgetc(i);
348: if (tabc)
349: return(c);
350: switch (c) {
351:
352: case '\t':
353: icol++;
354: if ((icol&07) != 0)
355: peekc = '\t';
356: return(' ');
357:
358: case '\n':
359: icol = 0;
360: break;
361:
362: case 010:
363: case 033:
364: icol--;
365: break;
366: }
367: if (c >= ' ')
368: icol++;
369: return(c);
370: }
371: put(ac)
372: {
373: register int ns, c;
374:
375: c = ac;
376: if (tabc) {
377: putcp(c);
378: if (c=='\n')
379: line++;
380: return;
381: }
382: switch (c) {
383:
384: case ' ':
385: nspace++;
386: col++;
387: return;
388:
389: case '\n':
390: col = 0;
391: nspace = 0;
392: line++;
393: break;
394:
395: case 010:
396: case 033:
397: if (--col<0)
398: col = 0;
399: if (--nspace<0)
400: nspace = 0;
401:
402: }
403: while(nspace) {
404: if (nspace>2 && col > (ns=((col-nspace)|07))) {
405: nspace = col-ns-1;
406: putcp('\t');
407: } else {
408: nspace--;
409: putcp(' ');
410: }
411: }
412: if (c >= ' ')
413: col++;
414: putcp(c);
415: }
416:
417: putcp(c)
418: {
419: if (page >= fpage)
420: putchar(c);
421: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.