Blob


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