1 24c02865 2005-01-04 devnull #include <u.h>
2 24c02865 2005-01-04 devnull #include <libc.h>
3 24c02865 2005-01-04 devnull #include <draw.h>
4 24c02865 2005-01-04 devnull #include <event.h>
5 24c02865 2005-01-04 devnull #include <bio.h>
6 24c02865 2005-01-04 devnull #include "page.h"
9 24c02865 2005-01-04 devnull initfilt(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf, char *type, char *cmd, int docopy)
12 24c02865 2005-01-04 devnull int p[2];
13 24c02865 2005-01-04 devnull char xbuf[8192];
16 24c02865 2005-01-04 devnull if(argc > 1) {
17 24c02865 2005-01-04 devnull fprint(2, "can only view one %s file at a time\n", type);
18 24c02865 2005-01-04 devnull return nil;
21 24c02865 2005-01-04 devnull fprint(2, "converting from %s to postscript...\n", type);
23 24c02865 2005-01-04 devnull if(docopy){
24 24c02865 2005-01-04 devnull if(pipe(p) < 0){
25 24c02865 2005-01-04 devnull fprint(2, "pipe fails: %r\n");
26 24c02865 2005-01-04 devnull exits("Epipe");
29 24c02865 2005-01-04 devnull p[0] = open("/dev/null", ORDWR);
30 24c02865 2005-01-04 devnull p[1] = open("/dev/null", ORDWR);
33 24c02865 2005-01-04 devnull ofd = opentemp("/tmp/pagecvtXXXXXXXXX");
34 24c02865 2005-01-04 devnull switch(fork()){
36 24c02865 2005-01-04 devnull fprint(2, "fork fails: %r\n");
37 24c02865 2005-01-04 devnull exits("Efork");
39 24c02865 2005-01-04 devnull close(p[1]);
40 24c02865 2005-01-04 devnull if(docopy){
41 24c02865 2005-01-04 devnull write(p[0], buf, nbuf);
43 24c02865 2005-01-04 devnull while((n = Bread(b, xbuf, sizeof xbuf)) > 0)
44 24c02865 2005-01-04 devnull write(p[0], xbuf, n);
46 24c02865 2005-01-04 devnull while((n = read(stdinfd, xbuf, sizeof xbuf)) > 0)
47 24c02865 2005-01-04 devnull write(p[0], xbuf, n);
49 24c02865 2005-01-04 devnull close(p[0]);
50 24c02865 2005-01-04 devnull waitpid();
53 24c02865 2005-01-04 devnull close(p[0]);
54 24c02865 2005-01-04 devnull dup(p[1], 0);
55 24c02865 2005-01-04 devnull dup(ofd, 1);
56 24c02865 2005-01-04 devnull /* stderr shines through */
57 24c02865 2005-01-04 devnull execl("/bin/rc", "rc", "-c", cmd, nil);
62 24c02865 2005-01-04 devnull Bterm(b);
63 24c02865 2005-01-04 devnull seek(ofd, 0, 0);
64 24c02865 2005-01-04 devnull b = emalloc(sizeof(Biobuf));
65 24c02865 2005-01-04 devnull Binit(b, ofd, OREAD);
67 24c02865 2005-01-04 devnull return initps(b, argc, argv, nil, 0);
70 24c02865 2005-01-04 devnull Document*
71 24c02865 2005-01-04 devnull initdvi(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf)
74 24c02865 2005-01-04 devnull char *name;
75 24c02865 2005-01-04 devnull char cmd[256];
76 24c02865 2005-01-04 devnull char fdbuf[20];
79 24c02865 2005-01-04 devnull * Stupid DVIPS won't take standard input.
81 24c02865 2005-01-04 devnull if(b == nil){ /* standard input; spool to disk (ouch) */
82 24c02865 2005-01-04 devnull fd = spooltodisk(buf, nbuf, &name);
83 24c02865 2005-01-04 devnull sprint(fdbuf, "/fd/%d", fd);
84 24c02865 2005-01-04 devnull b = Bopen(fdbuf, OREAD);
85 24c02865 2005-01-04 devnull if(b == nil){
86 24c02865 2005-01-04 devnull fprint(2, "cannot open disk spool file\n");
87 24c02865 2005-01-04 devnull wexits("Bopen temp");
89 24c02865 2005-01-04 devnull argv = &name;
90 24c02865 2005-01-04 devnull argc = 1;
93 24c02865 2005-01-04 devnull snprint(cmd, sizeof cmd, "dvips -Pps -r0 -q1 -f1 '%s'", argv[0]);
94 24c02865 2005-01-04 devnull return initfilt(b, argc, argv, buf, nbuf, "dvi", cmd, 0);
97 24c02865 2005-01-04 devnull Document*
98 24c02865 2005-01-04 devnull inittroff(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf)
100 24c02865 2005-01-04 devnull return initfilt(b, argc, argv, buf, nbuf, "troff", "lp -dstdout", 1);
103 24c02865 2005-01-04 devnull Document*
104 24c02865 2005-01-04 devnull initmsdoc(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf)
106 24c02865 2005-01-04 devnull return initfilt(b, argc, argv, buf, nbuf, "microsoft office", "doc2ps", 1);