Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/* 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);
}