ref: b24ed2bfac81798221977ffed8980d2b4eeab199
dir: /sys/src/cmd/p.c/
#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/cons", OREAD)) == 0) { fprint(2, "p: can't open /dev/cons\n"); exits("missing /dev/cons"); } Blethal(cons, nil); Binit(&bout, 1, OWRITE); Blethal(&bout, nil); 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 - %r\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); Blethal(b, nil); 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, nil); } waitpid(); goto getcmd; } } }