ref: c3a430e6824a8f1f08f28a8df24b4b64266b06f9
dir: /sys/src/cmd/htmlroff/t18.c/
#include "a.h" /* * 18. Insertions from the standard input */ void r_rd(int argc, Rune **argv) { char buf[100]; char *s; Rune *p; Fmt fmt; static int didstdin; static Biobuf bstdin; /* * print prompt, then read until double newline, * then run the text just read as though it were * a macro body, using the remaining arguments. */ if(fd2path(0, buf, sizeof buf) >= 0 && strstr(buf, "/dev/cons")){ if(argc > 1) fprint(2, "%S", argv[1]); else fprint(2, "%c", 7/*BEL*/); } if(!didstdin){ Binit(&bstdin, 0, OREAD); didstdin = 1; } runefmtstrinit(&fmt); while((s = Brdstr(&bstdin, '\n', 0)) != nil){ if(s[0] == '\n'){ free(s); break; } fmtprint(&fmt, "%s", s); free(s); } p = runefmtstrflush(&fmt); if(p == nil) warn("out of memory in %Crd", dot); ds(L(".rd"), p); argc--; argv++; argv[0] = L(".rd"); runmacro('.', argc, argv); ds(L(".rd"), nil); } /* terminate exactly as if input had ended */ void r_ex(int argc, Rune **argv) { USED(argc); USED(argv); while(popinput()) ; } void t18init(void) { addreq(L("rd"), r_rd, -1); addreq(L("ex"), r_ex, 0); }