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