125066Sjaap #ifndef lint
2*64045Sbostic static char sccsid[] = "@(#)io.c	1.5 (Berkeley) 07/27/93";
325066Sjaap #endif lint
425066Sjaap 
525066Sjaap 
625088Sjaap /*
725088Sjaap  * error message control
825088Sjaap  * input
925088Sjaap  * line count
1025088Sjaap  */
1125066Sjaap 
1225066Sjaap #include "defs.h"
1325066Sjaap #include "ext.h"
1425066Sjaap 
error(s)1525066Sjaap error(s)
1625066Sjaap char   *s;
1725066Sjaap {
1825066Sjaap 	fprintf(stderr, "\n%s: line %d: %s\n", ifile, iline, s);
1925066Sjaap 	fprintf(stderr, "tbl quits\n");
2025066Sjaap 	exit(1);
2125066Sjaap }
2225066Sjaap 
2325066Sjaap /*
2425066Sjaap  * get a line from the input
2525066Sjaap  */
2625066Sjaap char *
gets1(s)2725066Sjaap gets1(s)
2825066Sjaap char   *s;
2925066Sjaap {
3025066Sjaap 	char   *p;
3125066Sjaap 	register int     nbl = 0;
3225066Sjaap 
3325066Sjaap next:
3425066Sjaap 	iline++;
3525066Sjaap 	p = fgets(s, BUFSIZ, tabin);
3625066Sjaap 	/*
3725066Sjaap 	 * Undocumented feature: tables can be arbitrarily split in
3825066Sjaap 	 * various files
3925066Sjaap 	 */
4025066Sjaap 	while(p == NULL){
4125066Sjaap 		if(swapin() == 0)
4225066Sjaap 			return(0);
4325066Sjaap 		p = fgets(s, BUFSIZ, tabin);
4425066Sjaap 	}
4525066Sjaap 
4625066Sjaap 	/*
4725066Sjaap 	 * Clumsy support for .lf request (jna)
4825066Sjaap 	 */
4925066Sjaap 	if(p[0] == '.' && p[1] == 'l' && p[2] == 'f'){
5029991Sjaap 		sscanf(p+3, "%d %s", &iline, oldname);
5129991Sjaap 		printf(".lf %d %s\n", iline, strlen(oldname) ? oldname: ifile);
5225066Sjaap 		goto next;
5325066Sjaap 	}
5425066Sjaap 
5525066Sjaap 	while(*s)
5625066Sjaap 
5725066Sjaap 		s++;
5825066Sjaap 	s--;
5925066Sjaap 
6025066Sjaap 	/*
6125066Sjaap 	 * remove \n fom input
6225066Sjaap 	 */
6325066Sjaap 	if(*s == '\n')
6425066Sjaap 		*s-- = 0;
6525066Sjaap 
6625066Sjaap 	/*
6725066Sjaap 	 * is last character a \ ?
6825066Sjaap 	 */
6925066Sjaap 	for(nbl = 0; *s == '\\' && s > p; s--)
7025066Sjaap 		nbl++;
7125066Sjaap 
7225066Sjaap 	/*
7325066Sjaap 	 * Then fold escaped nl if in table
7425066Sjaap 	 */
7525066Sjaap 	if(linstart && nbl % 2)
7625066Sjaap 		(void) gets1(s + 1);
7725066Sjaap 	return(p);
7825066Sjaap }
7925066Sjaap 
80*64045Sbostic #define BACKMAX 2048
8125066Sjaap static char    backup[BACKMAX];
8225066Sjaap static char   *backp = backup;
8325066Sjaap 
un1getc(c)8425066Sjaap un1getc(c){
8525066Sjaap 	if(c == '\n')
8625066Sjaap 		iline--;
8725066Sjaap 	*backp++ = c;
8825066Sjaap 	if(backp >= backup + BACKMAX)
8925066Sjaap 		error("too much backup");
9025066Sjaap }
9125066Sjaap 
get1char()9225066Sjaap get1char(){
9325066Sjaap 	register int     c;
9425066Sjaap 	if(backp > backup)
9525066Sjaap 		c = *--backp;
9625066Sjaap 	else
9725066Sjaap 		c = getc(tabin);
9825066Sjaap 	if(c == EOF){
9925066Sjaap 		if(swapin() == 0)
10025066Sjaap 			error("unexpected EOF");
10125066Sjaap 		c = getc(tabin);
10225066Sjaap 	}
10325066Sjaap 	if(c == '\n')
10425066Sjaap 		iline++;
10525066Sjaap 	return(c);
10625066Sjaap }
10725066Sjaap 
backrest(cp)10825066Sjaap backrest(cp)
10925066Sjaap char *cp;
11025066Sjaap {
11125066Sjaap 	register char *s;
11225066Sjaap 	for(s=cp; *s; s++)
11325066Sjaap 		;
11425066Sjaap 	un1getc('\n');
11525066Sjaap 	while (s>cp)
11625066Sjaap 		un1getc(*--s);
11725066Sjaap }
118