ref: c3ba64f6935322f09b6de5c2285544fd471c605d
dir: /sys/src/cmd/tbl/tb.c/
/* 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; }