diff options
Diffstat (limited to 'src/cmd/tbl/te.c')
-rw-r--r-- | src/cmd/tbl/te.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/cmd/tbl/te.c b/src/cmd/tbl/te.c new file mode 100644 index 00000000..3df8d445 --- /dev/null +++ b/src/cmd/tbl/te.c @@ -0,0 +1,75 @@ +/* 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); +} + + |