#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; | |
} | |
} | |
} |