1*48316Sbostic /*-
2*48316Sbostic * %sccs.include.proprietary.c%
3*48316Sbostic */
4*48316Sbostic
514509Ssam #ifndef lint
6*48316Sbostic static char sccsid[] = "@(#)t5.c 4.4 (Berkeley) 04/18/91";
7*48316Sbostic #endif /* not lint */
811032Sshannon
911032Sshannon /* t5.c: read data for table */
1011032Sshannon # include "t..c"
gettbl()1111032Sshannon gettbl()
1211032Sshannon {
1311032Sshannon int icol, ch;
1411032Sshannon cstore=cspace= chspace();
1511032Sshannon textflg=0;
1611032Sshannon for (nlin=nslin=0; gets1(cstore); nlin++)
1711032Sshannon {
1811032Sshannon stynum[nlin]=nslin;
1911032Sshannon if (prefix(".TE", cstore))
2011032Sshannon {
2111032Sshannon leftover=0;
2211032Sshannon break;
2311032Sshannon }
2411032Sshannon if (prefix(".TC", cstore) || prefix(".T&", cstore))
2511032Sshannon {
2611032Sshannon readspec();
2711032Sshannon nslin++;
2811032Sshannon }
2911032Sshannon if (nlin>=MAXLIN)
3011032Sshannon {
3124737Sbloom leftover=(int)cstore;
3211032Sshannon break;
3311032Sshannon }
3411032Sshannon fullbot[nlin]=0;
3511032Sshannon if (cstore[0] == '.' && !isdigit(cstore[1]))
3611032Sshannon {
3711032Sshannon instead[nlin] = cstore;
3811032Sshannon while (*cstore++);
3911032Sshannon continue;
4011032Sshannon }
4111032Sshannon else instead[nlin] = 0;
4211032Sshannon if (nodata(nlin))
4311032Sshannon {
4411032Sshannon if (ch = oneh(nlin))
4511032Sshannon fullbot[nlin]= ch;
4611032Sshannon nlin++;
4711032Sshannon nslin++;
4824737Sbloom instead[nlin]=(char *)0;
4924737Sbloom fullbot[nlin]=0;
5011032Sshannon }
5124737Sbloom table[nlin] = (struct colstr *)alocv((ncol+2)*sizeof(table[0][0]));
5211032Sshannon if (cstore[1]==0)
5311032Sshannon switch(cstore[0])
5411032Sshannon {
5511032Sshannon case '_': fullbot[nlin]= '-'; continue;
5611032Sshannon case '=': fullbot[nlin]= '='; continue;
5711032Sshannon }
5811032Sshannon stynum[nlin] = nslin;
5911032Sshannon nslin = min(nslin+1, nclin-1);
6011032Sshannon for (icol = 0; icol <ncol; icol++)
6111032Sshannon {
6211032Sshannon table[nlin][icol].col = cstore;
6311032Sshannon table[nlin][icol].rcol=0;
6411032Sshannon ch=1;
6511032Sshannon if (match(cstore, "T{")) /* text follows */
6611032Sshannon table[nlin][icol].col =
6724737Sbloom (char *)gettext(cstore, nlin, icol,
6811032Sshannon font[stynum[nlin]][icol],
6911032Sshannon csize[stynum[nlin]][icol]);
7011032Sshannon else
7111032Sshannon {
7211032Sshannon for(; (ch= *cstore) != '\0' && ch != tab; cstore++)
7311032Sshannon ;
7411032Sshannon *cstore++ = '\0';
7511032Sshannon switch(ctype(nlin,icol)) /* numerical or alpha, subcol */
7611032Sshannon {
7711032Sshannon case 'n':
7824737Sbloom table[nlin][icol].rcol =
7924737Sbloom (char *)maknew(table[nlin][icol].col);
8011032Sshannon break;
8111032Sshannon case 'a':
8211032Sshannon table[nlin][icol].rcol = table[nlin][icol].col;
8311032Sshannon table[nlin][icol].col = "";
8411032Sshannon break;
8511032Sshannon }
8611032Sshannon }
8711032Sshannon while (ctype(nlin,icol+1)== 's') /* spanning */
8811032Sshannon table[nlin][++icol].col = "";
8911032Sshannon if (ch == '\0') break;
9011032Sshannon }
9111032Sshannon while (++icol <ncol+2)
9211032Sshannon {
9311032Sshannon table[nlin][icol].col = "";
9411032Sshannon table [nlin][icol].rcol=0;
9511032Sshannon }
9611032Sshannon while (*cstore != '\0')
9711032Sshannon cstore++;
9811032Sshannon if (cstore-cspace > MAXCHS)
9911032Sshannon cstore = cspace = chspace();
10011032Sshannon }
10111032Sshannon last = cstore;
10211032Sshannon permute();
10311032Sshannon if (textflg) untext();
10411032Sshannon return;
10511032Sshannon }
nodata(il)10611032Sshannon nodata(il)
10711032Sshannon {
10811032Sshannon int c;
10911032Sshannon for (c=0; c<ncol;c++)
11011032Sshannon {
11111032Sshannon switch(ctype(il,c))
11211032Sshannon {
11311032Sshannon case 'c': case 'n': case 'r': case 'l': case 's': case 'a':
11411032Sshannon return(0);
11511032Sshannon }
11611032Sshannon }
11711032Sshannon return(1);
11811032Sshannon }
oneh(lin)11911032Sshannon oneh(lin)
12011032Sshannon {
12111032Sshannon int k, icol;
12211032Sshannon k = ctype(lin,0);
12311032Sshannon for(icol=1; icol<ncol; icol++)
12411032Sshannon {
12511032Sshannon if (k != ctype(lin,icol))
12611032Sshannon return(0);
12711032Sshannon }
12811032Sshannon return(k);
12911032Sshannon }
13011032Sshannon # define SPAN "\\^"
permute()13111032Sshannon permute()
13211032Sshannon {
13311032Sshannon int irow, jcol, is;
13411032Sshannon char *start, *strig;
13511032Sshannon for(jcol=0; jcol<ncol; jcol++)
13611032Sshannon {
13711032Sshannon for(irow=1; irow<nlin; irow++)
13811032Sshannon {
13911032Sshannon if (vspand(irow,jcol,0))
14011032Sshannon {
14111032Sshannon is = prev(irow);
14211032Sshannon if (is<0)
14311032Sshannon error("Vertical spanning in first row not allowed");
14411032Sshannon start = table[is][jcol].col;
14511032Sshannon strig = table[is][jcol].rcol;
14611032Sshannon while (irow<nlin &&vspand(irow,jcol,0))
14711032Sshannon irow++;
14811032Sshannon table[--irow][jcol].col = start;
14911032Sshannon table[irow][jcol].rcol = strig;
15011032Sshannon while (is<irow)
15111032Sshannon {
15211032Sshannon table[is][jcol].rcol =0;
15311032Sshannon table[is][jcol].col= SPAN;
15411032Sshannon is = next(is);
15511032Sshannon }
15611032Sshannon }
15711032Sshannon }
15811032Sshannon }
15911032Sshannon }
vspand(ir,ij,ifform)16011032Sshannon vspand(ir,ij,ifform)
16111032Sshannon {
16211032Sshannon if (ir<0) return(0);
16311032Sshannon if (ir>=nlin)return(0);
16411032Sshannon if (instead[ir]) return(0);
16511032Sshannon if (ifform==0 && ctype(ir,ij)=='^') return(1);
16611032Sshannon if (table[ir][ij].rcol!=0) return(0);
16711032Sshannon if (fullbot[ir]) return(0);
16811032Sshannon return(vspen(table[ir][ij].col));
16911032Sshannon }
vspen(s)17011032Sshannon vspen(s)
17111032Sshannon char *s;
17211032Sshannon {
17311032Sshannon if (s==0) return(0);
17411032Sshannon if (!point(s)) return(0);
17511032Sshannon return(match(s, SPAN));
17611032Sshannon }
177