aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/page/filter.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/page/filter.c')
-rw-r--r--src/cmd/page/filter.c107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/cmd/page/filter.c b/src/cmd/page/filter.c
new file mode 100644
index 00000000..07c3df2b
--- /dev/null
+++ b/src/cmd/page/filter.c
@@ -0,0 +1,107 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include <event.h>
+#include <bio.h>
+#include "page.h"
+
+Document*
+initfilt(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf, char *type, char *cmd, int docopy)
+{
+ int ofd;
+ int p[2];
+ char xbuf[8192];
+ int n;
+
+ if(argc > 1) {
+ fprint(2, "can only view one %s file at a time\n", type);
+ return nil;
+ }
+
+ fprint(2, "converting from %s to postscript...\n", type);
+
+ if(docopy){
+ if(pipe(p) < 0){
+ fprint(2, "pipe fails: %r\n");
+ exits("Epipe");
+ }
+ }else{
+ p[0] = open("/dev/null", ORDWR);
+ p[1] = open("/dev/null", ORDWR);
+ }
+
+ ofd = opentemp("/tmp/pagecvtXXXXXXXXX");
+ switch(fork()){
+ case -1:
+ fprint(2, "fork fails: %r\n");
+ exits("Efork");
+ default:
+ close(p[1]);
+ if(docopy){
+ write(p[0], buf, nbuf);
+ if(b)
+ while((n = Bread(b, xbuf, sizeof xbuf)) > 0)
+ write(p[0], xbuf, n);
+ else
+ while((n = read(stdinfd, xbuf, sizeof xbuf)) > 0)
+ write(p[0], xbuf, n);
+ }
+ close(p[0]);
+ waitpid();
+ break;
+ case 0:
+ close(p[0]);
+ dup(p[1], 0);
+ dup(ofd, 1);
+ /* stderr shines through */
+ execl("/bin/rc", "rc", "-c", cmd, nil);
+ break;
+ }
+
+ if(b)
+ Bterm(b);
+ seek(ofd, 0, 0);
+ b = emalloc(sizeof(Biobuf));
+ Binit(b, ofd, OREAD);
+
+ return initps(b, argc, argv, nil, 0);
+}
+
+Document*
+initdvi(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf)
+{
+ int fd;
+ char *name;
+ char cmd[256];
+ char fdbuf[20];
+
+ /*
+ * Stupid DVIPS won't take standard input.
+ */
+ if(b == nil){ /* standard input; spool to disk (ouch) */
+ fd = spooltodisk(buf, nbuf, &name);
+ sprint(fdbuf, "/fd/%d", fd);
+ b = Bopen(fdbuf, OREAD);
+ if(b == nil){
+ fprint(2, "cannot open disk spool file\n");
+ wexits("Bopen temp");
+ }
+ argv = &name;
+ argc = 1;
+ }
+
+ snprint(cmd, sizeof cmd, "dvips -Pps -r0 -q1 -f1 '%s'", argv[0]);
+ return initfilt(b, argc, argv, buf, nbuf, "dvi", cmd, 0);
+}
+
+Document*
+inittroff(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf)
+{
+ return initfilt(b, argc, argv, buf, nbuf, "troff", "lp -dstdout", 1);
+}
+
+Document*
+initmsdoc(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf)
+{
+ return initfilt(b, argc, argv, buf, nbuf, "microsoft office", "doc2ps", 1);
+}