]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/p.c
libtags, zuke: add *.mod support (thanks kemal)
[plan9front.git] / sys / src / cmd / p.c
1 #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
7 Biobuf *cons;
8 Biobuf bout;
9
10 int pglen = DEF;
11
12 void printfile(int);
13
14 void
15 main(int argc, char *argv[])
16 {
17         int n;
18         int f;
19
20         if((cons = Bopen("/dev/cons", OREAD)) == 0) {
21                 fprint(2, "p: can't open /dev/cons\n");
22                 exits("missing /dev/cons");
23         }
24         Blethal(cons, nil);
25         Binit(&bout, 1, OWRITE);
26         Blethal(&bout, nil);
27         n = 0;
28         while(argc > 1) {
29                 --argc; argv++;
30                 if(*argv[0] == '-'){
31                         pglen = atoi(&argv[0][1]);
32                         if(pglen <= 0)
33                                 pglen = DEF;
34                 } else {
35                         n++;
36                         f = open(argv[0], OREAD);
37                         if(f < 0){
38                                 fprint(2, "p: can't open %s - %r\n", argv[0]);
39                                 continue;
40                         }
41                         printfile(f);
42                         close(f);
43                 }
44         }
45         if(n == 0)
46                 printfile(0);
47         exits(0);
48 }
49
50 void
51 printfile(int f)
52 {
53         int i, j, n;
54         char *s, *cmd;
55         Biobuf *b;
56
57         b = malloc(sizeof(Biobuf));
58         Binit(b, f, OREAD);
59         Blethal(b, nil);
60         for(;;){
61                 for(i=1; i <= pglen; i++) {
62                         s = Brdline(b, '\n');
63                         if(s == 0){
64                                 n = Blinelen(b);
65                                 if(n > 0)       /* line too long for Brdline */
66                                         for(j=0; j<n; j++)
67                                                 Bputc(&bout, Bgetc(b));
68                                 else{           /* true EOF */
69                                         free(b);
70                                         return;
71                                 }
72                         }else{
73                                 Bwrite(&bout, s, Blinelen(b)-1);
74                                 if(i < pglen)
75                                         Bwrite(&bout, "\n", 1);
76                         }
77                 }
78                 Bflush(&bout);
79             getcmd:
80                 cmd = Brdline(cons, '\n');
81                 if(cmd == 0 || *cmd == 'q')
82                         exits(0);
83                 cmd[Blinelen(cons)-1] = 0;
84                 if(*cmd == '!'){
85                         if(fork() == 0){
86                                 dup(Bfildes(cons), 0);
87                                 execl("/bin/rc", "rc", "-c", cmd+1, nil);
88                         }
89                         waitpid();
90                         goto getcmd;
91                 }
92         }
93 }