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