aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/htmlroff/t19.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/htmlroff/t19.c')
-rw-r--r--src/cmd/htmlroff/t19.c142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/cmd/htmlroff/t19.c b/src/cmd/htmlroff/t19.c
new file mode 100644
index 00000000..a4cc18f4
--- /dev/null
+++ b/src/cmd/htmlroff/t19.c
@@ -0,0 +1,142 @@
+#include "a.h"
+
+/*
+ * 19. Input/output file switching.
+ */
+
+/* .so - push new source file */
+void
+r_so(int argc, Rune **argv)
+{
+ USED(argc);
+ pushinputfile(erunesmprint("%s", unsharp(esmprint("%S", argv[1]))));
+}
+
+/* .nx - end this file, switch to arg */
+void
+r_nx(int argc, Rune **argv)
+{
+ int n;
+
+ if(argc == 1){
+ while(popinput())
+ ;
+ }else{
+ if(argc > 2)
+ warn("too many arguments for .nx");
+ while((n=popinput()) && n != 2)
+ ;
+ pushinputfile(argv[1]);
+ }
+}
+
+/* .sy - system: run string */
+void
+r_sy(Rune *name)
+{
+ USED(name);
+ warn(".sy not implemented");
+}
+
+/* .pi - pipe output to string */
+void
+r_pi(Rune *name)
+{
+ USED(name);
+ warn(".pi not implemented");
+}
+
+/* .cf - copy contents of filename to output */
+void
+r_cf(int argc, Rune **argv)
+{
+ int c;
+ char *p;
+ Biobuf *b;
+
+ USED(argc);
+ p = esmprint("%S", argv[1]);
+ if((b = Bopen(p, OREAD)) == nil){
+ fprint(2, "%L: open %s: %r\n", p);
+ free(p);
+ return;
+ }
+ free(p);
+
+ while((c = Bgetrune(b)) >= 0)
+ outrune(c);
+ Bterm(b);
+}
+
+void
+r_inputpipe(Rune *name)
+{
+ Rune *cmd, *stop, *line;
+ int n, pid, p[2], len;
+ Waitmsg *w;
+
+ USED(name);
+ if(pipe(p) < 0){
+ warn("pipe: %r");
+ return;
+ }
+ stop = copyarg();
+ cmd = readline(CopyMode);
+ pid = fork();
+ switch(pid){
+ case 0:
+ if(p[0] != 0){
+ dup(p[0], 0);
+ close(p[0]);
+ }
+ close(p[1]);
+ execl(unsharp("#9/bin/rc"), "rc", "-c", esmprint("%S", cmd), nil);
+ warn("%Cdp %S: %r", dot, cmd);
+ _exits(nil);
+ case -1:
+ warn("fork: %r");
+ default:
+ close(p[0]);
+ len = runestrlen(stop);
+ fprint(p[1], ".ps %d\n", getnr(L(".s")));
+ fprint(p[1], ".vs %du\n", getnr(L(".v")));
+ fprint(p[1], ".ft %d\n", getnr(L(".f")));
+ fprint(p[1], ".ll 8i\n");
+ fprint(p[1], ".pl 30i\n");
+ while((line = readline(~0)) != nil){
+ if(runestrncmp(line, stop, len) == 0
+ && (line[len]==' ' || line[len]==0 || line[len]=='\t'
+ || (line[len]=='\\' && line[len+1]=='}')))
+ break;
+ n = runestrlen(line);
+ line[n] = '\n';
+ fprint(p[1], "%.*S", n+1, line);
+ free(line);
+ }
+ free(stop);
+ close(p[1]);
+ w = wait();
+ if(w == nil){
+ warn("wait: %r");
+ return;
+ }
+ if(w->msg[0])
+ sysfatal("%C%S %S: %s", dot, name, cmd, w->msg);
+ free(cmd);
+ free(w);
+ }
+}
+
+void
+t19init(void)
+{
+ addreq(L("so"), r_so, 1);
+ addreq(L("nx"), r_nx, -1);
+ addraw(L("sy"), r_sy);
+ addraw(L("inputpipe"), r_inputpipe);
+ addraw(L("pi"), r_pi);
+ addreq(L("cf"), r_cf, 1);
+
+ nr(L("$$"), getpid());
+}
+