diff options
Diffstat (limited to 'src/cmd/proof/main.c')
-rw-r--r-- | src/cmd/proof/main.c | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/src/cmd/proof/main.c b/src/cmd/proof/main.c new file mode 100644 index 00000000..5e0c804c --- /dev/null +++ b/src/cmd/proof/main.c @@ -0,0 +1,226 @@ +#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; +} |