root/usr/src/cmd/tbl/tb.c
/*
 * Copyright 1991 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*      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.
 */

 /* tb.c: check which entries exist, also storage allocation */
# include "t..c"
#include <stdlib.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(gettext("Too many characters in table"));
spvecs[spcount++]= pp = calloc(MAXCHS+MAXSTR,1);
if (pp == 0)
        error(gettext("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 == 0)
                error(gettext("no space for vectors"));
        }
tp=(int *)thisvec;
thisvec+=n;
for(q=tp; q<(int *)thisvec; q++)
        *q=0;
return(tp);
}

void
release(void)
{
extern char *exstore;
/* give back unwanted space in some vectors */
spcount=0;
tpcount= -1;
exstore=0;
}