diff options
Diffstat (limited to 'src/cmd/tbl/tb.c')
-rw-r--r-- | src/cmd/tbl/tb.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/cmd/tbl/tb.c b/src/cmd/tbl/tb.c new file mode 100644 index 00000000..5cc59880 --- /dev/null +++ b/src/cmd/tbl/tb.c @@ -0,0 +1,101 @@ +/* tb.c: check which entries exist, also storage allocation */ +# include "t.h" + +void +checkuse(void) +{ + int i, c, k; + + for (c = 0; c < ncol; c++) { + used[c] = lused[c] = rused[c] = 0; + for (i = 0; i < nlin; i++) { + if (instead[i] || fullbot[i]) + continue; + k = ctype(i, c); + if (k == '-' || k == '=') + continue; + if ((k == 'n' || k == 'a')) { + rused[c] |= real(table[i][c].rcol); + if ( !real(table[i][c].rcol)) + used[c] |= real(table[i][c].col); + if (table[i][c].rcol) + lused[c] |= real(table[i][c].col); + } else + used[c] |= real(table[i][c].col); + } + } +} + + +int +real(char *s) +{ + if (s == 0) + return(0); + if (!point(s)) + return(1); + if (*s == 0) + return(0); + return(1); +} + + +int spcount = 0; +# define MAXVEC 20 +char *spvecs[MAXVEC]; + +char * +chspace(void) +{ + char *pp; + + if (spvecs[spcount]) + return(spvecs[spcount++]); + if (spcount >= MAXVEC) + error("Too many characters in table"); + spvecs[spcount++] = pp = calloc(MAXCHS + MAXLINLEN, 1); + if (pp == (char *) - 1 || pp == (char *)0) + error("no space for characters"); + return(pp); +} + + +# define MAXPC 50 +char *thisvec; +int tpcount = -1; +char *tpvecs[MAXPC]; + +int * +alocv(int n) +{ + int *tp, *q; + + if (tpcount < 0 || thisvec + n > tpvecs[tpcount] + MAXCHS) { + tpcount++; + if (tpvecs[tpcount] == 0) { + tpvecs[tpcount] = calloc(MAXCHS, 1); + } + thisvec = tpvecs[tpcount]; + if (thisvec == (char *)0) + error("no space for vectors"); + } + tp = (int *)thisvec; + thisvec += n; + for (q = tp; q < (int *)thisvec; q++) + *q = 0; + return(tp); +} + + +void +release(void) +{ + /* give back unwanted space in some vectors */ + /* this should call free; it does not because + alloc() is so buggy */ + spcount = 0; + tpcount = -1; + exstore = 0; +} + + |