1 24c02865 2005-01-04 devnull #include <u.h>
2 24c02865 2005-01-04 devnull #include <libc.h>
3 24c02865 2005-01-04 devnull #include <draw.h>
4 24c02865 2005-01-04 devnull #include <event.h>
5 24c02865 2005-01-04 devnull #include <bio.h>
6 24c02865 2005-01-04 devnull #include "page.h"
8 24c02865 2005-01-04 devnull int resizing;
9 24c02865 2005-01-04 devnull int mknewwindow;
10 24c02865 2005-01-04 devnull int doabort;
11 24c02865 2005-01-04 devnull int chatty;
12 24c02865 2005-01-04 devnull int reverse = -1;
13 24c02865 2005-01-04 devnull int goodps = 1;
14 24c02865 2005-01-04 devnull int ppi = 100;
15 24c02865 2005-01-04 devnull int teegs = 0;
16 24c02865 2005-01-04 devnull int truetoboundingbox;
17 24c02865 2005-01-04 devnull int textbits=4, gfxbits=4;
18 24c02865 2005-01-04 devnull int wctlfd = -1;
19 24c02865 2005-01-04 devnull int stdinfd;
20 24c02865 2005-01-04 devnull int truecolor;
21 24c02865 2005-01-04 devnull int imagemode;
22 24c02865 2005-01-04 devnull int notewatcher;
23 24c02865 2005-01-04 devnull int notegp;
26 24c02865 2005-01-04 devnull watcher(void *v, char *x)
30 24c02865 2005-01-04 devnull if(strcmp(x, "die") != 0)
31 24c02865 2005-01-04 devnull postnote(PNGROUP, notegp, x);
32 24c02865 2005-01-04 devnull _exits(0);
33 24c02865 2005-01-04 devnull return 0;
37 24c02865 2005-01-04 devnull bell(void *u, char *x)
39 24c02865 2005-01-04 devnull if(x && strcmp(x, "hangup") == 0)
40 24c02865 2005-01-04 devnull _exits(0);
42 24c02865 2005-01-04 devnull if(x && strstr(x, "die") == nil)
43 24c02865 2005-01-04 devnull fprint(2, "postnote %d: %s\n", getpid(), x);
45 24c02865 2005-01-04 devnull /* alarms come from the gs monitor */
46 24c02865 2005-01-04 devnull if(x && strstr(x, "alarm")){
47 24c02865 2005-01-04 devnull postnote(PNGROUP, getpid(), "die (gs error)");
48 24c02865 2005-01-04 devnull postnote(PNPROC, notewatcher, "die (gs error)");
51 24c02865 2005-01-04 devnull /* function mentions u so that it's in the stack trace */
52 24c02865 2005-01-04 devnull if((u == nil || u != x) && doabort)
55 24c02865 2005-01-04 devnull /* fprint(2, "exiting %d\n", getpid()); */
56 24c02865 2005-01-04 devnull wexits("note");
57 24c02865 2005-01-04 devnull return 0;
60 24c02865 2005-01-04 devnull static int
61 24c02865 2005-01-04 devnull afmt(Fmt *fmt)
65 24c02865 2005-01-04 devnull s = va_arg(fmt->args, char*);
66 24c02865 2005-01-04 devnull if(s == nil || s[0] == '\0')
67 24c02865 2005-01-04 devnull return fmtstrcpy(fmt, "");
69 24c02865 2005-01-04 devnull return fmtprint(fmt, "%#q", s);
73 24c02865 2005-01-04 devnull usage(void)
75 24c02865 2005-01-04 devnull fprint(2, "usage: page [-biRrw] [-p ppi] file...\n");
76 24c02865 2005-01-04 devnull exits("usage");
80 24c02865 2005-01-04 devnull main(int argc, char **argv)
82 24c02865 2005-01-04 devnull Document *doc;
83 24c02865 2005-01-04 devnull Biobuf *b;
84 24c02865 2005-01-04 devnull enum { Ninput = 16 };
85 24c02865 2005-01-04 devnull uchar buf[Ninput+1];
86 24c02865 2005-01-04 devnull int readstdin;
88 24c02865 2005-01-04 devnull ARGBEGIN{
89 24c02865 2005-01-04 devnull /* "temporary" debugging options */
90 24c02865 2005-01-04 devnull case 'P':
91 24c02865 2005-01-04 devnull goodps = 0;
93 24c02865 2005-01-04 devnull case 'v':
94 24c02865 2005-01-04 devnull chatty++;
96 24c02865 2005-01-04 devnull case 'V':
99 24c02865 2005-01-04 devnull case 'a':
100 24c02865 2005-01-04 devnull doabort++;
102 24c02865 2005-01-04 devnull case 'T':
103 24c02865 2005-01-04 devnull textbits = atoi(EARGF(usage()));
104 24c02865 2005-01-04 devnull gfxbits = atoi(EARGF(usage()));
107 24c02865 2005-01-04 devnull /* real options */
108 24c02865 2005-01-04 devnull case 'R':
109 24c02865 2005-01-04 devnull resizing = 1;
111 24c02865 2005-01-04 devnull case 'r':
112 24c02865 2005-01-04 devnull reverse = 1;
114 24c02865 2005-01-04 devnull case 'p':
115 24c02865 2005-01-04 devnull ppi = atoi(EARGF(usage()));
117 24c02865 2005-01-04 devnull case 'b':
118 24c02865 2005-01-04 devnull truetoboundingbox = 1;
120 24c02865 2005-01-04 devnull case 'w':
121 24c02865 2005-01-04 devnull mknewwindow = 1;
122 24c02865 2005-01-04 devnull resizing = 1;
124 24c02865 2005-01-04 devnull case 'i':
125 24c02865 2005-01-04 devnull imagemode = 1;
127 24c02865 2005-01-04 devnull default:
128 24c02865 2005-01-04 devnull usage();
129 24c02865 2005-01-04 devnull }ARGEND;
131 24c02865 2005-01-04 devnull notegp = getpid();
133 24c02865 2005-01-04 devnull switch(notewatcher = fork()){
134 24c02865 2005-01-04 devnull case -1:
135 24c02865 2005-01-04 devnull sysfatal("fork\n");
136 24c02865 2005-01-04 devnull exits(0);
137 24c02865 2005-01-04 devnull default:
140 24c02865 2005-01-04 devnull atnotify(watcher, 1);
142 24c02865 2005-01-04 devnull sleep(1000);
143 24c02865 2005-01-04 devnull _exits(0);
146 24c02865 2005-01-04 devnull rfork(RFNOTEG);
147 24c02865 2005-01-04 devnull atnotify(bell, 1);
149 24c02865 2005-01-04 devnull readstdin = 0;
150 24c02865 2005-01-04 devnull if(imagemode == 0 && argc == 0){
151 24c02865 2005-01-04 devnull readstdin = 1;
152 24c02865 2005-01-04 devnull stdinfd = dup(0, -1);
153 24c02865 2005-01-04 devnull close(0);
154 24c02865 2005-01-04 devnull open("/dev/cons", OREAD);
157 24c02865 2005-01-04 devnull quotefmtinstall();
158 24c02865 2005-01-04 devnull fmtinstall('a', afmt);
160 24c02865 2005-01-04 devnull fmtinstall('R', Rfmt);
161 24c02865 2005-01-04 devnull fmtinstall('P', Pfmt);
163 24c02865 2005-01-04 devnull if(readstdin){
164 24c02865 2005-01-04 devnull b = nil;
165 24c02865 2005-01-04 devnull if(readn(stdinfd, buf, Ninput) != Ninput){
166 24c02865 2005-01-04 devnull fprint(2, "page: short read reading %s\n", argv[0]);
167 24c02865 2005-01-04 devnull wexits("read");
169 24c02865 2005-01-04 devnull }else if(argc != 0){
170 24c02865 2005-01-04 devnull if(!(b = Bopen(argv[0], OREAD))) {
171 24c02865 2005-01-04 devnull fprint(2, "page: cannot open \"%s\"\n", argv[0]);
172 24c02865 2005-01-04 devnull wexits("open");
175 24c02865 2005-01-04 devnull if(Bread(b, buf, Ninput) != Ninput) {
176 24c02865 2005-01-04 devnull fprint(2, "page: short read reading %s\n", argv[0]);
177 24c02865 2005-01-04 devnull wexits("read");
180 24c02865 2005-01-04 devnull b = nil;
182 24c02865 2005-01-04 devnull buf[Ninput] = '\0';
183 24c02865 2005-01-04 devnull if(imagemode)
184 24c02865 2005-01-04 devnull doc = initgfx(nil, 0, nil, nil, 0);
185 24c02865 2005-01-04 devnull else if(strncmp((char*)buf, "%PDF-", 5) == 0)
186 24c02865 2005-01-04 devnull doc = initpdf(b, argc, argv, buf, Ninput);
187 24c02865 2005-01-04 devnull else if(strncmp((char*)buf, "\x04%!", 2) == 0)
188 24c02865 2005-01-04 devnull doc = initps(b, argc, argv, buf, Ninput);
189 24c02865 2005-01-04 devnull else if(buf[0] == '\x1B' && strstr((char*)buf, "@PJL"))
190 24c02865 2005-01-04 devnull doc = initps(b, argc, argv, buf, Ninput);
191 24c02865 2005-01-04 devnull else if(strncmp((char*)buf, "%!", 2) == 0)
192 24c02865 2005-01-04 devnull doc = initps(b, argc, argv, buf, Ninput);
193 24c02865 2005-01-04 devnull else if(strcmp((char*)buf, "\xF7\x02\x01\x83\x92\xC0\x1C;") == 0)
194 24c02865 2005-01-04 devnull doc = initdvi(b, argc, argv, buf, Ninput);
195 24c02865 2005-01-04 devnull else if(strncmp((char*)buf, "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1", 8) == 0)
196 24c02865 2005-01-04 devnull doc = initmsdoc(b, argc, argv, buf, Ninput);
197 24c02865 2005-01-04 devnull else if(strncmp((char*)buf, "x T ", 4) == 0)
198 24c02865 2005-01-04 devnull doc = inittroff(b, argc, argv, buf, Ninput);
200 24c02865 2005-01-04 devnull if(ppi != 100) {
201 24c02865 2005-01-04 devnull fprint(2, "page: you can't specify -p with graphic files\n");
202 24c02865 2005-01-04 devnull wexits("-p and graphics");
204 24c02865 2005-01-04 devnull doc = initgfx(b, argc, argv, buf, Ninput);
207 24c02865 2005-01-04 devnull if(doc == nil) {
208 24c02865 2005-01-04 devnull fprint(2, "page: error reading file: %r\n");
209 24c02865 2005-01-04 devnull wexits("document init");
212 24c02865 2005-01-04 devnull if(doc->npage < 1 && !imagemode) {
213 24c02865 2005-01-04 devnull fprint(2, "page: no pages found?\n");
214 24c02865 2005-01-04 devnull wexits("pagecount");
217 24c02865 2005-01-04 devnull if(reverse == -1) /* neither cmdline nor ps reader set it */
218 24c02865 2005-01-04 devnull reverse = 0;
220 24c02865 2005-01-04 devnull if(initdraw(0, 0, "page") < 0){
221 24c02865 2005-01-04 devnull fprint(2, "page: initdraw failed: %r\n");
222 24c02865 2005-01-04 devnull wexits("initdraw");
224 24c02865 2005-01-04 devnull truecolor = screen->depth > 8;
225 24c02865 2005-01-04 devnull viewer(doc);
226 24c02865 2005-01-04 devnull wexits(0);
230 24c02865 2005-01-04 devnull wexits(char *s)
232 24c02865 2005-01-04 devnull if(s && *s && strcmp(s, "note") != 0 && mknewwindow)
233 24c02865 2005-01-04 devnull sleep(10*1000);
234 24c02865 2005-01-04 devnull postnote(PNPROC, notewatcher, "die");
235 24c02865 2005-01-04 devnull exits(s);