| #include	<u.h> | 
 | #include	<libc.h> | 
 | #include	<draw.h> | 
 | #include	<event.h> | 
 | #include	<bio.h> | 
 | #include	"proof.h" | 
 |  | 
 | Rectangle rpage = { 0, 0, 850, 1150 }; | 
 | char devname[64]; | 
 | double mag = DEFMAG; | 
 | int dbg = 0; | 
 | char *track = 0; | 
 | Biobuf bin; | 
 | char *libfont = "#9/font"; | 
 | char *mapfile = "MAP"; | 
 | char *mapname = "MAP"; | 
 |  | 
 | void | 
 | usage(void) | 
 | { | 
 | 	fprint(2, "usage: proof [-m mag] [-/ nview] [-x xoff] [-y yoff] [-M mapfile] [-F fontdir] [-dt] file...\n"); | 
 | 	exits("usage"); | 
 | } | 
 |  | 
 | double | 
 | getnum(char *s) | 
 | { | 
 | 	if(s == nil) | 
 | 		usage(); | 
 | 	return atof(s); | 
 | } | 
 |  | 
 | char* | 
 | getstr(char *s) | 
 | { | 
 | 	if(s == nil) | 
 | 		usage(); | 
 | 	return s; | 
 | } | 
 |  | 
 | void | 
 | main(int argc, char *argv[]) | 
 | { | 
 | 	char c; | 
 | 	int dotrack = 0; | 
 | 	 | 
 | 	libfont = unsharp(libfont); | 
 | 	ARGBEGIN{ | 
 | 	case 'm':	/* magnification */ | 
 | 		mag = getnum(ARGF()); | 
 | 		if (mag < 0.1 || mag > 10){ | 
 | 			fprint(2, "ridiculous mag argument ignored\n"); | 
 | 			mag = DEFMAG; | 
 | 		} | 
 | 		break; | 
 | 	case '/': | 
 | 		nview = getnum(ARGF()); | 
 | 		if (nview < 1 || nview > MAXVIEW) | 
 | 			nview = 1; | 
 | 		break; | 
 | 	case 'x': | 
 | 		xyoffset.x += getnum(ARGF()) * 100; | 
 | 		break; | 
 | 	case 'y': | 
 | 		xyoffset.y += getnum(ARGF()) * 100; | 
 | 		break; | 
 | 	case 'M':	/* change MAP file */ | 
 | 		mapname = EARGF(usage()); | 
 | 		break; | 
 | 	case 'F':	/* change /lib/font/bit directory */ | 
 | 		libfont = EARGF(usage()); | 
 | 		break; | 
 | 	case 'd': | 
 | 		dbg = 1; | 
 | 		break; | 
 | 	case 't': | 
 | 		dotrack = 1; | 
 | 		break; | 
 | 	default: | 
 | 		usage(); | 
 | 	}ARGEND | 
 |  | 
 | 	if (argc > 0) { | 
 | 		close(0); | 
 | 		if (open(argv[0], 0) != 0) { | 
 | 			sysfatal("can't open %s: %r\n", argv[0]); | 
 | 			exits("open failure"); | 
 | 		} | 
 | 		if(dotrack) | 
 | 			track = argv[0]; | 
 | 	} | 
 | 	Binit(&bin, 0, OREAD); | 
 | 	mapfile = smprint("%s/%s", libfont, mapname); | 
 | 	readmapfile(mapfile); | 
 | 	for (c = 0; c < NFONT; c++) | 
 | 		loadfontname(c, "??"); | 
 | 	mapscreen(); | 
 | 	clearscreen(); | 
 | 	readpage();  | 
 | } | 
 |  | 
 | /* | 
 |  * Input buffer to allow us to back up | 
 |  */ | 
 | #define	SIZE	100000	/* 8-10 pages, typically */ | 
 |  | 
 | char	bufc[SIZE]; | 
 | char	*inc = bufc;		/* where next input character goes */ | 
 | char	*outc = bufc;	/* next character to be read from buffer */ | 
 | int	off;		/* position of outc in total input stream */ | 
 |  | 
 | void | 
 | addc(int c) | 
 | { | 
 | 	*inc++ = c; | 
 | 	if(inc == &bufc[SIZE]) | 
 | 		inc = &bufc[0]; | 
 | } | 
 |  | 
 | int | 
 | getc(void) | 
 | { | 
 | 	int c; | 
 |  | 
 | 	if(outc == inc){ | 
 | 		c = Bgetc(&bin); | 
 | 		if(c == Beof) | 
 | 			return Beof; | 
 | 		addc(c); | 
 | 	} | 
 | 	off++; | 
 | 	c = *outc++; | 
 | 	if(outc == &bufc[SIZE]) | 
 | 		outc = &bufc[0]; | 
 | 	return c; | 
 | } | 
 |  | 
 | int | 
 | getrune(void) | 
 | { | 
 | 	int c, n; | 
 | 	Rune r; | 
 | 	char buf[UTFmax]; | 
 |  | 
 | 	for(n=0; !fullrune(buf, n); n++){ | 
 | 		c = getc(); | 
 | 		if(c == Beof) | 
 | 			return Beof; | 
 | 		buf[n] = c; | 
 | 	} | 
 | 	chartorune(&r, buf); | 
 | 	return r; | 
 | } | 
 |  | 
 | int | 
 | nbuf(void)	/* return number of buffered characters */ | 
 | { | 
 | 	int ini, outi; | 
 |  | 
 | 	ini = inc-bufc; | 
 | 	outi = outc-bufc; | 
 | 	if(ini < outi) | 
 | 		ini += SIZE; | 
 | 	return ini-outi; | 
 | } | 
 |  | 
 | ulong | 
 | seekc(ulong o) | 
 | { | 
 | 	ulong avail; | 
 | 	long delta; | 
 |  | 
 | 	delta = off-o; | 
 | 	if(delta < 0) | 
 | 		return Beof; | 
 | 	avail = SIZE-nbuf(); | 
 | 	if(delta < avail){ | 
 | 		off = o; | 
 | 		outc -= delta; | 
 | 		if(outc < &bufc[0]) | 
 | 			outc += SIZE; | 
 | 		return off; | 
 | 	} | 
 | 	return Beof; | 
 | } | 
 |  | 
 | void | 
 | ungetc(void) | 
 | { | 
 | 	if(off == 0) | 
 | 		return; | 
 | 	if(nbuf() == SIZE){ | 
 | 		fprint(2, "backup buffer overflow\n"); | 
 | 		return; | 
 | 	} | 
 | 	if(outc == &bufc[0]) | 
 | 		outc = &bufc[SIZE]; | 
 | 	--outc; | 
 | 	--off; | 
 | } | 
 |  | 
 | ulong | 
 | offsetc(void) | 
 | { | 
 | 	return off; | 
 | } | 
 |  | 
 | char* | 
 | rdlinec(void) | 
 | { | 
 | 	static char buf[2048]; | 
 | 	int c, i; | 
 |  | 
 | 	for(i=0; i<sizeof buf; ){ | 
 | 		c = getc(); | 
 | 		if(c == Beof) | 
 | 			break; | 
 | 		buf[i++] = c; | 
 | 		if(c == '\n') | 
 | 			break; | 
 | 	} | 
 |  | 
 | 	if(i == 0) | 
 | 		return nil; | 
 | 	return buf; | 
 | } |