|  | #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; | 
|  | } |