/*
* Copyright 2003 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.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
/* t5.c: read data for table */
# include "t..c"
void permute(void);
void
gettbl(void)
{
int icol, ch;
cstore=cspace= chspace();
textflg=0;
for (nlin=nslin=0; gets1(cstore, MAXSTR); nlin++)
{
stynum[nlin]=nslin;
if (prefix(".TE", cstore))
{
leftover=0;
break;
}
if (prefix(".TC", cstore) || prefix(".T&", cstore))
{
readspec();
nslin++;
}
if (nlin>=MAXLIN)
{
leftover=cstore;
break;
}
fullbot[nlin]=0;
if (cstore[0] == '.' && !isdigit((unsigned char)cstore[1]))
{
instead[nlin] = cstore;
while (*cstore++);
continue;
}
else instead[nlin] = 0;
if (nodata(nlin))
{
if (ch = oneh(nlin))
fullbot[nlin]= ch;
nlin++;
nslin++;
instead[nlin]=(char *)0;
fullbot[nlin]=0;
}
table[nlin] = (struct colstr *) alocv((ncol+2)*sizeof(table[0][0]));
if (cstore[1]==0)
switch(cstore[0])
{
case '_': fullbot[nlin]= '-'; continue;
case '=': fullbot[nlin]= '='; continue;
}
stynum[nlin] = nslin;
nslin = min(nslin+1, nclin-1);
for (icol = 0; icol <ncol; icol++)
{
table[nlin][icol].col = cstore;
table[nlin][icol].rcol=0;
ch=1;
if (match(cstore, "T{")) /* text follows */
/* get_text was originally gettext and was renamed */
table[nlin][icol].col =
(char *)get_text(cstore, nlin, icol,
font[stynum[nlin]][icol],
csize[stynum[nlin]][icol]);
else
{
for(; (ch= *cstore) != '\0' && ch != tab; cstore++)
;
*cstore++ = '\0';
switch(ctype(nlin,icol)) /* numerical or alpha, subcol */
{
case 'n':
table[nlin][icol].rcol =
(char *)maknew(table[nlin][icol].col);
break;
case 'a':
table[nlin][icol].rcol = table[nlin][icol].col;
table[nlin][icol].col = "";
break;
}
}
while (ctype(nlin,icol+1)== 's') /* spanning */
table[nlin][++icol].col = "";
if (ch == '\0') break;
}
while (++icol <ncol+2)
{
table[nlin][icol].col = "";
table [nlin][icol].rcol=0;
}
while (*cstore != '\0')
cstore++;
if (cstore-cspace > MAXCHS)
cstore = cspace = chspace();
}
last = cstore;
permute();
if (textflg) untext();
return;
}
int
nodata(int il)
{
int c;
for (c=0; c<ncol;c++)
{
switch(ctype(il,c))
{
case 'c': case 'n': case 'r': case 'l': case 's': case 'a':
return(0);
}
}
return(1);
}
int
oneh(int lin)
{
int k, icol;
k = ctype(lin,0);
for(icol=1; icol<ncol; icol++)
{
if (k != ctype(lin,icol))
return(0);
}
return(k);
}
# define SPAN "\\^"
void
permute(void)
{
int irow, jcol, is;
char *start, *strig;
for(jcol=0; jcol<ncol; jcol++)
{
for(irow=1; irow<nlin; irow++)
{
if (vspand(irow,jcol,0))
{
is = prev(irow);
if (is<0)
error(gettext("Vertical spanning in first row not allowed"));
start = table[is][jcol].col;
strig = table[is][jcol].rcol;
while (irow<nlin &&vspand(irow,jcol,0))
irow++;
table[--irow][jcol].col = start;
table[irow][jcol].rcol = strig;
while (is<irow)
{
table[is][jcol].rcol =0;
table[is][jcol].col= SPAN;
is = next(is);
}
}
}
}
}
int
vspand(int ir, int ij, int ifform)
{
if (ir<0) return(0);
if (ir>=nlin)return(0);
if (instead[ir]) return(0);
if (ifform==0 && ctype(ir,ij)=='^') return(1);
if (table[ir]==0) return(0);
if (table[ir][ij].rcol!=0) return(0);
if (fullbot[ir]) return(0);
return(vspen(table[ir][ij].col));
}
int
vspen(char *s)
{
if (s==0) return(0);
if (!point(s)) return(0);
return(match(s, SPAN));
}