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