ref: 5d202d345616907d511b46e395226958fe66a2c3
dir: /sys/src/cmd/tbl/te.c/
/* 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); }