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"
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";
19 020c8058 2005-01-04 devnull usage(void)
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");
26 020c8058 2005-01-04 devnull getnum(char *s)
28 020c8058 2005-01-04 devnull if(s == nil)
30 020c8058 2005-01-04 devnull return atof(s);
34 020c8058 2005-01-04 devnull getstr(char *s)
36 020c8058 2005-01-04 devnull if(s == nil)
38 020c8058 2005-01-04 devnull return s;
42 020c8058 2005-01-04 devnull main(int argc, char *argv[])
45 020c8058 2005-01-04 devnull int dotrack = 0;
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;
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;
61 020c8058 2005-01-04 devnull case 'x':
62 020c8058 2005-01-04 devnull xyoffset.x += getnum(ARGF()) * 100;
64 020c8058 2005-01-04 devnull case 'y':
65 020c8058 2005-01-04 devnull xyoffset.y += getnum(ARGF()) * 100;
67 020c8058 2005-01-04 devnull case 'M': /* change MAP file */
68 020c8058 2005-01-04 devnull mapname = EARGF(usage());
70 020c8058 2005-01-04 devnull case 'F': /* change /lib/font/bit directory */
71 020c8058 2005-01-04 devnull libfont = EARGF(usage());
73 020c8058 2005-01-04 devnull case 'd':
76 020c8058 2005-01-04 devnull case 't':
77 020c8058 2005-01-04 devnull dotrack = 1;
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");
89 020c8058 2005-01-04 devnull if(dotrack)
90 020c8058 2005-01-04 devnull track = argv[0];
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();
103 020c8058 2005-01-04 devnull * Input buffer to allow us to back up
105 020c8058 2005-01-04 devnull #define SIZE 100000 /* 8-10 pages, typically */
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 */
113 020c8058 2005-01-04 devnull addc(int c)
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];
121 020c8058 2005-01-04 devnull getc(void)
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);
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;
139 020c8058 2005-01-04 devnull getrune(void)
141 020c8058 2005-01-04 devnull int c, n;
143 020c8058 2005-01-04 devnull char buf[UTFmax];
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;
151 020c8058 2005-01-04 devnull chartorune(&r, buf);
152 020c8058 2005-01-04 devnull return r;
156 020c8058 2005-01-04 devnull nbuf(void) /* return number of buffered characters */
158 020c8058 2005-01-04 devnull int ini, outi;
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;
168 020c8058 2005-01-04 devnull seekc(ulong o)
170 020c8058 2005-01-04 devnull ulong avail;
171 020c8058 2005-01-04 devnull long delta;
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;
184 020c8058 2005-01-04 devnull return Beof;
188 020c8058 2005-01-04 devnull ungetc(void)
190 020c8058 2005-01-04 devnull if(off == 0)
192 020c8058 2005-01-04 devnull if(nbuf() == SIZE){
193 020c8058 2005-01-04 devnull fprint(2, "backup buffer overflow\n");
196 020c8058 2005-01-04 devnull if(outc == &bufc[0])
197 020c8058 2005-01-04 devnull outc = &bufc[SIZE];
203 020c8058 2005-01-04 devnull offsetc(void)
205 020c8058 2005-01-04 devnull return off;
209 020c8058 2005-01-04 devnull rdlinec(void)
211 020c8058 2005-01-04 devnull static char buf[2048];
212 020c8058 2005-01-04 devnull int c, i;
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)
218 020c8058 2005-01-04 devnull buf[i++] = c;
219 020c8058 2005-01-04 devnull if(c == '\n')
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;