Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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*
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*
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*
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*
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
}