diff options
Diffstat (limited to 'src/cmd/page/filter.c')
-rw-r--r-- | src/cmd/page/filter.c | 107 |
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); +} |