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