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