1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <event.h>
5 #include <bio.h>
6 #include "proof.h"
7
8 Rectangle rpage = { 0, 0, 850, 1150 };
9 char devname[64];
10 double mag = DEFMAG;
11 int dbg = 0;
12 char *track = 0;
13 Biobuf bin;
14 char *libfont = "#9/font";
15 char *mapfile = "MAP";
16 char *mapname = "MAP";
17
18 void
usage(void)19 usage(void)
20 {
21 fprint(2, "usage: proof [-m mag] [-/ nview] [-x xoff] [-y yoff] [-M mapfile] [-F fontdir] [-dt] file...\n");
22 exits("usage");
23 }
24
25 double
getnum(char * s)26 getnum(char *s)
27 {
28 if(s == nil)
29 usage();
30 return atof(s);
31 }
32
33 char*
getstr(char * s)34 getstr(char *s)
35 {
36 if(s == nil)
37 usage();
38 return s;
39 }
40
41 void
main(int argc,char * argv[])42 main(int argc, char *argv[])
43 {
44 char c;
45 int dotrack = 0;
46
47 libfont = unsharp(libfont);
48 ARGBEGIN{
49 case 'm': /* magnification */
50 mag = getnum(ARGF());
51 if (mag < 0.1 || mag > 10){
52 fprint(2, "ridiculous mag argument ignored\n");
53 mag = DEFMAG;
54 }
55 break;
56 case '/':
57 nview = getnum(ARGF());
58 if (nview < 1 || nview > MAXVIEW)
59 nview = 1;
60 break;
61 case 'x':
62 xyoffset.x += getnum(ARGF()) * 100;
63 break;
64 case 'y':
65 xyoffset.y += getnum(ARGF()) * 100;
66 break;
67 case 'M': /* change MAP file */
68 mapname = EARGF(usage());
69 break;
70 case 'F': /* change /lib/font/bit directory */
71 libfont = EARGF(usage());
72 break;
73 case 'd':
74 dbg = 1;
75 break;
76 case 't':
77 dotrack = 1;
78 break;
79 default:
80 usage();
81 }ARGEND
82
83 if (argc > 0) {
84 close(0);
85 if (open(argv[0], 0) != 0) {
86 sysfatal("can't open %s: %r\n", argv[0]);
87 exits("open failure");
88 }
89 if(dotrack)
90 track = argv[0];
91 }
92 Binit(&bin, 0, OREAD);
93 mapfile = smprint("%s/%s", libfont, mapname);
94 readmapfile(mapfile);
95 for (c = 0; c < NFONT; c++)
96 loadfontname(c, "??");
97 mapscreen();
98 clearscreen();
99 readpage();
100 }
101
102 /*
103 * Input buffer to allow us to back up
104 */
105 #define SIZE 100000 /* 8-10 pages, typically */
106
107 char bufc[SIZE];
108 char *inc = bufc; /* where next input character goes */
109 char *outc = bufc; /* next character to be read from buffer */
110 int off; /* position of outc in total input stream */
111
112 void
addc(int c)113 addc(int c)
114 {
115 *inc++ = c;
116 if(inc == &bufc[SIZE])
117 inc = &bufc[0];
118 }
119
120 int
getc(void)121 getc(void)
122 {
123 int c;
124
125 if(outc == inc){
126 c = Bgetc(&bin);
127 if(c == Beof)
128 return Beof;
129 addc(c);
130 }
131 off++;
132 c = *outc++;
133 if(outc == &bufc[SIZE])
134 outc = &bufc[0];
135 return c;
136 }
137
138 int
getrune(void)139 getrune(void)
140 {
141 int c, n;
142 Rune r;
143 char buf[UTFmax];
144
145 for(n=0; !fullrune(buf, n); n++){
146 c = getc();
147 if(c == Beof)
148 return Beof;
149 buf[n] = c;
150 }
151 chartorune(&r, buf);
152 return r;
153 }
154
155 int
nbuf(void)156 nbuf(void) /* return number of buffered characters */
157 {
158 int ini, outi;
159
160 ini = inc-bufc;
161 outi = outc-bufc;
162 if(ini < outi)
163 ini += SIZE;
164 return ini-outi;
165 }
166
167 ulong
seekc(ulong o)168 seekc(ulong o)
169 {
170 ulong avail;
171 long delta;
172
173 delta = off-o;
174 if(delta < 0)
175 return Beof;
176 avail = SIZE-nbuf();
177 if(delta < avail){
178 off = o;
179 outc -= delta;
180 if(outc < &bufc[0])
181 outc += SIZE;
182 return off;
183 }
184 return Beof;
185 }
186
187 void
ungetc(void)188 ungetc(void)
189 {
190 if(off == 0)
191 return;
192 if(nbuf() == SIZE){
193 fprint(2, "backup buffer overflow\n");
194 return;
195 }
196 if(outc == &bufc[0])
197 outc = &bufc[SIZE];
198 --outc;
199 --off;
200 }
201
202 ulong
offsetc(void)203 offsetc(void)
204 {
205 return off;
206 }
207
208 char*
rdlinec(void)209 rdlinec(void)
210 {
211 static char buf[2048];
212 int c, i;
213
214 for(i=0; i<sizeof buf; ){
215 c = getc();
216 if(c == Beof)
217 break;
218 buf[i++] = c;
219 if(c == '\n')
220 break;
221 }
222
223 if(i == 0)
224 return nil;
225 return buf;
226 }
227