filter.c 2.0 KB

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