blob: 5e0c804c20edb0700cce981e2fbca0e7b56dee1c [file] [log] [blame]
#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;
}