]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/tbl/te.c
9bootfat: rename open() to fileinit and make it static as its really a internal funct...
[plan9front.git] / sys / src / cmd / tbl / te.c
1 /* te.c: error message control, input line count */
2 # include "t.h"
3
4 void
5 error(char *s)
6 {
7         fprint(2, "\n%s:%d: %s\n", ifile, iline, s);
8         fprint(2, "tbl quits\n");
9         exits(s);
10 }
11
12
13 char    *
14 gets1(char *s, int size)
15 {
16         char    *p, *ns;
17         int     nbl;
18
19         iline++;
20         ns = s;
21         p = Brdline(tabin, '\n');
22         while (p == 0) {
23                 if (swapin() == 0)
24                         return(0);
25                 p = Brdline(tabin, '\n');
26         }
27         nbl = Blinelen(tabin)-1;
28         if(nbl >= size)
29                 error("input buffer too small");
30         p[nbl] = 0;
31         strcpy(s, p);
32         s += nbl;
33         for (nbl = 0; *s == '\\' && s > ns; s--)
34                 nbl++;
35         if (linstart && nbl % 2) /* fold escaped nl if in table */
36                 gets1(s + 1, size - (s-ns));
37
38         return(p);
39 }
40
41
42 # define BACKMAX 500
43 char    backup[BACKMAX];
44 char    *backp = backup;
45
46 void
47 un1getc(int c)
48 {
49         if (c == '\n')
50                 iline--;
51         *backp++ = c;
52         if (backp >= backup + BACKMAX)
53                 error("too much backup");
54 }
55
56
57 int
58 get1char(void)
59 {
60         int     c;
61         if (backp > backup)
62                 c = *--backp;
63         else
64                 c = Bgetc(tabin);
65         if (c == 0) /* EOF */ {
66                 if (swapin() == 0)
67                         error("unexpected EOF");
68                 c = Bgetc(tabin);
69         }
70         if (c == '\n')
71                 iline++;
72         return(c);
73 }
74
75