xref: /plan9/sys/src/cmd/htmlroff/t18.c (revision 426d2b71458df9b491ba6c167f699b3f1f7b0428)
1*426d2b71SDavid du Colombier #include "a.h"
2*426d2b71SDavid du Colombier 
3*426d2b71SDavid du Colombier /*
4*426d2b71SDavid du Colombier  * 18. Insertions from the standard input
5*426d2b71SDavid du Colombier  */
6*426d2b71SDavid du Colombier void
r_rd(int argc,Rune ** argv)7*426d2b71SDavid du Colombier r_rd(int argc, Rune **argv)
8*426d2b71SDavid du Colombier {
9*426d2b71SDavid du Colombier 	char buf[100];
10*426d2b71SDavid du Colombier 	char *s;
11*426d2b71SDavid du Colombier 	Rune *p;
12*426d2b71SDavid du Colombier 	Fmt fmt;
13*426d2b71SDavid du Colombier 	static int didstdin;
14*426d2b71SDavid du Colombier 	static Biobuf bstdin;
15*426d2b71SDavid du Colombier 
16*426d2b71SDavid du Colombier 	/*
17*426d2b71SDavid du Colombier 	 * print prompt, then read until double newline,
18*426d2b71SDavid du Colombier 	 * then run the text just read as though it were
19*426d2b71SDavid du Colombier 	 * a macro body, using the remaining arguments.
20*426d2b71SDavid du Colombier 	 */
21*426d2b71SDavid du Colombier 	if(fd2path(0, buf, sizeof buf) >= 0 && strstr(buf, "/dev/cons")){
22*426d2b71SDavid du Colombier 		if(argc > 1)
23*426d2b71SDavid du Colombier 			fprint(2, "%S", argv[1]);
24*426d2b71SDavid du Colombier 		else
25*426d2b71SDavid du Colombier 			fprint(2, "%c", 7/*BEL*/);
26*426d2b71SDavid du Colombier 	}
27*426d2b71SDavid du Colombier 
28*426d2b71SDavid du Colombier 	if(!didstdin){
29*426d2b71SDavid du Colombier 		Binit(&bstdin, 0, OREAD);
30*426d2b71SDavid du Colombier 		didstdin = 1;
31*426d2b71SDavid du Colombier 	}
32*426d2b71SDavid du Colombier 	runefmtstrinit(&fmt);
33*426d2b71SDavid du Colombier 	while((s = Brdstr(&bstdin, '\n', 0)) != nil){
34*426d2b71SDavid du Colombier 		if(s[0] == '\n'){
35*426d2b71SDavid du Colombier 			free(s);
36*426d2b71SDavid du Colombier 			break;
37*426d2b71SDavid du Colombier 		}
38*426d2b71SDavid du Colombier 		fmtprint(&fmt, "%s", s);
39*426d2b71SDavid du Colombier 		free(s);
40*426d2b71SDavid du Colombier 	}
41*426d2b71SDavid du Colombier 	p = runefmtstrflush(&fmt);
42*426d2b71SDavid du Colombier 	if(p == nil)
43*426d2b71SDavid du Colombier 		warn("out of memory in %Crd", dot);
44*426d2b71SDavid du Colombier 	ds(L(".rd"), p);
45*426d2b71SDavid du Colombier 	argc--;
46*426d2b71SDavid du Colombier 	argv++;
47*426d2b71SDavid du Colombier 	argv[0] = L(".rd");
48*426d2b71SDavid du Colombier 	runmacro('.', argc, argv);
49*426d2b71SDavid du Colombier 	ds(L(".rd"), nil);
50*426d2b71SDavid du Colombier }
51*426d2b71SDavid du Colombier 
52*426d2b71SDavid du Colombier /* terminate exactly as if input had ended */
53*426d2b71SDavid du Colombier void
r_ex(int argc,Rune ** argv)54*426d2b71SDavid du Colombier r_ex(int argc, Rune **argv)
55*426d2b71SDavid du Colombier {
56*426d2b71SDavid du Colombier 	USED(argc);
57*426d2b71SDavid du Colombier 	USED(argv);
58*426d2b71SDavid du Colombier 
59*426d2b71SDavid du Colombier 	while(popinput())
60*426d2b71SDavid du Colombier 		;
61*426d2b71SDavid du Colombier }
62*426d2b71SDavid du Colombier 
63*426d2b71SDavid du Colombier void
t18init(void)64*426d2b71SDavid du Colombier t18init(void)
65*426d2b71SDavid du Colombier {
66*426d2b71SDavid du Colombier 	addreq(L("rd"), r_rd, -1);
67*426d2b71SDavid du Colombier 	addreq(L("ex"), r_ex, 0);
68*426d2b71SDavid du Colombier }
69