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; |
rsc | e17c64a | 2007-05-05 13:08:06 +0000 | [diff] [blame^] | 16 | char template[] = "/tmp/pagecvtXXXXXXXXX"; |
rsc | 24c0286 | 2005-01-04 21:23:50 +0000 | [diff] [blame] | 17 | |
| 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"); |
rsc | 05a4d85 | 2007-03-26 20:55:26 +0000 | [diff] [blame] | 28 | threadexits("Epipe"); |
rsc | 24c0286 | 2005-01-04 21:23:50 +0000 | [diff] [blame] | 29 | } |
| 30 | }else{ |
| 31 | p[0] = open("/dev/null", ORDWR); |
| 32 | p[1] = open("/dev/null", ORDWR); |
| 33 | } |
| 34 | |
rsc | e17c64a | 2007-05-05 13:08:06 +0000 | [diff] [blame^] | 35 | ofd = opentemp(template); |
rsc | 24c0286 | 2005-01-04 21:23:50 +0000 | [diff] [blame] | 36 | switch(fork()){ |
| 37 | case -1: |
| 38 | fprint(2, "fork fails: %r\n"); |
rsc | 05a4d85 | 2007-03-26 20:55:26 +0000 | [diff] [blame] | 39 | threadexits("Efork"); |
rsc | 24c0286 | 2005-01-04 21:23:50 +0000 | [diff] [blame] | 40 | default: |
rsc | 05a4d85 | 2007-03-26 20:55:26 +0000 | [diff] [blame] | 41 | close(p[0]); |
rsc | 24c0286 | 2005-01-04 21:23:50 +0000 | [diff] [blame] | 42 | if(docopy){ |
rsc | 05a4d85 | 2007-03-26 20:55:26 +0000 | [diff] [blame] | 43 | write(p[1], buf, nbuf); |
rsc | 24c0286 | 2005-01-04 21:23:50 +0000 | [diff] [blame] | 44 | if(b) |
| 45 | while((n = Bread(b, xbuf, sizeof xbuf)) > 0) |
rsc | 05a4d85 | 2007-03-26 20:55:26 +0000 | [diff] [blame] | 46 | write(p[1], xbuf, n); |
rsc | 24c0286 | 2005-01-04 21:23:50 +0000 | [diff] [blame] | 47 | else |
| 48 | while((n = read(stdinfd, xbuf, sizeof xbuf)) > 0) |
rsc | 05a4d85 | 2007-03-26 20:55:26 +0000 | [diff] [blame] | 49 | write(p[1], xbuf, n); |
rsc | 24c0286 | 2005-01-04 21:23:50 +0000 | [diff] [blame] | 50 | } |
rsc | 05a4d85 | 2007-03-26 20:55:26 +0000 | [diff] [blame] | 51 | close(p[1]); |
rsc | 24c0286 | 2005-01-04 21:23:50 +0000 | [diff] [blame] | 52 | waitpid(); |
| 53 | break; |
| 54 | case 0: |
rsc | 05a4d85 | 2007-03-26 20:55:26 +0000 | [diff] [blame] | 55 | close(p[1]); |
| 56 | dup(p[0], 0); |
rsc | 24c0286 | 2005-01-04 21:23:50 +0000 | [diff] [blame] | 57 | dup(ofd, 1); |
| 58 | /* stderr shines through */ |
rsc | 05a4d85 | 2007-03-26 20:55:26 +0000 | [diff] [blame] | 59 | if(chatty) |
| 60 | fprint(2, "Execing '%s'\n", cmd); |
| 61 | execlp("rc", "rc", "-c", cmd, nil); |
rsc | 24c0286 | 2005-01-04 21:23:50 +0000 | [diff] [blame] | 62 | 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 | |
| 74 | Document* |
| 75 | initdvi(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); |
rsc | 05a4d85 | 2007-03-26 20:55:26 +0000 | [diff] [blame] | 87 | sprint(fdbuf, "/dev/fd/%d", fd); |
rsc | 24c0286 | 2005-01-04 21:23:50 +0000 | [diff] [blame] | 88 | 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 | |
| 101 | Document* |
| 102 | inittroff(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf) |
| 103 | { |
rsc | e17c64a | 2007-05-05 13:08:06 +0000 | [diff] [blame^] | 104 | return initfilt(b, argc, argv, buf, nbuf, "troff", "9 tr2post | 9 psfonts", 1); |
rsc | 24c0286 | 2005-01-04 21:23:50 +0000 | [diff] [blame] | 105 | } |
| 106 | |
| 107 | Document* |
| 108 | initmsdoc(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf) |
| 109 | { |
| 110 | return initfilt(b, argc, argv, buf, nbuf, "microsoft office", "doc2ps", 1); |
| 111 | } |