blob: 2e0482fcdee6eb6f65949493f180824d536f2a07 [file] [log] [blame]
rsc24c02862005-01-04 21:23:50 +00001#include <u.h>
2#include <libc.h>
3#include <draw.h>
rsc05a4d852007-03-26 20:55:26 +00004#include <thread.h>
rsc24c02862005-01-04 21:23:50 +00005#include <bio.h>
rsc05a4d852007-03-26 20:55:26 +00006#include <cursor.h>
rsc24c02862005-01-04 21:23:50 +00007#include "page.h"
8
9Document*
10initfilt(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;
rsce17c64a2007-05-05 13:08:06 +000016 char template[] = "/tmp/pagecvtXXXXXXXXX";
rsc24c02862005-01-04 21:23:50 +000017
18 if(argc > 1) {
19 fprint(2, "can only view one %s file at a time\n", type);
20 return nil;
21 }
22
23 fprint(2, "converting from %s to postscript...\n", type);
24
25 if(docopy){
26 if(pipe(p) < 0){
27 fprint(2, "pipe fails: %r\n");
rsc05a4d852007-03-26 20:55:26 +000028 threadexits("Epipe");
rsc24c02862005-01-04 21:23:50 +000029 }
30 }else{
31 p[0] = open("/dev/null", ORDWR);
32 p[1] = open("/dev/null", ORDWR);
33 }
34
rsce17c64a2007-05-05 13:08:06 +000035 ofd = opentemp(template);
rsc24c02862005-01-04 21:23:50 +000036 switch(fork()){
37 case -1:
38 fprint(2, "fork fails: %r\n");
rsc05a4d852007-03-26 20:55:26 +000039 threadexits("Efork");
rsc24c02862005-01-04 21:23:50 +000040 default:
rsc05a4d852007-03-26 20:55:26 +000041 close(p[0]);
rsc24c02862005-01-04 21:23:50 +000042 if(docopy){
rsc05a4d852007-03-26 20:55:26 +000043 write(p[1], buf, nbuf);
rsc24c02862005-01-04 21:23:50 +000044 if(b)
45 while((n = Bread(b, xbuf, sizeof xbuf)) > 0)
rsc05a4d852007-03-26 20:55:26 +000046 write(p[1], xbuf, n);
rsc24c02862005-01-04 21:23:50 +000047 else
48 while((n = read(stdinfd, xbuf, sizeof xbuf)) > 0)
rsc05a4d852007-03-26 20:55:26 +000049 write(p[1], xbuf, n);
rsc24c02862005-01-04 21:23:50 +000050 }
rsc05a4d852007-03-26 20:55:26 +000051 close(p[1]);
rsc24c02862005-01-04 21:23:50 +000052 waitpid();
53 break;
54 case 0:
rsc05a4d852007-03-26 20:55:26 +000055 close(p[1]);
56 dup(p[0], 0);
rsc24c02862005-01-04 21:23:50 +000057 dup(ofd, 1);
58 /* stderr shines through */
rsc05a4d852007-03-26 20:55:26 +000059 if(chatty)
60 fprint(2, "Execing '%s'\n", cmd);
61 execlp("rc", "rc", "-c", cmd, nil);
rsc24c02862005-01-04 21:23:50 +000062 break;
63 }
64
65 if(b)
66 Bterm(b);
67 seek(ofd, 0, 0);
68 b = emalloc(sizeof(Biobuf));
69 Binit(b, ofd, OREAD);
70
71 return initps(b, argc, argv, nil, 0);
72}
73
74Document*
75initdvi(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];
81
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);
rsc05a4d852007-03-26 20:55:26 +000087 sprint(fdbuf, "/dev/fd/%d", fd);
rsc24c02862005-01-04 21:23:50 +000088 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 }
96
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}
100
101Document*
102inittroff(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf)
103{
rsce17c64a2007-05-05 13:08:06 +0000104 return initfilt(b, argc, argv, buf, nbuf, "troff", "9 tr2post | 9 psfonts", 1);
rsc24c02862005-01-04 21:23:50 +0000105}
106
107Document*
108initmsdoc(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf)
109{
110 return initfilt(b, argc, argv, buf, nbuf, "microsoft office", "doc2ps", 1);
111}