Blame


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