| /* te.c: error message control, input line count */ |
| # include "t.h" |
| |
| void |
| error(char *s) |
| { |
| fprint(2, "\n%s:%d: %s\n", ifile, iline, s); |
| fprint(2, "tbl quits\n"); |
| exits(s); |
| } |
| |
| |
| char * |
| gets1(char *s, int size) |
| { |
| char *p, *ns; |
| int nbl; |
| |
| iline++; |
| ns = s; |
| p = Brdline(tabin, '\n'); |
| while (p == 0) { |
| if (swapin() == 0) |
| return(0); |
| p = Brdline(tabin, '\n'); |
| } |
| nbl = Blinelen(tabin)-1; |
| if(nbl >= size) |
| error("input buffer too small"); |
| p[nbl] = 0; |
| strcpy(s, p); |
| s += nbl; |
| for (nbl = 0; *s == '\\' && s > ns; s--) |
| nbl++; |
| if (linstart && nbl % 2) /* fold escaped nl if in table */ |
| gets1(s + 1, size - (s-ns)); |
| |
| return(p); |
| } |
| |
| |
| # define BACKMAX 500 |
| char backup[BACKMAX]; |
| char *backp = backup; |
| |
| void |
| un1getc(int c) |
| { |
| if (c == '\n') |
| iline--; |
| *backp++ = c; |
| if (backp >= backup + BACKMAX) |
| error("too much backup"); |
| } |
| |
| |
| int |
| get1char(void) |
| { |
| int c; |
| if (backp > backup) |
| c = *--backp; |
| else |
| c = Bgetc(tabin); |
| if (c == 0) /* EOF */ { |
| if (swapin() == 0) |
| error("unexpected EOF"); |
| c = Bgetc(tabin); |
| } |
| if (c == '\n') |
| iline++; |
| return(c); |
| } |
| |
| |