Blame


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"
7 24c02865 2005-01-04 devnull
8 24c02865 2005-01-04 devnull Document*
9 24c02865 2005-01-04 devnull initfilt(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf, char *type, char *cmd, int docopy)
10 24c02865 2005-01-04 devnull {
11 24c02865 2005-01-04 devnull int ofd;
12 24c02865 2005-01-04 devnull int p[2];
13 24c02865 2005-01-04 devnull char xbuf[8192];
14 24c02865 2005-01-04 devnull int n;
15 24c02865 2005-01-04 devnull
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;
19 24c02865 2005-01-04 devnull }
20 24c02865 2005-01-04 devnull
21 24c02865 2005-01-04 devnull fprint(2, "converting from %s to postscript...\n", type);
22 24c02865 2005-01-04 devnull
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");
27 24c02865 2005-01-04 devnull }
28 24c02865 2005-01-04 devnull }else{
29 24c02865 2005-01-04 devnull p[0] = open("/dev/null", ORDWR);
30 24c02865 2005-01-04 devnull p[1] = open("/dev/null", ORDWR);
31 24c02865 2005-01-04 devnull }
32 24c02865 2005-01-04 devnull
33 24c02865 2005-01-04 devnull ofd = opentemp("/tmp/pagecvtXXXXXXXXX");
34 24c02865 2005-01-04 devnull switch(fork()){
35 24c02865 2005-01-04 devnull case -1:
36 24c02865 2005-01-04 devnull fprint(2, "fork fails: %r\n");
37 24c02865 2005-01-04 devnull exits("Efork");
38 24c02865 2005-01-04 devnull default:
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);
42 24c02865 2005-01-04 devnull if(b)
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);
45 24c02865 2005-01-04 devnull else
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);
48 24c02865 2005-01-04 devnull }
49 24c02865 2005-01-04 devnull close(p[0]);
50 24c02865 2005-01-04 devnull waitpid();
51 24c02865 2005-01-04 devnull break;
52 24c02865 2005-01-04 devnull case 0:
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);
58 24c02865 2005-01-04 devnull break;
59 24c02865 2005-01-04 devnull }
60 24c02865 2005-01-04 devnull
61 24c02865 2005-01-04 devnull if(b)
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);
66 24c02865 2005-01-04 devnull
67 24c02865 2005-01-04 devnull return initps(b, argc, argv, nil, 0);
68 24c02865 2005-01-04 devnull }
69 24c02865 2005-01-04 devnull
70 24c02865 2005-01-04 devnull Document*
71 24c02865 2005-01-04 devnull initdvi(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf)
72 24c02865 2005-01-04 devnull {
73 24c02865 2005-01-04 devnull int fd;
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];
77 24c02865 2005-01-04 devnull
78 24c02865 2005-01-04 devnull /*
79 24c02865 2005-01-04 devnull * Stupid DVIPS won't take standard input.
80 24c02865 2005-01-04 devnull */
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");
88 24c02865 2005-01-04 devnull }
89 24c02865 2005-01-04 devnull argv = &name;
90 24c02865 2005-01-04 devnull argc = 1;
91 24c02865 2005-01-04 devnull }
92 24c02865 2005-01-04 devnull
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);
95 24c02865 2005-01-04 devnull }
96 24c02865 2005-01-04 devnull
97 24c02865 2005-01-04 devnull Document*
98 24c02865 2005-01-04 devnull inittroff(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf)
99 24c02865 2005-01-04 devnull {
100 24c02865 2005-01-04 devnull return initfilt(b, argc, argv, buf, nbuf, "troff", "lp -dstdout", 1);
101 24c02865 2005-01-04 devnull }
102 24c02865 2005-01-04 devnull
103 24c02865 2005-01-04 devnull Document*
104 24c02865 2005-01-04 devnull initmsdoc(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf)
105 24c02865 2005-01-04 devnull {
106 24c02865 2005-01-04 devnull return initfilt(b, argc, argv, buf, nbuf, "microsoft office", "doc2ps", 1);
107 24c02865 2005-01-04 devnull }