Blame


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"
7 24c02865 2005-01-04 devnull
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;
24 24c02865 2005-01-04 devnull
25 24c02865 2005-01-04 devnull int
26 24c02865 2005-01-04 devnull watcher(void *v, char *x)
27 24c02865 2005-01-04 devnull {
28 24c02865 2005-01-04 devnull USED(v);
29 24c02865 2005-01-04 devnull
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;
34 24c02865 2005-01-04 devnull }
35 24c02865 2005-01-04 devnull
36 24c02865 2005-01-04 devnull int
37 24c02865 2005-01-04 devnull bell(void *u, char *x)
38 24c02865 2005-01-04 devnull {
39 24c02865 2005-01-04 devnull if(x && strcmp(x, "hangup") == 0)
40 24c02865 2005-01-04 devnull _exits(0);
41 24c02865 2005-01-04 devnull
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);
44 24c02865 2005-01-04 devnull
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)");
49 24c02865 2005-01-04 devnull }
50 24c02865 2005-01-04 devnull
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)
53 24c02865 2005-01-04 devnull abort();
54 24c02865 2005-01-04 devnull
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;
58 24c02865 2005-01-04 devnull }
59 24c02865 2005-01-04 devnull
60 24c02865 2005-01-04 devnull static int
61 24c02865 2005-01-04 devnull afmt(Fmt *fmt)
62 24c02865 2005-01-04 devnull {
63 24c02865 2005-01-04 devnull char *s;
64 24c02865 2005-01-04 devnull
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, "");
68 24c02865 2005-01-04 devnull else
69 24c02865 2005-01-04 devnull return fmtprint(fmt, "%#q", s);
70 24c02865 2005-01-04 devnull }
71 24c02865 2005-01-04 devnull
72 24c02865 2005-01-04 devnull void
73 24c02865 2005-01-04 devnull usage(void)
74 24c02865 2005-01-04 devnull {
75 24c02865 2005-01-04 devnull fprint(2, "usage: page [-biRrw] [-p ppi] file...\n");
76 24c02865 2005-01-04 devnull exits("usage");
77 24c02865 2005-01-04 devnull }
78 24c02865 2005-01-04 devnull
79 24c02865 2005-01-04 devnull void
80 24c02865 2005-01-04 devnull main(int argc, char **argv)
81 24c02865 2005-01-04 devnull {
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;
87 24c02865 2005-01-04 devnull
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;
92 24c02865 2005-01-04 devnull break;
93 24c02865 2005-01-04 devnull case 'v':
94 24c02865 2005-01-04 devnull chatty++;
95 24c02865 2005-01-04 devnull break;
96 24c02865 2005-01-04 devnull case 'V':
97 24c02865 2005-01-04 devnull teegs++;
98 24c02865 2005-01-04 devnull break;
99 24c02865 2005-01-04 devnull case 'a':
100 24c02865 2005-01-04 devnull doabort++;
101 24c02865 2005-01-04 devnull break;
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()));
105 24c02865 2005-01-04 devnull break;
106 24c02865 2005-01-04 devnull
107 24c02865 2005-01-04 devnull /* real options */
108 24c02865 2005-01-04 devnull case 'R':
109 24c02865 2005-01-04 devnull resizing = 1;
110 24c02865 2005-01-04 devnull break;
111 24c02865 2005-01-04 devnull case 'r':
112 24c02865 2005-01-04 devnull reverse = 1;
113 24c02865 2005-01-04 devnull break;
114 24c02865 2005-01-04 devnull case 'p':
115 24c02865 2005-01-04 devnull ppi = atoi(EARGF(usage()));
116 24c02865 2005-01-04 devnull break;
117 24c02865 2005-01-04 devnull case 'b':
118 24c02865 2005-01-04 devnull truetoboundingbox = 1;
119 24c02865 2005-01-04 devnull break;
120 24c02865 2005-01-04 devnull case 'w':
121 24c02865 2005-01-04 devnull mknewwindow = 1;
122 24c02865 2005-01-04 devnull resizing = 1;
123 24c02865 2005-01-04 devnull break;
124 24c02865 2005-01-04 devnull case 'i':
125 24c02865 2005-01-04 devnull imagemode = 1;
126 24c02865 2005-01-04 devnull break;
127 24c02865 2005-01-04 devnull default:
128 24c02865 2005-01-04 devnull usage();
129 24c02865 2005-01-04 devnull }ARGEND;
130 24c02865 2005-01-04 devnull
131 24c02865 2005-01-04 devnull notegp = getpid();
132 24c02865 2005-01-04 devnull
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:
138 24c02865 2005-01-04 devnull break;
139 24c02865 2005-01-04 devnull case 0:
140 24c02865 2005-01-04 devnull atnotify(watcher, 1);
141 24c02865 2005-01-04 devnull for(;;)
142 24c02865 2005-01-04 devnull sleep(1000);
143 24c02865 2005-01-04 devnull _exits(0);
144 24c02865 2005-01-04 devnull }
145 24c02865 2005-01-04 devnull
146 24c02865 2005-01-04 devnull rfork(RFNOTEG);
147 24c02865 2005-01-04 devnull atnotify(bell, 1);
148 24c02865 2005-01-04 devnull
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);
155 24c02865 2005-01-04 devnull }
156 24c02865 2005-01-04 devnull
157 24c02865 2005-01-04 devnull quotefmtinstall();
158 24c02865 2005-01-04 devnull fmtinstall('a', afmt);
159 24c02865 2005-01-04 devnull
160 24c02865 2005-01-04 devnull fmtinstall('R', Rfmt);
161 24c02865 2005-01-04 devnull fmtinstall('P', Pfmt);
162 24c02865 2005-01-04 devnull
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");
168 24c02865 2005-01-04 devnull }
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");
173 24c02865 2005-01-04 devnull }
174 24c02865 2005-01-04 devnull
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");
178 24c02865 2005-01-04 devnull }
179 24c02865 2005-01-04 devnull }else
180 24c02865 2005-01-04 devnull b = nil;
181 24c02865 2005-01-04 devnull
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);
199 24c02865 2005-01-04 devnull else {
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");
203 24c02865 2005-01-04 devnull }
204 24c02865 2005-01-04 devnull doc = initgfx(b, argc, argv, buf, Ninput);
205 24c02865 2005-01-04 devnull }
206 24c02865 2005-01-04 devnull
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");
210 24c02865 2005-01-04 devnull }
211 24c02865 2005-01-04 devnull
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");
215 24c02865 2005-01-04 devnull }
216 24c02865 2005-01-04 devnull
217 24c02865 2005-01-04 devnull if(reverse == -1) /* neither cmdline nor ps reader set it */
218 24c02865 2005-01-04 devnull reverse = 0;
219 24c02865 2005-01-04 devnull
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");
223 24c02865 2005-01-04 devnull }
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);
227 24c02865 2005-01-04 devnull }
228 24c02865 2005-01-04 devnull
229 24c02865 2005-01-04 devnull void
230 24c02865 2005-01-04 devnull wexits(char *s)
231 24c02865 2005-01-04 devnull {
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);
236 24c02865 2005-01-04 devnull }