13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier #include <event.h>
53e12c5d1SDavid du Colombier #include <bio.h>
63e12c5d1SDavid du Colombier #include "proof.h"
73e12c5d1SDavid du Colombier
83e12c5d1SDavid du Colombier Rectangle rpage = { 0, 0, 850, 1150 };
93e12c5d1SDavid du Colombier char devname[64];
103e12c5d1SDavid du Colombier double mag = DEFMAG;
113e12c5d1SDavid du Colombier int dbg = 0;
123e12c5d1SDavid du Colombier char *track = 0;
133e12c5d1SDavid du Colombier Biobuf bin;
14bfe6f914SDavid du Colombier char libfont[256] = "/lib/font/bit";
15bfe6f914SDavid du Colombier char mapfile[256] = "MAP";
163e12c5d1SDavid du Colombier char *mapname = "MAP";
173e12c5d1SDavid du Colombier
183e12c5d1SDavid du Colombier void
usage(void)197dd7cddfSDavid du Colombier usage(void)
207dd7cddfSDavid du Colombier {
21bfe6f914SDavid du Colombier fprint(2, "usage: proof [-m mag] [-/ nview] [-x xoff] [-y yoff] "
22bfe6f914SDavid du Colombier "[-M mapfile] [-F fontdir] [-dt] file...\n");
237dd7cddfSDavid du Colombier exits("usage");
247dd7cddfSDavid du Colombier }
257dd7cddfSDavid du Colombier
267dd7cddfSDavid du Colombier void
main(int argc,char * argv[])273e12c5d1SDavid du Colombier main(int argc, char *argv[])
283e12c5d1SDavid du Colombier {
293e12c5d1SDavid du Colombier char c;
303e12c5d1SDavid du Colombier int dotrack = 0;
313e12c5d1SDavid du Colombier
327dd7cddfSDavid du Colombier ARGBEGIN{
33bfe6f914SDavid du Colombier case 'M': /* change MAP file */
34bfe6f914SDavid du Colombier mapname = EARGF(usage());
35bfe6f914SDavid du Colombier break;
36bfe6f914SDavid du Colombier case 'F': /* change /lib/font/bit directory */
37bfe6f914SDavid du Colombier strncpy(libfont, EARGF(usage()), sizeof libfont);
38bfe6f914SDavid du Colombier break;
39bfe6f914SDavid du Colombier case 'd':
40bfe6f914SDavid du Colombier dbg = 1;
41bfe6f914SDavid du Colombier break;
423e12c5d1SDavid du Colombier case 'm': /* magnification */
43bfe6f914SDavid du Colombier mag = atof(EARGF(usage()));
443e12c5d1SDavid du Colombier if (mag < 0.1 || mag > 10){
453e12c5d1SDavid du Colombier fprint(2, "ridiculous mag argument ignored\n");
463e12c5d1SDavid du Colombier mag = DEFMAG;
473e12c5d1SDavid du Colombier }
483e12c5d1SDavid du Colombier break;
493e12c5d1SDavid du Colombier case 't':
503e12c5d1SDavid du Colombier dotrack = 1;
513e12c5d1SDavid du Colombier break;
52bfe6f914SDavid du Colombier case 'x':
53bfe6f914SDavid du Colombier xyoffset.x += atof(EARGF(usage())) * 100;
54bfe6f914SDavid du Colombier break;
55bfe6f914SDavid du Colombier case 'y':
56bfe6f914SDavid du Colombier xyoffset.y += atof(EARGF(usage())) * 100;
57bfe6f914SDavid du Colombier break;
58bfe6f914SDavid du Colombier case '/':
59bfe6f914SDavid du Colombier nview = atof(EARGF(usage()));
60bfe6f914SDavid du Colombier if (nview < 1 || nview > MAXVIEW)
61bfe6f914SDavid du Colombier nview = 1;
62bfe6f914SDavid du Colombier break;
633e12c5d1SDavid du Colombier default:
647dd7cddfSDavid du Colombier usage();
657dd7cddfSDavid du Colombier }ARGEND
667dd7cddfSDavid du Colombier
677dd7cddfSDavid du Colombier if (argc > 0) {
683e12c5d1SDavid du Colombier close(0);
697dd7cddfSDavid du Colombier if (open(argv[0], 0) != 0) {
70*14cc0f53SDavid du Colombier sysfatal("can't open %s: %r", argv[0]);
713e12c5d1SDavid du Colombier exits("open failure");
723e12c5d1SDavid du Colombier }
733e12c5d1SDavid du Colombier if(dotrack)
747dd7cddfSDavid du Colombier track = argv[0];
753e12c5d1SDavid du Colombier }
763e12c5d1SDavid du Colombier Binit(&bin, 0, OREAD);
77bfe6f914SDavid du Colombier snprint(mapfile, sizeof mapfile, "%s/%s", libfont, mapname);
783e12c5d1SDavid du Colombier readmapfile(mapfile);
793e12c5d1SDavid du Colombier for (c = 0; c < NFONT; c++)
803e12c5d1SDavid du Colombier loadfontname(c, "??");
813e12c5d1SDavid du Colombier mapscreen();
823e12c5d1SDavid du Colombier clearscreen();
833e12c5d1SDavid du Colombier readpage();
84bfe6f914SDavid du Colombier exits(0);
853e12c5d1SDavid du Colombier }
867dd7cddfSDavid du Colombier
877dd7cddfSDavid du Colombier /*
887dd7cddfSDavid du Colombier * Input buffer to allow us to back up
897dd7cddfSDavid du Colombier */
907dd7cddfSDavid du Colombier #define SIZE 100000 /* 8-10 pages, typically */
917dd7cddfSDavid du Colombier
927dd7cddfSDavid du Colombier char bufc[SIZE];
937dd7cddfSDavid du Colombier char *inc = bufc; /* where next input character goes */
947dd7cddfSDavid du Colombier char *outc = bufc; /* next character to be read from buffer */
957dd7cddfSDavid du Colombier int off; /* position of outc in total input stream */
967dd7cddfSDavid du Colombier
977dd7cddfSDavid du Colombier void
addc(int c)987dd7cddfSDavid du Colombier addc(int c)
997dd7cddfSDavid du Colombier {
1007dd7cddfSDavid du Colombier *inc++ = c;
1017dd7cddfSDavid du Colombier if(inc == &bufc[SIZE])
1027dd7cddfSDavid du Colombier inc = &bufc[0];
1037dd7cddfSDavid du Colombier }
1047dd7cddfSDavid du Colombier
1057dd7cddfSDavid du Colombier int
getc(void)1067dd7cddfSDavid du Colombier getc(void)
1077dd7cddfSDavid du Colombier {
1087dd7cddfSDavid du Colombier int c;
1097dd7cddfSDavid du Colombier
1107dd7cddfSDavid du Colombier if(outc == inc){
1117dd7cddfSDavid du Colombier c = Bgetc(&bin);
1127dd7cddfSDavid du Colombier if(c == Beof)
1137dd7cddfSDavid du Colombier return Beof;
1147dd7cddfSDavid du Colombier addc(c);
1157dd7cddfSDavid du Colombier }
1167dd7cddfSDavid du Colombier off++;
1177dd7cddfSDavid du Colombier c = *outc++;
1187dd7cddfSDavid du Colombier if(outc == &bufc[SIZE])
1197dd7cddfSDavid du Colombier outc = &bufc[0];
1207dd7cddfSDavid du Colombier return c;
1217dd7cddfSDavid du Colombier }
1227dd7cddfSDavid du Colombier
1237dd7cddfSDavid du Colombier int
getrune(void)1247dd7cddfSDavid du Colombier getrune(void)
1257dd7cddfSDavid du Colombier {
1267dd7cddfSDavid du Colombier int c, n;
1277dd7cddfSDavid du Colombier Rune r;
1287dd7cddfSDavid du Colombier char buf[UTFmax];
1297dd7cddfSDavid du Colombier
1307dd7cddfSDavid du Colombier for(n=0; !fullrune(buf, n); n++){
1317dd7cddfSDavid du Colombier c = getc();
1327dd7cddfSDavid du Colombier if(c == Beof)
1337dd7cddfSDavid du Colombier return Beof;
1347dd7cddfSDavid du Colombier buf[n] = c;
1357dd7cddfSDavid du Colombier }
1367dd7cddfSDavid du Colombier chartorune(&r, buf);
1377dd7cddfSDavid du Colombier return r;
1387dd7cddfSDavid du Colombier }
1397dd7cddfSDavid du Colombier
1407dd7cddfSDavid du Colombier int
nbuf(void)1417dd7cddfSDavid du Colombier nbuf(void) /* return number of buffered characters */
1427dd7cddfSDavid du Colombier {
1437dd7cddfSDavid du Colombier int ini, outi;
1447dd7cddfSDavid du Colombier
1457dd7cddfSDavid du Colombier ini = inc-bufc;
1467dd7cddfSDavid du Colombier outi = outc-bufc;
1477dd7cddfSDavid du Colombier if(ini < outi)
1487dd7cddfSDavid du Colombier ini += SIZE;
1497dd7cddfSDavid du Colombier return ini-outi;
1507dd7cddfSDavid du Colombier }
1517dd7cddfSDavid du Colombier
1527dd7cddfSDavid du Colombier ulong
seekc(ulong o)1537dd7cddfSDavid du Colombier seekc(ulong o)
1547dd7cddfSDavid du Colombier {
1557dd7cddfSDavid du Colombier ulong avail;
1567dd7cddfSDavid du Colombier long delta;
1577dd7cddfSDavid du Colombier
1587dd7cddfSDavid du Colombier delta = off-o;
1597dd7cddfSDavid du Colombier if(delta < 0)
1607dd7cddfSDavid du Colombier return Beof;
1617dd7cddfSDavid du Colombier avail = SIZE-nbuf();
1627dd7cddfSDavid du Colombier if(delta < avail){
1637dd7cddfSDavid du Colombier off = o;
1647dd7cddfSDavid du Colombier outc -= delta;
1657dd7cddfSDavid du Colombier if(outc < &bufc[0])
1667dd7cddfSDavid du Colombier outc += SIZE;
1677dd7cddfSDavid du Colombier return off;
1687dd7cddfSDavid du Colombier }
1697dd7cddfSDavid du Colombier return Beof;
1707dd7cddfSDavid du Colombier }
1717dd7cddfSDavid du Colombier
1727dd7cddfSDavid du Colombier void
ungetc(void)1737dd7cddfSDavid du Colombier ungetc(void)
1747dd7cddfSDavid du Colombier {
1757dd7cddfSDavid du Colombier if(off == 0)
1767dd7cddfSDavid du Colombier return;
1777dd7cddfSDavid du Colombier if(nbuf() == SIZE){
1787dd7cddfSDavid du Colombier fprint(2, "backup buffer overflow\n");
1797dd7cddfSDavid du Colombier return;
1807dd7cddfSDavid du Colombier }
1817dd7cddfSDavid du Colombier if(outc == &bufc[0])
1827dd7cddfSDavid du Colombier outc = &bufc[SIZE];
1837dd7cddfSDavid du Colombier --outc;
1847dd7cddfSDavid du Colombier --off;
1857dd7cddfSDavid du Colombier }
1867dd7cddfSDavid du Colombier
1877dd7cddfSDavid du Colombier ulong
offsetc(void)1887dd7cddfSDavid du Colombier offsetc(void)
1897dd7cddfSDavid du Colombier {
1907dd7cddfSDavid du Colombier return off;
1917dd7cddfSDavid du Colombier }
1927dd7cddfSDavid du Colombier
1937dd7cddfSDavid du Colombier char*
rdlinec(void)1947dd7cddfSDavid du Colombier rdlinec(void)
1957dd7cddfSDavid du Colombier {
1967dd7cddfSDavid du Colombier static char buf[2048];
1977dd7cddfSDavid du Colombier int c, i;
1987dd7cddfSDavid du Colombier
1997dd7cddfSDavid du Colombier for(i=0; i<sizeof buf; ){
2007dd7cddfSDavid du Colombier c = getc();
2017dd7cddfSDavid du Colombier if(c == Beof)
2027dd7cddfSDavid du Colombier break;
2037dd7cddfSDavid du Colombier buf[i++] = c;
2047dd7cddfSDavid du Colombier if(c == '\n')
2057dd7cddfSDavid du Colombier break;
2067dd7cddfSDavid du Colombier }
2077dd7cddfSDavid du Colombier
2087dd7cddfSDavid du Colombier if(i == 0)
2097dd7cddfSDavid du Colombier return nil;
2107dd7cddfSDavid du Colombier return buf;
2117dd7cddfSDavid du Colombier }
212