xref: /plan9/sys/src/cmd/proof/main.c (revision 14cc0f535177405a84c5b73603a98e5db6674719)
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