aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/tbl/tb.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/tbl/tb.c')
-rw-r--r--src/cmd/tbl/tb.c101
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;
+}
+
+