#include #include #include #include #include #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) { /* Added -H to eliminate header page [sape] */ return initfilt(b, argc, argv, buf, nbuf, "troff", "lp -H -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); }