Blame


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