17 int truetoboundingbox;
18 int textbits=4, gfxbits=4;
26 watcher(void *v, char *x)
29 if(strcmp(x, "die") != 0)
30 postnote(PNGROUP, notegp, x);
38 threadnotify(watcher, 1);
44 bell(void *u, char *x)
46 if(x && strcmp(x, "hangup") == 0)
49 if(x && strstr(x, "die") == nil)
50 fprint(2, "postnote %d: %s\n", getpid(), x);
52 /* alarms come from the gs monitor */
53 if(x && strstr(x, "alarm")){
54 postnote(PNGROUP, getpid(), "die (gs error)");
55 postnote(PNPROC, notewatcher, "die (gs error)");
58 /* function mentions u so that it's in the stack trace */
59 if((u == nil || u != x) && doabort)
62 /* fprint(2, "exiting %d\n", getpid()); */
72 s = va_arg(fmt->args, char*);
73 if(s == nil || s[0] == '\0')
74 return fmtstrcpy(fmt, "");
76 return fmtprint(fmt, "%#q", s);
82 fprint(2, "usage: page [-biRrw] [-p ppi] file...\n");
87 threadmain(int argc, char **argv)
91 char *basename = argv[0];
97 /* "temporary" debugging options */
111 textbits = atoi(EARGF(usage()));
112 gfxbits = atoi(EARGF(usage()));
123 ppi = atoi(EARGF(usage()));
126 truetoboundingbox = 1;
129 fprint(2, "%s: -w has only the effect of -R X11 systems\n", basename);
141 notewatcher = proccreate(watcherproc, NULL, 1024);
142 if(notewatcher == -1){
143 sysfatal("proccreate");
148 threadnotify(bell, 1);
151 if(imagemode == 0 && argc == 0){
153 stdinfd = dup(0, -1);
155 open("/dev/tty", OREAD);
159 fmtinstall('a', afmt);
161 fmtinstall('R', Rfmt);
162 fmtinstall('P', Pfmt);
169 if(readn(stdinfd, buf, Ninput) != Ninput){
170 fprint(2, "page: short read reading %s\n", argv[0]);
174 if(!(b = Bopen(argv[0], OREAD))) {
175 fprint(2, "page: cannot open \"%s\"\n", argv[0]);
179 if(Bread(b, buf, Ninput) != Ninput) {
180 fprint(2, "page: short read reading %s\n", argv[0]);
188 doc = initgfx(nil, 0, nil, nil, 0);
189 else if(strncmp((char*)buf, "%PDF-", 5) == 0)
190 doc = initpdf(b, argc, argv, buf, Ninput);
191 else if(strncmp((char*)buf, "\x04%!", 2) == 0)
192 doc = initps(b, argc, argv, buf, Ninput);
193 else if(buf[0] == '\x1B' && strstr((char*)buf, "@PJL"))
194 doc = initps(b, argc, argv, buf, Ninput);
195 else if(strncmp((char*)buf, "%!", 2) == 0)
196 doc = initps(b, argc, argv, buf, Ninput);
197 else if(strcmp((char*)buf, "\xF7\x02\x01\x83\x92\xC0\x1C;") == 0)
198 doc = initdvi(b, argc, argv, buf, Ninput);
199 else if(strncmp((char*)buf, "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1", 8) == 0)
200 doc = initmsdoc(b, argc, argv, buf, Ninput);
201 else if(strncmp((char*)buf, "x T ", 4) == 0)
202 doc = inittroff(b, argc, argv, buf, Ninput);
205 fprint(2, "page: you can't specify -p with graphic files\n");
206 wexits("-p and graphics");
208 doc = initgfx(b, argc, argv, buf, Ninput);
212 fprint(2, "page: error reading file: %r\n");
213 wexits("document init");
216 if(doc->npage < 1 && !imagemode) {
217 fprint(2, "page: no pages found?\n");
221 if(reverse == -1) /* neither cmdline nor ps reader set it */
224 if(initdraw(0, 0, "page") < 0){
225 fprint(2, "page: initdraw failed: %r\n");
228 truecolor = screen->depth > 8;
236 if(s && *s && strcmp(s, "note") != 0 && mknewwindow)
238 postnote(PNPROC, notewatcher, "die");
239 postnote(PNGROUP, getpid(), "die");