Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <cursor.h>
5 #include <event.h>
6 #include <bio.h>
7 #include "page.h"
9 Document*
10 initfilt(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf, char *type, char *cmd, int docopy)
11 {
12 int ofd;
13 int p[2];
14 char xbuf[8192];
15 int n;
17 if(argc > 1) {
18 fprint(2, "can only view one %s file at a time\n", type);
19 return nil;
20 }
22 fprint(2, "converting from %s to postscript...\n", type);
24 if(docopy){
25 if(pipe(p) < 0){
26 fprint(2, "pipe fails: %r\n");
27 exits("Epipe");
28 }
29 }else{
30 p[0] = open("/dev/null", ORDWR);
31 p[1] = open("/dev/null", ORDWR);
32 }
34 ofd = opentemp("/tmp/pagecvtXXXXXXXXX");
35 switch(fork()){
36 case -1:
37 fprint(2, "fork fails: %r\n");
38 exits("Efork");
39 default:
40 close(p[1]);
41 if(docopy){
42 write(p[0], buf, nbuf);
43 if(b)
44 while((n = Bread(b, xbuf, sizeof xbuf)) > 0)
45 write(p[0], xbuf, n);
46 else
47 while((n = read(stdinfd, xbuf, sizeof xbuf)) > 0)
48 write(p[0], xbuf, n);
49 }
50 close(p[0]);
51 waitpid();
52 break;
53 case 0:
54 close(p[0]);
55 dup(p[1], 0);
56 dup(ofd, 1);
57 /* stderr shines through */
58 execl("/bin/rc", "rc", "-c", cmd, nil);
59 break;
60 }
62 if(b)
63 Bterm(b);
64 seek(ofd, 0, 0);
65 b = emalloc(sizeof(Biobuf));
66 Binit(b, ofd, OREAD);
68 return initps(b, argc, argv, nil, 0);
69 }
71 Document*
72 initdvi(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf)
73 {
74 int fd;
75 char *name;
76 char cmd[256];
77 char fdbuf[20];
79 /*
80 * Stupid DVIPS won't take standard input.
81 */
82 if(b == nil){ /* standard input; spool to disk (ouch) */
83 fd = spooltodisk(buf, nbuf, &name);
84 sprint(fdbuf, "/fd/%d", fd);
85 b = Bopen(fdbuf, OREAD);
86 if(b == nil){
87 fprint(2, "cannot open disk spool file\n");
88 wexits("Bopen temp");
89 }
90 argv = &name;
91 argc = 1;
92 }
94 snprint(cmd, sizeof cmd, "dvips -Pps -r0 -q1 -f1 '%s'", argv[0]);
95 return initfilt(b, argc, argv, buf, nbuf, "dvi", cmd, 0);
96 }
98 Document*
99 inittroff(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf)
101 return initfilt(b, argc, argv, buf, nbuf, "troff", "lp -dstdout", 1);
104 Document*
105 initmsdoc(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf)
107 return initfilt(b, argc, argv, buf, nbuf, "microsoft office", "doc2ps", 1);