Blob


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