blob: ba63dad8e14e70a21cc3365876d406d4768c3f6a [file] [log] [blame]
rsc53db2d02004-04-21 22:37:11 +00001#include <u.h>
2#include <libc.h>
3#include <bio.h>
4
5#define DEF 22 /* lines in chunk: 3*DEF == 66, #lines per nroff page */
6
7Biobuf *cons;
8Biobuf bout;
9
10int pglen = DEF;
11
12void printfile(int);
13
14void
15main(int argc, char *argv[])
16{
17 int n;
18 int f;
19
rsc97dafe42004-04-24 05:22:42 +000020 if((cons = Bopen("/dev/tty", OREAD)) == 0) {
21 fprint(2, "p: can't open /dev/tty\n");
22 exits("missing /dev/tty");
rsc53db2d02004-04-21 22:37:11 +000023 }
24 Binit(&bout, 1, OWRITE);
25 n = 0;
26 while(argc > 1) {
27 --argc; argv++;
28 if(*argv[0] == '-'){
29 pglen = atoi(&argv[0][1]);
30 if(pglen <= 0)
31 pglen = DEF;
32 } else {
33 n++;
34 f = open(argv[0], OREAD);
35 if(f < 0){
36 fprint(2, "p: can't open %s\n", argv[0]);
37 continue;
38 }
39 printfile(f);
40 close(f);
41 }
42 }
43 if(n == 0)
44 printfile(0);
45 exits(0);
46}
47
48void
49printfile(int f)
50{
51 int i, j, n;
52 char *s, *cmd;
53 Biobuf *b;
54
55 b = malloc(sizeof(Biobuf));
56 Binit(b, f, OREAD);
57 for(;;){
58 for(i=1; i <= pglen; i++) {
59 s = Brdline(b, '\n');
60 if(s == 0){
61 n = Blinelen(b);
62 if(n > 0) /* line too long for Brdline */
63 for(j=0; j<n; j++)
64 Bputc(&bout, Bgetc(b));
65 else{ /* true EOF */
66 free(b);
67 return;
68 }
69 }else{
70 Bwrite(&bout, s, Blinelen(b)-1);
71 if(i < pglen)
72 Bwrite(&bout, "\n", 1);
73 }
74 }
75 Bflush(&bout);
76 getcmd:
77 cmd = Brdline(cons, '\n');
78 if(cmd == 0 || *cmd == 'q')
79 exits(0);
80 cmd[Blinelen(cons)-1] = 0;
81 if(*cmd == '!'){
82 if(fork() == 0){
83 dup(Bfildes(cons), 0);
84 execl("/bin/rc", "rc", "-c", cmd+1, 0);
85 }
86 waitpid();
87 goto getcmd;
88 }
89 }
90}