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