plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }