p.c (1494B)
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/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 } 47 48 void 49 printfile(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 }