aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/proof/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/proof/main.c')
-rw-r--r--src/cmd/proof/main.c226
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;
+}