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