Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
5 #define DEF 22 /* lines in chunk: 3*DEF == 66, #lines per nroff page */
7 Biobuf *cons;
8 Biobuf bout;
10 int pglen = DEF;
12 void printfile(int);
14 void
15 main(int argc, char *argv[])
16 {
17 int n;
18 int f;
20 if((cons = Bopen("/dev/tty", OREAD)) == 0) {
21 fprint(2, "p: can't open /dev/tty\n");
22 exits("missing /dev/tty");
23 }
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 }
48 void
49 printfile(int f)
50 {
51 int i, j, n;
52 char *s, *cmd;
53 Biobuf *b;
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 }