aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/htmlroff/t18.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/htmlroff/t18.c')
-rw-r--r--src/cmd/htmlroff/t18.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/cmd/htmlroff/t18.c b/src/cmd/htmlroff/t18.c
new file mode 100644
index 00000000..f5c74a1f
--- /dev/null
+++ b/src/cmd/htmlroff/t18.c
@@ -0,0 +1,67 @@
+#include "a.h"
+
+/*
+ * 18. Insertions from the standard input
+ */
+void
+r_rd(int argc, Rune **argv)
+{
+ 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(isatty(0)){
+ 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);
+}