plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

main.c (3269B)


      1 #include	<u.h>
      2 #include	<libc.h>
      3 #include	<draw.h>
      4 #include	<event.h>
      5 #include	<bio.h>
      6 #include	"proof.h"
      7 
      8 Rectangle rpage = { 0, 0, 850, 1150 };
      9 char devname[64];
     10 double mag = DEFMAG;
     11 int dbg = 0;
     12 char *track = 0;
     13 Biobuf bin;
     14 char *libfont = "#9/font";
     15 char *mapfile = "MAP";
     16 char *mapname = "MAP";
     17 
     18 void
     19 usage(void)
     20 {
     21 	fprint(2, "usage: proof [-m mag] [-/ nview] [-x xoff] [-y yoff] [-M mapfile] [-F fontdir] [-dt] file...\n");
     22 	exits("usage");
     23 }
     24 
     25 double
     26 getnum(char *s)
     27 {
     28 	if(s == nil)
     29 		usage();
     30 	return atof(s);
     31 }
     32 
     33 char*
     34 getstr(char *s)
     35 {
     36 	if(s == nil)
     37 		usage();
     38 	return s;
     39 }
     40 
     41 void
     42 main(int argc, char *argv[])
     43 {
     44 	char c;
     45 	int dotrack = 0;
     46 
     47 	libfont = unsharp(libfont);
     48 	ARGBEGIN{
     49 	case 'm':	/* magnification */
     50 		mag = getnum(ARGF());
     51 		if (mag < 0.1 || mag > 10){
     52 			fprint(2, "ridiculous mag argument ignored\n");
     53 			mag = DEFMAG;
     54 		}
     55 		break;
     56 	case '/':
     57 		nview = getnum(ARGF());
     58 		if (nview < 1 || nview > MAXVIEW)
     59 			nview = 1;
     60 		break;
     61 	case 'x':
     62 		xyoffset.x += getnum(ARGF()) * 100;
     63 		break;
     64 	case 'y':
     65 		xyoffset.y += getnum(ARGF()) * 100;
     66 		break;
     67 	case 'M':	/* change MAP file */
     68 		mapname = EARGF(usage());
     69 		break;
     70 	case 'F':	/* change /lib/font/bit directory */
     71 		libfont = EARGF(usage());
     72 		break;
     73 	case 'd':
     74 		dbg = 1;
     75 		break;
     76 	case 't':
     77 		dotrack = 1;
     78 		break;
     79 	default:
     80 		usage();
     81 	}ARGEND
     82 
     83 	if (argc > 0) {
     84 		close(0);
     85 		if (open(argv[0], 0) != 0) {
     86 			sysfatal("can't open %s: %r\n", argv[0]);
     87 			exits("open failure");
     88 		}
     89 		if(dotrack)
     90 			track = argv[0];
     91 	}
     92 	Binit(&bin, 0, OREAD);
     93 	mapfile = smprint("%s/%s", libfont, mapname);
     94 	readmapfile(mapfile);
     95 	for (c = 0; c < NFONT; c++)
     96 		loadfontname(c, "??");
     97 	mapscreen();
     98 	clearscreen();
     99 	readpage();
    100 }
    101 
    102 /*
    103  * Input buffer to allow us to back up
    104  */
    105 #define	SIZE	100000	/* 8-10 pages, typically */
    106 
    107 char	bufc[SIZE];
    108 char	*inc = bufc;		/* where next input character goes */
    109 char	*outc = bufc;	/* next character to be read from buffer */
    110 int	off;		/* position of outc in total input stream */
    111 
    112 void
    113 addc(int c)
    114 {
    115 	*inc++ = c;
    116 	if(inc == &bufc[SIZE])
    117 		inc = &bufc[0];
    118 }
    119 
    120 int
    121 getc(void)
    122 {
    123 	int c;
    124 
    125 	if(outc == inc){
    126 		c = Bgetc(&bin);
    127 		if(c == Beof)
    128 			return Beof;
    129 		addc(c);
    130 	}
    131 	off++;
    132 	c = *outc++;
    133 	if(outc == &bufc[SIZE])
    134 		outc = &bufc[0];
    135 	return c;
    136 }
    137 
    138 int
    139 getrune(void)
    140 {
    141 	int c, n;
    142 	Rune r;
    143 	char buf[UTFmax];
    144 
    145 	for(n=0; !fullrune(buf, n); n++){
    146 		c = getc();
    147 		if(c == Beof)
    148 			return Beof;
    149 		buf[n] = c;
    150 	}
    151 	chartorune(&r, buf);
    152 	return r;
    153 }
    154 
    155 int
    156 nbuf(void)	/* return number of buffered characters */
    157 {
    158 	int ini, outi;
    159 
    160 	ini = inc-bufc;
    161 	outi = outc-bufc;
    162 	if(ini < outi)
    163 		ini += SIZE;
    164 	return ini-outi;
    165 }
    166 
    167 ulong
    168 seekc(ulong o)
    169 {
    170 	ulong avail;
    171 	long delta;
    172 
    173 	delta = off-o;
    174 	if(delta < 0)
    175 		return Beof;
    176 	avail = SIZE-nbuf();
    177 	if(delta < avail){
    178 		off = o;
    179 		outc -= delta;
    180 		if(outc < &bufc[0])
    181 			outc += SIZE;
    182 		return off;
    183 	}
    184 	return Beof;
    185 }
    186 
    187 void
    188 ungetc(void)
    189 {
    190 	if(off == 0)
    191 		return;
    192 	if(nbuf() == SIZE){
    193 		fprint(2, "backup buffer overflow\n");
    194 		return;
    195 	}
    196 	if(outc == &bufc[0])
    197 		outc = &bufc[SIZE];
    198 	--outc;
    199 	--off;
    200 }
    201 
    202 ulong
    203 offsetc(void)
    204 {
    205 	return off;
    206 }
    207 
    208 char*
    209 rdlinec(void)
    210 {
    211 	static char buf[2048];
    212 	int c, i;
    213 
    214 	for(i=0; i<sizeof buf; ){
    215 		c = getc();
    216 		if(c == Beof)
    217 			break;
    218 		buf[i++] = c;
    219 		if(c == '\n')
    220 			break;
    221 	}
    222 
    223 	if(i == 0)
    224 		return nil;
    225 	return buf;
    226 }