xref: /plan9-contrib/sys/src/cmd/p.c (revision f19e7b749ec99577072cd8e44030fe810f42c7ad)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <bio.h>
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier #define	DEF	22	/* lines in chunk: 3*DEF == 66, #lines per nroff page */
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier Biobuf *cons;
83e12c5d1SDavid du Colombier Biobuf bout;
93e12c5d1SDavid du Colombier 
103e12c5d1SDavid du Colombier int pglen = DEF;
113e12c5d1SDavid du Colombier 
123e12c5d1SDavid du Colombier void printfile(int);
133e12c5d1SDavid du Colombier 
143e12c5d1SDavid du Colombier void
main(int argc,char * argv[])153e12c5d1SDavid du Colombier main(int argc, char *argv[])
163e12c5d1SDavid du Colombier {
173e12c5d1SDavid du Colombier 	int n;
183e12c5d1SDavid du Colombier 	int f;
193e12c5d1SDavid du Colombier 
203e12c5d1SDavid du Colombier 	if((cons = Bopen("/dev/cons", OREAD)) == 0) {
213e12c5d1SDavid du Colombier 		fprint(2, "p: can't open /dev/cons\n");
223e12c5d1SDavid du Colombier 		exits("missing /dev/cons");
233e12c5d1SDavid du Colombier 	}
243e12c5d1SDavid du Colombier 	Binit(&bout, 1, OWRITE);
253e12c5d1SDavid du Colombier 	n = 0;
263e12c5d1SDavid du Colombier 	while(argc > 1) {
273e12c5d1SDavid du Colombier 		--argc; argv++;
283e12c5d1SDavid du Colombier 		if(*argv[0] == '-'){
293e12c5d1SDavid du Colombier 			pglen = atoi(&argv[0][1]);
303e12c5d1SDavid du Colombier 			if(pglen <= 0)
313e12c5d1SDavid du Colombier 				pglen = DEF;
323e12c5d1SDavid du Colombier 		} else {
333e12c5d1SDavid du Colombier 			n++;
343e12c5d1SDavid du Colombier 			f = open(argv[0], OREAD);
353e12c5d1SDavid du Colombier 			if(f < 0){
3613c0d2ddSDavid du Colombier 				fprint(2, "p: can't open %s - %r\n", argv[0]);
373e12c5d1SDavid du Colombier 				continue;
383e12c5d1SDavid du Colombier 			}
393e12c5d1SDavid du Colombier 			printfile(f);
40a5ecd27eSDavid du Colombier 			close(f);
413e12c5d1SDavid du Colombier 		}
423e12c5d1SDavid du Colombier 	}
433e12c5d1SDavid du Colombier 	if(n == 0)
443e12c5d1SDavid du Colombier 		printfile(0);
457dd7cddfSDavid du Colombier 	exits(0);
463e12c5d1SDavid du Colombier }
473e12c5d1SDavid du Colombier 
483e12c5d1SDavid du Colombier void
printfile(int f)493e12c5d1SDavid du Colombier printfile(int f)
503e12c5d1SDavid du Colombier {
513e12c5d1SDavid du Colombier 	int i, j, n;
523e12c5d1SDavid du Colombier 	char *s, *cmd;
533e12c5d1SDavid du Colombier 	Biobuf *b;
543e12c5d1SDavid du Colombier 
553e12c5d1SDavid du Colombier 	b = malloc(sizeof(Biobuf));
563e12c5d1SDavid du Colombier 	Binit(b, f, OREAD);
573e12c5d1SDavid du Colombier 	for(;;){
583e12c5d1SDavid du Colombier 		for(i=1; i <= pglen; i++) {
593e12c5d1SDavid du Colombier 			s = Brdline(b, '\n');
603e12c5d1SDavid du Colombier 			if(s == 0){
617dd7cddfSDavid du Colombier 				n = Blinelen(b);
623e12c5d1SDavid du Colombier 				if(n > 0)	/* line too long for Brdline */
633e12c5d1SDavid du Colombier 					for(j=0; j<n; j++)
643e12c5d1SDavid du Colombier 						Bputc(&bout, Bgetc(b));
65a5ecd27eSDavid du Colombier 				else{		/* true EOF */
66a5ecd27eSDavid du Colombier 					free(b);
673e12c5d1SDavid du Colombier 					return;
68a5ecd27eSDavid du Colombier 				}
693e12c5d1SDavid du Colombier 			}else{
703e12c5d1SDavid du Colombier 				Bwrite(&bout, s, Blinelen(b)-1);
713e12c5d1SDavid du Colombier 				if(i < pglen)
723e12c5d1SDavid du Colombier 					Bwrite(&bout, "\n", 1);
733e12c5d1SDavid du Colombier 			}
743e12c5d1SDavid du Colombier 		}
753e12c5d1SDavid du Colombier 		Bflush(&bout);
763e12c5d1SDavid du Colombier 	    getcmd:
773e12c5d1SDavid du Colombier 		cmd = Brdline(cons, '\n');
783e12c5d1SDavid du Colombier 		if(cmd == 0 || *cmd == 'q')
793e12c5d1SDavid du Colombier 			exits(0);
803e12c5d1SDavid du Colombier 		cmd[Blinelen(cons)-1] = 0;
813e12c5d1SDavid du Colombier 		if(*cmd == '!'){
823e12c5d1SDavid du Colombier 			if(fork() == 0){
833e12c5d1SDavid du Colombier 				dup(Bfildes(cons), 0);
84*f19e7b74SDavid du Colombier 				execl("/bin/rc", "rc", "-c", cmd+1, nil);
853e12c5d1SDavid du Colombier 			}
869a747e4fSDavid du Colombier 			waitpid();
873e12c5d1SDavid du Colombier 			goto getcmd;
883e12c5d1SDavid du Colombier 		}
893e12c5d1SDavid du Colombier 	}
903e12c5d1SDavid du Colombier }
91