plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

filter.c (2303B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <draw.h>
      4 #include <thread.h>
      5 #include <bio.h>
      6 #include <cursor.h>
      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 	char template[] = "/tmp/pagecvtXXXXXXXXX";
     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");
     28 			threadexits("Epipe");
     29 		}
     30 	}else{
     31 		p[0] = open("/dev/null", ORDWR);
     32 		p[1] = open("/dev/null", ORDWR);
     33 	}
     34 
     35 	ofd = opentemp(template, ORDWR|ORCLOSE);
     36 	switch(fork()){
     37 	case -1:
     38 		fprint(2, "fork fails: %r\n");
     39 		threadexits("Efork");
     40 	default:
     41 		close(p[0]);
     42 		if(docopy){
     43 			write(p[1], buf, nbuf);
     44 			if(b)
     45 				while((n = Bread(b, xbuf, sizeof xbuf)) > 0)
     46 					write(p[1], xbuf, n);
     47 			else
     48 				while((n = read(stdinfd, xbuf, sizeof xbuf)) > 0)
     49 					write(p[1], xbuf, n);
     50 		}
     51 		close(p[1]);
     52 		waitpid();
     53 		break;
     54 	case 0:
     55 		close(p[1]);
     56 		dup(p[0], 0);
     57 		dup(ofd, 1);
     58 		/* stderr shines through */
     59 		if(chatty)
     60 			fprint(2, "Execing '%s'\n", cmd);
     61 		execlp("rc", "rc", "-c", cmd, nil);
     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);
     87 		sprint(fdbuf, "/dev/fd/%d", fd);
     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 {
    104 	return initfilt(b, argc, argv, buf, nbuf, "troff", "9 tr2post | 9 psfonts", 1);
    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 }