Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <event.h>
5 #include <bio.h>
6 #include "proof.h"
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";
18 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 }
25 double
26 getnum(char *s)
27 {
28 if(s == nil)
29 usage();
30 return atof(s);
31 }
33 char*
34 getstr(char *s)
35 {
36 if(s == nil)
37 usage();
38 return s;
39 }
41 void
42 main(int argc, char *argv[])
43 {
44 char c;
45 int dotrack = 0;
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
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();
102 /*
103 * Input buffer to allow us to back up
104 */
105 #define SIZE 100000 /* 8-10 pages, typically */
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 */
112 void
113 addc(int c)
115 *inc++ = c;
116 if(inc == &bufc[SIZE])
117 inc = &bufc[0];
120 int
121 getc(void)
123 int c;
125 if(outc == inc){
126 c = Bgetc(&bin);
127 if(c == Beof)
128 return Beof;
129 addc(c);
131 off++;
132 c = *outc++;
133 if(outc == &bufc[SIZE])
134 outc = &bufc[0];
135 return c;
138 int
139 getrune(void)
141 int c, n;
142 Rune r;
143 char buf[UTFmax];
145 for(n=0; !fullrune(buf, n); n++){
146 c = getc();
147 if(c == Beof)
148 return Beof;
149 buf[n] = c;
151 chartorune(&r, buf);
152 return r;
155 int
156 nbuf(void) /* return number of buffered characters */
158 int ini, outi;
160 ini = inc-bufc;
161 outi = outc-bufc;
162 if(ini < outi)
163 ini += SIZE;
164 return ini-outi;
167 ulong
168 seekc(ulong o)
170 ulong avail;
171 long delta;
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;
184 return Beof;
187 void
188 ungetc(void)
190 if(off == 0)
191 return;
192 if(nbuf() == SIZE){
193 fprint(2, "backup buffer overflow\n");
194 return;
196 if(outc == &bufc[0])
197 outc = &bufc[SIZE];
198 --outc;
199 --off;
202 ulong
203 offsetc(void)
205 return off;
208 char*
209 rdlinec(void)
211 static char buf[2048];
212 int c, i;
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;
223 if(i == 0)
224 return nil;
225 return buf;