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