xref: /plan9/sys/src/cmd/tbl/te.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
13e12c5d1SDavid du Colombier /* te.c: error message control, input line count */
23e12c5d1SDavid du Colombier # include "t.h"
33e12c5d1SDavid du Colombier 
43e12c5d1SDavid du Colombier void
error(char * s)53e12c5d1SDavid du Colombier error(char *s)
63e12c5d1SDavid du Colombier {
7*7dd7cddfSDavid du Colombier 	fprint(2, "\n%s:%d: %s\n", ifile, iline, s);
8219b2ee8SDavid du Colombier 	fprint(2, "tbl quits\n");
93e12c5d1SDavid du Colombier 	exits(s);
103e12c5d1SDavid du Colombier }
113e12c5d1SDavid du Colombier 
123e12c5d1SDavid du Colombier 
133e12c5d1SDavid du Colombier char	*
gets1(char * s,int size)143e12c5d1SDavid du Colombier gets1(char *s, int size)
153e12c5d1SDavid du Colombier {
163e12c5d1SDavid du Colombier 	char	*p, *ns;
173e12c5d1SDavid du Colombier 	int	nbl;
183e12c5d1SDavid du Colombier 
193e12c5d1SDavid du Colombier 	iline++;
203e12c5d1SDavid du Colombier 	ns = s;
21219b2ee8SDavid du Colombier 	p = Brdline(tabin, '\n');
223e12c5d1SDavid du Colombier 	while (p == 0) {
233e12c5d1SDavid du Colombier 		if (swapin() == 0)
243e12c5d1SDavid du Colombier 			return(0);
25219b2ee8SDavid du Colombier 		p = Brdline(tabin, '\n');
263e12c5d1SDavid du Colombier 	}
27219b2ee8SDavid du Colombier 	nbl = Blinelen(tabin)-1;
28219b2ee8SDavid du Colombier 	if(nbl >= size)
29219b2ee8SDavid du Colombier 		error("input buffer too small");
30219b2ee8SDavid du Colombier 	p[nbl] = 0;
31219b2ee8SDavid du Colombier 	strcpy(s, p);
32219b2ee8SDavid du Colombier 	s += nbl;
33219b2ee8SDavid du Colombier 	for (nbl = 0; *s == '\\' && s > ns; s--)
343e12c5d1SDavid du Colombier 		nbl++;
353e12c5d1SDavid du Colombier 	if (linstart && nbl % 2) /* fold escaped nl if in table */
363e12c5d1SDavid du Colombier 		gets1(s + 1, size - (s-ns));
373e12c5d1SDavid du Colombier 
383e12c5d1SDavid du Colombier 	return(p);
393e12c5d1SDavid du Colombier }
403e12c5d1SDavid du Colombier 
413e12c5d1SDavid du Colombier 
423e12c5d1SDavid du Colombier # define BACKMAX 500
433e12c5d1SDavid du Colombier char	backup[BACKMAX];
443e12c5d1SDavid du Colombier char	*backp = backup;
453e12c5d1SDavid du Colombier 
463e12c5d1SDavid du Colombier void
un1getc(int c)473e12c5d1SDavid du Colombier un1getc(int c)
483e12c5d1SDavid du Colombier {
493e12c5d1SDavid du Colombier 	if (c == '\n')
503e12c5d1SDavid du Colombier 		iline--;
513e12c5d1SDavid du Colombier 	*backp++ = c;
523e12c5d1SDavid du Colombier 	if (backp >= backup + BACKMAX)
533e12c5d1SDavid du Colombier 		error("too much backup");
543e12c5d1SDavid du Colombier }
553e12c5d1SDavid du Colombier 
563e12c5d1SDavid du Colombier 
573e12c5d1SDavid du Colombier int
get1char(void)583e12c5d1SDavid du Colombier get1char(void)
593e12c5d1SDavid du Colombier {
603e12c5d1SDavid du Colombier 	int	c;
613e12c5d1SDavid du Colombier 	if (backp > backup)
623e12c5d1SDavid du Colombier 		c = *--backp;
633e12c5d1SDavid du Colombier 	else
64219b2ee8SDavid du Colombier 		c = Bgetc(tabin);
65219b2ee8SDavid du Colombier 	if (c == 0) /* EOF */ {
663e12c5d1SDavid du Colombier 		if (swapin() == 0)
673e12c5d1SDavid du Colombier 			error("unexpected EOF");
68219b2ee8SDavid du Colombier 		c = Bgetc(tabin);
693e12c5d1SDavid du Colombier 	}
703e12c5d1SDavid du Colombier 	if (c == '\n')
713e12c5d1SDavid du Colombier 		iline++;
723e12c5d1SDavid du Colombier 	return(c);
733e12c5d1SDavid du Colombier }
743e12c5d1SDavid du Colombier 
753e12c5d1SDavid du Colombier 
76