diff options
Diffstat (limited to 'tbl/te.c')
-rw-r--r-- | tbl/te.c | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/tbl/te.c b/tbl/te.c new file mode 100644 index 0000000000000..061aa2df3b346 --- /dev/null +++ b/tbl/te.c @@ -0,0 +1,122 @@ +/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ +/* All Rights Reserved */ + + +/* + * Copyright (c) 1980 Regents of the University of California. + * All rights reserved. The Berkeley software License Agreement + * specifies the terms and conditions for redistribution. + */ + +/* + * Copyright 1983-1988,2003 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* from OpenSolaris "te.c 1.6 05/06/02 SMI" */ + +/* + * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany + * + * Sccsid @(#)te.c 1.13 (gritter) 8/6/06 + */ + + /* te.c: error message control, input line count */ +# include "t..c" +# include <errno.h> +# include <string.h> +# include <stdlib.h> + +int +error(char *s) { + fprintf(stderr, "\n%s: line %d: %s\n", ifile, iline, s); + fprintf(stderr, "%s quits\n", progname); + return -1; +} + +char * +errmsg(int errnum) +{ + return (strerror(errnum)); +} +char * +gets1(char **bp, char **sp, size_t *zp) +{ +char *s, *p = 0; +int c, n = 0; +int nbl; +for (;;) + { + iline++; + for (;;) + { + if (n + MAXCHS >= *zp) + { + int oz = *zp; + *zp = n + MAXCHS + 128; + if ((p = realloc(*bp, *zp))==NULL) + error("Line too long"); + updspace(*bp, p, oz); + *sp += p - *bp; + *bp = p; + } + if ((c = getc(tabin))==EOF) + { + if (ferror(tabin)) + error(errmsg(errno)); + if (swapin()==0) + return(0); + iline++; + continue; + } + if (c=='\n') + { + p = *sp; + s = n ? &(*sp)[n-1] : *sp; + (*sp)[n] = '\0'; + break; + } + (*sp)[n++] = c; + } + for(nbl=0; *s == '\\' && s>p; s--) + nbl++; + if (linstart && nbl % 2) /* fold escaped nl if in table */ + { + n--; + continue; + } + break; + } + +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=getc(tabin); +if (c== EOF) /* EOF */ + { + if (swapin() ==0) + error("unexpected EOF"); + c = getc(tabin); + } +if (c== '\n') + iline++; +return(c); +} |