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 05a4d855 2007-03-26 devnull #include <thread.h>
5 24c02865 2005-01-04 devnull #include <bio.h>
6 05a4d855 2007-03-26 devnull #include <cursor.h>
7 24c02865 2005-01-04 devnull #include "page.h"
8 24c02865 2005-01-04 devnull
9 24c02865 2005-01-04 devnull int resizing;
10 24c02865 2005-01-04 devnull int mknewwindow;
11 24c02865 2005-01-04 devnull int doabort;
12 24c02865 2005-01-04 devnull int chatty;
13 24c02865 2005-01-04 devnull int reverse = -1;
14 24c02865 2005-01-04 devnull int goodps = 1;
15 24c02865 2005-01-04 devnull int ppi = 100;
16 24c02865 2005-01-04 devnull int teegs = 0;
17 24c02865 2005-01-04 devnull int truetoboundingbox;
18 24c02865 2005-01-04 devnull int textbits=4, gfxbits=4;
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 05a4d855 2007-03-26 devnull int notewatcher;
23 05a4d855 2007-03-26 devnull int notegp;
24 d9e047e5 2010-02-04 rsc int fitwin;
25 2fb0c444 2009-08-20 jrm8005 char tempfile[40];
26 24c02865 2005-01-04 devnull
27 05a4d855 2007-03-26 devnull int
28 05a4d855 2007-03-26 devnull watcher(void *v, char *x)
29 05a4d855 2007-03-26 devnull {
30 05a4d855 2007-03-26 devnull USED(v);
31 05a4d855 2007-03-26 devnull if(strcmp(x, "die") != 0)
32 05a4d855 2007-03-26 devnull postnote(PNGROUP, notegp, x);
33 05a4d855 2007-03-26 devnull threadexitsall(0);
34 05a4d855 2007-03-26 devnull return 0;
35 05a4d855 2007-03-26 devnull }
36 05a4d855 2007-03-26 devnull
37 5cd829d5 2007-04-03 devnull void
38 5cd829d5 2007-04-03 devnull watcherproc(void *v)
39 5cd829d5 2007-04-03 devnull {
40 5cd829d5 2007-04-03 devnull threadnotify(watcher, 1);
41 5cd829d5 2007-04-03 devnull for(;;)
42 5cd829d5 2007-04-03 devnull sleep(1000);
43 5cd829d5 2007-04-03 devnull }
44 fa325e9b 2020-01-10 cross
45 05a4d855 2007-03-26 devnull int
46 05a4d855 2007-03-26 devnull bell(void *u, char *x)
47 05a4d855 2007-03-26 devnull {
48 05a4d855 2007-03-26 devnull if(x && strcmp(x, "hangup") == 0)
49 05a4d855 2007-03-26 devnull threadexitsall(0);
50 05a4d855 2007-03-26 devnull
51 05a4d855 2007-03-26 devnull if(x && strstr(x, "die") == nil)
52 05a4d855 2007-03-26 devnull fprint(2, "postnote %d: %s\n", getpid(), x);
53 05a4d855 2007-03-26 devnull
54 05a4d855 2007-03-26 devnull /* alarms come from the gs monitor */
55 05a4d855 2007-03-26 devnull if(x && strstr(x, "alarm")){
56 05a4d855 2007-03-26 devnull postnote(PNGROUP, getpid(), "die (gs error)");
57 05a4d855 2007-03-26 devnull postnote(PNPROC, notewatcher, "die (gs error)");
58 05a4d855 2007-03-26 devnull }
59 05a4d855 2007-03-26 devnull
60 05a4d855 2007-03-26 devnull /* function mentions u so that it's in the stack trace */
61 05a4d855 2007-03-26 devnull if((u == nil || u != x) && doabort)
62 05a4d855 2007-03-26 devnull abort();
63 05a4d855 2007-03-26 devnull
64 05a4d855 2007-03-26 devnull /* fprint(2, "exiting %d\n", getpid()); */
65 05a4d855 2007-03-26 devnull wexits("note");
66 05a4d855 2007-03-26 devnull return 0;
67 05a4d855 2007-03-26 devnull }
68 05a4d855 2007-03-26 devnull
69 24c02865 2005-01-04 devnull static int
70 24c02865 2005-01-04 devnull afmt(Fmt *fmt)
71 24c02865 2005-01-04 devnull {
72 24c02865 2005-01-04 devnull char *s;
73 24c02865 2005-01-04 devnull
74 24c02865 2005-01-04 devnull s = va_arg(fmt->args, char*);
75 24c02865 2005-01-04 devnull if(s == nil || s[0] == '\0')
76 24c02865 2005-01-04 devnull return fmtstrcpy(fmt, "");
77 24c02865 2005-01-04 devnull else
78 24c02865 2005-01-04 devnull return fmtprint(fmt, "%#q", s);
79 24c02865 2005-01-04 devnull }
80 24c02865 2005-01-04 devnull
81 24c02865 2005-01-04 devnull void
82 24c02865 2005-01-04 devnull usage(void)
83 24c02865 2005-01-04 devnull {
84 fa325e9b 2020-01-10 cross fprint(2, "usage: page [-biRrwf] [-p ppi] file...\n");
85 05a4d855 2007-03-26 devnull wexits("usage");
86 24c02865 2005-01-04 devnull }
87 24c02865 2005-01-04 devnull
88 24c02865 2005-01-04 devnull void
89 2fb0c444 2009-08-20 jrm8005 cleanup(void)
90 2fb0c444 2009-08-20 jrm8005 {
91 2fb0c444 2009-08-20 jrm8005 remove(tempfile);
92 2fb0c444 2009-08-20 jrm8005 }
93 2fb0c444 2009-08-20 jrm8005
94 2fb0c444 2009-08-20 jrm8005 void
95 05a4d855 2007-03-26 devnull threadmain(int argc, char **argv)
96 24c02865 2005-01-04 devnull {
97 24c02865 2005-01-04 devnull Document *doc;
98 24c02865 2005-01-04 devnull Biobuf *b;
99 05a4d855 2007-03-26 devnull char *basename = argv[0];
100 24c02865 2005-01-04 devnull enum { Ninput = 16 };
101 24c02865 2005-01-04 devnull uchar buf[Ninput+1];
102 24c02865 2005-01-04 devnull int readstdin;
103 24c02865 2005-01-04 devnull
104 24c02865 2005-01-04 devnull ARGBEGIN{
105 24c02865 2005-01-04 devnull /* "temporary" debugging options */
106 24c02865 2005-01-04 devnull case 'P':
107 24c02865 2005-01-04 devnull goodps = 0;
108 24c02865 2005-01-04 devnull break;
109 24c02865 2005-01-04 devnull case 'v':
110 24c02865 2005-01-04 devnull chatty++;
111 24c02865 2005-01-04 devnull break;
112 24c02865 2005-01-04 devnull case 'V':
113 24c02865 2005-01-04 devnull teegs++;
114 24c02865 2005-01-04 devnull break;
115 24c02865 2005-01-04 devnull case 'a':
116 24c02865 2005-01-04 devnull doabort++;
117 24c02865 2005-01-04 devnull break;
118 24c02865 2005-01-04 devnull case 'T':
119 24c02865 2005-01-04 devnull textbits = atoi(EARGF(usage()));
120 24c02865 2005-01-04 devnull gfxbits = atoi(EARGF(usage()));
121 24c02865 2005-01-04 devnull break;
122 24c02865 2005-01-04 devnull
123 24c02865 2005-01-04 devnull /* real options */
124 24c02865 2005-01-04 devnull case 'R':
125 24c02865 2005-01-04 devnull resizing = 1;
126 24c02865 2005-01-04 devnull break;
127 24c02865 2005-01-04 devnull case 'r':
128 24c02865 2005-01-04 devnull reverse = 1;
129 24c02865 2005-01-04 devnull break;
130 24c02865 2005-01-04 devnull case 'p':
131 24c02865 2005-01-04 devnull ppi = atoi(EARGF(usage()));
132 24c02865 2005-01-04 devnull break;
133 24c02865 2005-01-04 devnull case 'b':
134 24c02865 2005-01-04 devnull truetoboundingbox = 1;
135 24c02865 2005-01-04 devnull break;
136 24c02865 2005-01-04 devnull case 'w':
137 05a4d855 2007-03-26 devnull fprint(2, "%s: -w has only the effect of -R X11 systems\n", basename);
138 24c02865 2005-01-04 devnull resizing = 1;
139 24c02865 2005-01-04 devnull break;
140 24c02865 2005-01-04 devnull case 'i':
141 24c02865 2005-01-04 devnull imagemode = 1;
142 24c02865 2005-01-04 devnull break;
143 60a31903 2008-07-09 rsc case 'W':
144 60a31903 2008-07-09 rsc winsize = EARGF(usage());
145 60a31903 2008-07-09 rsc break;
146 d9e047e5 2010-02-04 rsc case 'f':
147 d9e047e5 2010-02-04 rsc fitwin = 1;
148 fa325e9b 2020-01-10 cross break;
149 24c02865 2005-01-04 devnull default:
150 24c02865 2005-01-04 devnull usage();
151 24c02865 2005-01-04 devnull }ARGEND;
152 24c02865 2005-01-04 devnull
153 05a4d855 2007-03-26 devnull notegp = getpid();
154 05a4d855 2007-03-26 devnull
155 5cd829d5 2007-04-03 devnull notewatcher = proccreate(watcherproc, NULL, 1024);
156 5cd829d5 2007-04-03 devnull if(notewatcher == -1){
157 5cd829d5 2007-04-03 devnull sysfatal("proccreate");
158 05a4d855 2007-03-26 devnull threadexitsall(0);
159 05a4d855 2007-03-26 devnull }
160 05a4d855 2007-03-26 devnull
161 24c02865 2005-01-04 devnull rfork(RFNOTEG);
162 5cd829d5 2007-04-03 devnull threadnotify(bell, 1);
163 24c02865 2005-01-04 devnull
164 24c02865 2005-01-04 devnull readstdin = 0;
165 24c02865 2005-01-04 devnull if(imagemode == 0 && argc == 0){
166 24c02865 2005-01-04 devnull readstdin = 1;
167 24c02865 2005-01-04 devnull stdinfd = dup(0, -1);
168 24c02865 2005-01-04 devnull close(0);
169 05a4d855 2007-03-26 devnull open("/dev/tty", OREAD);
170 24c02865 2005-01-04 devnull }
171 24c02865 2005-01-04 devnull
172 24c02865 2005-01-04 devnull quotefmtinstall();
173 24c02865 2005-01-04 devnull fmtinstall('a', afmt);
174 24c02865 2005-01-04 devnull
175 24c02865 2005-01-04 devnull fmtinstall('R', Rfmt);
176 24c02865 2005-01-04 devnull fmtinstall('P', Pfmt);
177 05a4d855 2007-03-26 devnull /*
178 17157e4a 2006-03-20 devnull if(mknewwindow)
179 05a4d855 2007-03-26 devnull newwin(); */
180 24c02865 2005-01-04 devnull
181 24c02865 2005-01-04 devnull if(readstdin){
182 24c02865 2005-01-04 devnull b = nil;
183 24c02865 2005-01-04 devnull if(readn(stdinfd, buf, Ninput) != Ninput){
184 24c02865 2005-01-04 devnull fprint(2, "page: short read reading %s\n", argv[0]);
185 24c02865 2005-01-04 devnull wexits("read");
186 24c02865 2005-01-04 devnull }
187 fa325e9b 2020-01-10 cross
188 2fb0c444 2009-08-20 jrm8005 atexit(cleanup);
189 24c02865 2005-01-04 devnull }else if(argc != 0){
190 24c02865 2005-01-04 devnull if(!(b = Bopen(argv[0], OREAD))) {
191 24c02865 2005-01-04 devnull fprint(2, "page: cannot open \"%s\"\n", argv[0]);
192 24c02865 2005-01-04 devnull wexits("open");
193 fa325e9b 2020-01-10 cross }
194 24c02865 2005-01-04 devnull
195 24c02865 2005-01-04 devnull if(Bread(b, buf, Ninput) != Ninput) {
196 24c02865 2005-01-04 devnull fprint(2, "page: short read reading %s\n", argv[0]);
197 24c02865 2005-01-04 devnull wexits("read");
198 24c02865 2005-01-04 devnull }
199 24c02865 2005-01-04 devnull }else
200 24c02865 2005-01-04 devnull b = nil;
201 24c02865 2005-01-04 devnull
202 24c02865 2005-01-04 devnull buf[Ninput] = '\0';
203 24c02865 2005-01-04 devnull if(imagemode)
204 24c02865 2005-01-04 devnull doc = initgfx(nil, 0, nil, nil, 0);
205 24c02865 2005-01-04 devnull else if(strncmp((char*)buf, "%PDF-", 5) == 0)
206 24c02865 2005-01-04 devnull doc = initpdf(b, argc, argv, buf, Ninput);
207 24c02865 2005-01-04 devnull else if(strncmp((char*)buf, "\x04%!", 2) == 0)
208 24c02865 2005-01-04 devnull doc = initps(b, argc, argv, buf, Ninput);
209 24c02865 2005-01-04 devnull else if(buf[0] == '\x1B' && strstr((char*)buf, "@PJL"))
210 24c02865 2005-01-04 devnull doc = initps(b, argc, argv, buf, Ninput);
211 24c02865 2005-01-04 devnull else if(strncmp((char*)buf, "%!", 2) == 0)
212 24c02865 2005-01-04 devnull doc = initps(b, argc, argv, buf, Ninput);
213 24c02865 2005-01-04 devnull else if(strcmp((char*)buf, "\xF7\x02\x01\x83\x92\xC0\x1C;") == 0)
214 24c02865 2005-01-04 devnull doc = initdvi(b, argc, argv, buf, Ninput);
215 24c02865 2005-01-04 devnull else if(strncmp((char*)buf, "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1", 8) == 0)
216 24c02865 2005-01-04 devnull doc = initmsdoc(b, argc, argv, buf, Ninput);
217 24c02865 2005-01-04 devnull else if(strncmp((char*)buf, "x T ", 4) == 0)
218 24c02865 2005-01-04 devnull doc = inittroff(b, argc, argv, buf, Ninput);
219 24c02865 2005-01-04 devnull else {
220 24c02865 2005-01-04 devnull if(ppi != 100) {
221 24c02865 2005-01-04 devnull fprint(2, "page: you can't specify -p with graphic files\n");
222 24c02865 2005-01-04 devnull wexits("-p and graphics");
223 24c02865 2005-01-04 devnull }
224 24c02865 2005-01-04 devnull doc = initgfx(b, argc, argv, buf, Ninput);
225 24c02865 2005-01-04 devnull }
226 24c02865 2005-01-04 devnull
227 24c02865 2005-01-04 devnull if(doc == nil) {
228 24c02865 2005-01-04 devnull fprint(2, "page: error reading file: %r\n");
229 24c02865 2005-01-04 devnull wexits("document init");
230 24c02865 2005-01-04 devnull }
231 24c02865 2005-01-04 devnull
232 24c02865 2005-01-04 devnull if(doc->npage < 1 && !imagemode) {
233 24c02865 2005-01-04 devnull fprint(2, "page: no pages found?\n");
234 24c02865 2005-01-04 devnull wexits("pagecount");
235 24c02865 2005-01-04 devnull }
236 24c02865 2005-01-04 devnull
237 24c02865 2005-01-04 devnull if(reverse == -1) /* neither cmdline nor ps reader set it */
238 24c02865 2005-01-04 devnull reverse = 0;
239 24c02865 2005-01-04 devnull
240 24c02865 2005-01-04 devnull if(initdraw(0, 0, "page") < 0){
241 24c02865 2005-01-04 devnull fprint(2, "page: initdraw failed: %r\n");
242 24c02865 2005-01-04 devnull wexits("initdraw");
243 24c02865 2005-01-04 devnull }
244 b3453e08 2009-08-10 fshahriar display->locking = 1;
245 fa325e9b 2020-01-10 cross
246 24c02865 2005-01-04 devnull truecolor = screen->depth > 8;
247 24c02865 2005-01-04 devnull viewer(doc);
248 24c02865 2005-01-04 devnull wexits(0);
249 24c02865 2005-01-04 devnull }
250 24c02865 2005-01-04 devnull
251 24c02865 2005-01-04 devnull void
252 24c02865 2005-01-04 devnull wexits(char *s)
253 24c02865 2005-01-04 devnull {
254 05a4d855 2007-03-26 devnull if(s && *s && strcmp(s, "note") != 0 && mknewwindow)
255 05a4d855 2007-03-26 devnull sleep(10*1000);
256 05a4d855 2007-03-26 devnull postnote(PNPROC, notewatcher, "die");
257 05a4d855 2007-03-26 devnull postnote(PNGROUP, getpid(), "die");
258 05a4d855 2007-03-26 devnull threadexitsall(s);
259 24c02865 2005-01-04 devnull }