xref: /csrg-svn/old/tbl/t5.c (revision 48316)
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