|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <bio.h> | 
|  |  | 
|  | #define	DEF	22	/* lines in chunk: 3*DEF == 66, #lines per nroff page */ | 
|  |  | 
|  | Biobuf *cons; | 
|  | Biobuf bout; | 
|  |  | 
|  | int pglen = DEF; | 
|  |  | 
|  | void printfile(int); | 
|  |  | 
|  | void | 
|  | main(int argc, char *argv[]) | 
|  | { | 
|  | int n; | 
|  | int f; | 
|  |  | 
|  | if((cons = Bopen("/dev/tty", OREAD)) == 0) { | 
|  | fprint(2, "p: can't open /dev/tty\n"); | 
|  | exits("missing /dev/tty"); | 
|  | } | 
|  | Binit(&bout, 1, OWRITE); | 
|  | n = 0; | 
|  | while(argc > 1) { | 
|  | --argc; argv++; | 
|  | if(*argv[0] == '-'){ | 
|  | pglen = atoi(&argv[0][1]); | 
|  | if(pglen <= 0) | 
|  | pglen = DEF; | 
|  | } else { | 
|  | n++; | 
|  | f = open(argv[0], OREAD); | 
|  | if(f < 0){ | 
|  | fprint(2, "p: can't open %s\n", argv[0]); | 
|  | continue; | 
|  | } | 
|  | printfile(f); | 
|  | close(f); | 
|  | } | 
|  | } | 
|  | if(n == 0) | 
|  | printfile(0); | 
|  | exits(0); | 
|  | } | 
|  |  | 
|  | void | 
|  | printfile(int f) | 
|  | { | 
|  | int i, j, n; | 
|  | char *s, *cmd; | 
|  | Biobuf *b; | 
|  |  | 
|  | b = malloc(sizeof(Biobuf)); | 
|  | Binit(b, f, OREAD); | 
|  | for(;;){ | 
|  | for(i=1; i <= pglen; i++) { | 
|  | s = Brdline(b, '\n'); | 
|  | if(s == 0){ | 
|  | n = Blinelen(b); | 
|  | if(n > 0)	/* line too long for Brdline */ | 
|  | for(j=0; j<n; j++) | 
|  | Bputc(&bout, Bgetc(b)); | 
|  | else{		/* true EOF */ | 
|  | free(b); | 
|  | return; | 
|  | } | 
|  | }else{ | 
|  | Bwrite(&bout, s, Blinelen(b)-1); | 
|  | if(i < pglen) | 
|  | Bwrite(&bout, "\n", 1); | 
|  | } | 
|  | } | 
|  | Bflush(&bout); | 
|  | getcmd: | 
|  | cmd = Brdline(cons, '\n'); | 
|  | if(cmd == 0 || *cmd == 'q') | 
|  | exits(0); | 
|  | cmd[Blinelen(cons)-1] = 0; | 
|  | if(*cmd == '!'){ | 
|  | if(fork() == 0){ | 
|  | dup(Bfildes(cons), 0); | 
|  | execl("/bin/rc", "rc", "-c", cmd+1, 0); | 
|  | } | 
|  | waitpid(); | 
|  | goto getcmd; | 
|  | } | 
|  | } | 
|  | } |