|
|
1.1 root 1: /*%cc p.c pad.o spname.o
2: */
3: #include <stdio.h>
4: #include "pad.h"
5: #include <signal.h>
6: #define DEF 22 /* 3*DEF == 66, #lines per nroff page */
7:
8: #define STDIN (char *)0
9: int nprintfiles = 0;
10: int lineno = 0;
11: int pglen = DEF;
12: FILE *tty;
13: static char obuf[BUFSIZ];
14:
15: #ifndef SPNAME
16: #define spopen(f, m) Pfopen(f, m)
17: #endif
18:
19: main(argc, argv)
20: char *argv[];
21: {
22: if((tty=fopen("/dev/tty", "r")) == NULL) {
23: fprintf(stderr, "p: no /dev/tty\n");
24: exit(1);
25: }
26: setbuf(stdout, obuf);
27: while(argc > 1) {
28: --argc; argv++;
29: if(*argv[0] == '-') {
30: pglen = atoi(&argv[0][1]);
31: if(pglen < 0)
32: pglen = DEF;
33: } else
34: printfile(argv[0], argc==1);
35: }
36: if(nprintfiles == 0)
37: printfile(STDIN, 1);
38: return 0;
39: }
40:
41: #if SPNAME
42: PAD *
43: spopen(file, mode)
44: register char *file;
45: register char *mode;
46: {
47: register PAD *f;
48: register int c;
49: extern char *spname();
50:
51: if ((f=Pfopen(file, mode)) != NULL)
52: return (f);
53: if ((file = spname(file)) == NULL)
54: return (f);
55: fprintf(stderr, "\"p %s\"? ", file);
56: fflush(stdout);
57: c = getc(tty);
58: if(c != 'n')
59: f=Pfopen(file, mode);
60: while(c != '\n' && c != EOF)
61: c = getc(tty);
62: return(f);
63: }
64: #endif
65:
66: printfile(file, last)
67: register char *file;
68: {
69: register PAD *pad;
70: register c;
71:
72: nprintfiles++;
73: if(file == STDIN)
74: pad=Pfdopen(0);
75: else if((pad=spopen(file, "r")) == NULL) {
76: fprintf(stderr, "p: can't open %s\n", file);
77: return;
78: }
79: while((c=Pgetc(pad))!=EOF || (!last && newline(pad)=='-')) {
80: if(c == '\n' && ++lineno==pglen) {
81: if(newline(pad)==EOF)
82: goto Return;
83: } else
84: putchar(c);
85: }
86: fflush(stdout);
87: Return:
88: Pclose(pad);
89: }
90:
91: newline(p)
92: register PAD *p;
93: {
94: register c, i;
95:
96: lineno = 0;
97: fflush(stdout);
98: loop:
99: switch(getc(tty)){
100: case '\n': /* Continue */
101: return '\n';
102: case '!':
103: callunix();
104: goto loop;
105: case 'q':
106: waitnl();
107: /* Fall through */
108: case EOF:
109: return EOF;
110: case '-':
111: for(i=1; (c=getc(tty))=='-'; i++)
112: ;
113: ungetc(c, tty);
114: backpage(p, i);
115: waitnl();
116: return '-';
117: default:
118: waitnl();
119: return '\n';
120: }
121: }
122:
123: backpage(p, pg)
124: register PAD *p;
125: register pg;
126: {
127: register i;
128: while(pg--)
129: for(i=0; i<pglen; i++)
130: if(backline(p)==EOF)
131: return;
132: /* Now at end of new first line; back up to beginning */
133: if(backline(p)=='\n')
134: (void)Pgetc(p); /* Eat that newline */
135: }
136:
137: backline(p)
138: register PAD *p;
139: {
140: register c;
141: while((c=Pbackc(p))!='\n')
142: if(c==EOF)
143: return(EOF);
144: return('\n');
145: }
146:
147: waitnl(){
148: do; while(getc(tty) != '\n');
149: }
150:
151: callunix()
152: {
153: int rc, status, unixpid;
154: char buf[256];
155: register char *p;
156: for(p=buf; (*p++=getc(tty))!='\n'; )
157: ;
158: *--p=0;
159: if( (unixpid=fork())==0 ) {
160: close(0); dup(2);
161: execl("/bin/sh", "sh", "-c", buf, 0);
162: exit(255);
163: }
164: else if(unixpid == -1){
165: fprintf(stderr, "p: can't fork\n");
166: return;
167: }else{ signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN);
168: while( (rc = wait(&status)) != unixpid && rc != -1 ) ;
169: signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL);
170: fprintf(stderr, "!\n");
171: fflush(stdout);
172: }
173: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.