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