Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <cursor.h>
5 #include <event.h>
6 #include <bio.h>
7 #include "page.h"
9 int resizing;
10 int mknewwindow;
11 int doabort;
12 int chatty;
13 int reverse = -1;
14 int goodps = 1;
15 int ppi = 100;
16 int teegs = 0;
17 int truetoboundingbox;
18 int textbits=4, gfxbits=4;
19 int wctlfd = -1;
20 int stdinfd;
21 int truecolor;
22 int imagemode;
24 static int
25 afmt(Fmt *fmt)
26 {
27 char *s;
29 s = va_arg(fmt->args, char*);
30 if(s == nil || s[0] == '\0')
31 return fmtstrcpy(fmt, "");
32 else
33 return fmtprint(fmt, "%#q", s);
34 }
36 void
37 usage(void)
38 {
39 fprint(2, "usage: page [-biRrw] [-p ppi] file...\n");
40 exits("usage");
41 }
43 void
44 main(int argc, char **argv)
45 {
46 Document *doc;
47 Biobuf *b;
48 enum { Ninput = 16 };
49 uchar buf[Ninput+1];
50 int readstdin;
52 ARGBEGIN{
53 /* "temporary" debugging options */
54 case 'P':
55 goodps = 0;
56 break;
57 case 'v':
58 chatty++;
59 break;
60 case 'V':
61 teegs++;
62 break;
63 case 'a':
64 doabort++;
65 break;
66 case 'T':
67 textbits = atoi(EARGF(usage()));
68 gfxbits = atoi(EARGF(usage()));
69 break;
71 /* real options */
72 case 'R':
73 resizing = 1;
74 break;
75 case 'r':
76 reverse = 1;
77 break;
78 case 'p':
79 ppi = atoi(EARGF(usage()));
80 break;
81 case 'b':
82 truetoboundingbox = 1;
83 break;
84 case 'w':
85 mknewwindow = 1;
86 resizing = 1;
87 break;
88 case 'i':
89 imagemode = 1;
90 break;
91 default:
92 usage();
93 }ARGEND;
95 rfork(RFNOTEG);
97 readstdin = 0;
98 if(imagemode == 0 && argc == 0){
99 readstdin = 1;
100 stdinfd = dup(0, -1);
101 close(0);
102 open("/dev/cons", OREAD);
105 quotefmtinstall();
106 fmtinstall('a', afmt);
108 fmtinstall('R', Rfmt);
109 fmtinstall('P', Pfmt);
110 if(mknewwindow)
111 newwin();
113 if(readstdin){
114 b = nil;
115 if(readn(stdinfd, buf, Ninput) != Ninput){
116 fprint(2, "page: short read reading %s\n", argv[0]);
117 wexits("read");
119 }else if(argc != 0){
120 if(!(b = Bopen(argv[0], OREAD))) {
121 fprint(2, "page: cannot open \"%s\"\n", argv[0]);
122 wexits("open");
125 if(Bread(b, buf, Ninput) != Ninput) {
126 fprint(2, "page: short read reading %s\n", argv[0]);
127 wexits("read");
129 }else
130 b = nil;
132 buf[Ninput] = '\0';
133 if(imagemode)
134 doc = initgfx(nil, 0, nil, nil, 0);
135 else if(strncmp((char*)buf, "%PDF-", 5) == 0)
136 doc = initpdf(b, argc, argv, buf, Ninput);
137 else if(strncmp((char*)buf, "\x04%!", 2) == 0)
138 doc = initps(b, argc, argv, buf, Ninput);
139 else if(buf[0] == '\x1B' && strstr((char*)buf, "@PJL"))
140 doc = initps(b, argc, argv, buf, Ninput);
141 else if(strncmp((char*)buf, "%!", 2) == 0)
142 doc = initps(b, argc, argv, buf, Ninput);
143 else if(strcmp((char*)buf, "\xF7\x02\x01\x83\x92\xC0\x1C;") == 0)
144 doc = initdvi(b, argc, argv, buf, Ninput);
145 else if(strncmp((char*)buf, "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1", 8) == 0)
146 doc = initmsdoc(b, argc, argv, buf, Ninput);
147 else if(strncmp((char*)buf, "x T ", 4) == 0)
148 doc = inittroff(b, argc, argv, buf, Ninput);
149 else {
150 if(ppi != 100) {
151 fprint(2, "page: you can't specify -p with graphic files\n");
152 wexits("-p and graphics");
154 doc = initgfx(b, argc, argv, buf, Ninput);
157 if(doc == nil) {
158 fprint(2, "page: error reading file: %r\n");
159 wexits("document init");
162 if(doc->npage < 1 && !imagemode) {
163 fprint(2, "page: no pages found?\n");
164 wexits("pagecount");
167 if(reverse == -1) /* neither cmdline nor ps reader set it */
168 reverse = 0;
170 if(initdraw(0, 0, "page") < 0){
171 fprint(2, "page: initdraw failed: %r\n");
172 wexits("initdraw");
174 truecolor = screen->depth > 8;
175 viewer(doc);
176 wexits(0);
179 void
180 wexits(char *s)
182 exits(s);