xref: /csrg-svn/old/tbl/t5.c (revision 14509)
1*14509Ssam #ifndef lint
2*14509Ssam static char sccsid[] = "@(#)t5.c	4.2 08/11/83";
3*14509Ssam #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 		{
2711032Sshannon 		leftover=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++;
4411032Sshannon 		instead[nlin]=fullbot[nlin]=0;
4511032Sshannon 		}
4611032Sshannon 	table[nlin] = alocv((ncol+2)*sizeof(table[0][0]));
4711032Sshannon 	if (cstore[1]==0)
4811032Sshannon 	switch(cstore[0])
4911032Sshannon 		{
5011032Sshannon 		case '_': fullbot[nlin]= '-'; continue;
5111032Sshannon 		case '=': fullbot[nlin]= '='; continue;
5211032Sshannon 		}
5311032Sshannon 	stynum[nlin] = nslin;
5411032Sshannon 	nslin = min(nslin+1, nclin-1);
5511032Sshannon 	for (icol = 0; icol <ncol; icol++)
5611032Sshannon 		{
5711032Sshannon 		table[nlin][icol].col = cstore;
5811032Sshannon 		table[nlin][icol].rcol=0;
5911032Sshannon 		ch=1;
6011032Sshannon 		if (match(cstore, "T{")) /* text follows */
6111032Sshannon 			table[nlin][icol].col =
6211032Sshannon 				gettext(cstore, nlin, icol,
6311032Sshannon 					font[stynum[nlin]][icol],
6411032Sshannon 					csize[stynum[nlin]][icol]);
6511032Sshannon 		else
6611032Sshannon 			{
6711032Sshannon 			for(; (ch= *cstore) != '\0' && ch != tab; cstore++)
6811032Sshannon 					;
6911032Sshannon 			*cstore++ = '\0';
7011032Sshannon 			switch(ctype(nlin,icol)) /* numerical or alpha, subcol */
7111032Sshannon 				{
7211032Sshannon 				case 'n':
7311032Sshannon 					table[nlin][icol].rcol = maknew(table[nlin][icol].col);
7411032Sshannon 					break;
7511032Sshannon 				case 'a':
7611032Sshannon 					table[nlin][icol].rcol = table[nlin][icol].col;
7711032Sshannon 					table[nlin][icol].col = "";
7811032Sshannon 					break;
7911032Sshannon 				}
8011032Sshannon 			}
8111032Sshannon 		while (ctype(nlin,icol+1)== 's') /* spanning */
8211032Sshannon 			table[nlin][++icol].col = "";
8311032Sshannon 		if (ch == '\0') break;
8411032Sshannon 		}
8511032Sshannon 	while (++icol <ncol+2)
8611032Sshannon 		{
8711032Sshannon 		table[nlin][icol].col = "";
8811032Sshannon 		table [nlin][icol].rcol=0;
8911032Sshannon 		}
9011032Sshannon 	while (*cstore != '\0')
9111032Sshannon 		 cstore++;
9211032Sshannon 	if (cstore-cspace > MAXCHS)
9311032Sshannon 		cstore = cspace = chspace();
9411032Sshannon 	}
9511032Sshannon last = cstore;
9611032Sshannon permute();
9711032Sshannon if (textflg) untext();
9811032Sshannon return;
9911032Sshannon }
10011032Sshannon nodata(il)
10111032Sshannon {
10211032Sshannon int c;
10311032Sshannon for (c=0; c<ncol;c++)
10411032Sshannon 	{
10511032Sshannon 	switch(ctype(il,c))
10611032Sshannon 		{
10711032Sshannon 		case 'c': case 'n': case 'r': case 'l': case 's': case 'a':
10811032Sshannon 			return(0);
10911032Sshannon 		}
11011032Sshannon 	}
11111032Sshannon return(1);
11211032Sshannon }
11311032Sshannon oneh(lin)
11411032Sshannon {
11511032Sshannon int k, icol;
11611032Sshannon k = ctype(lin,0);
11711032Sshannon for(icol=1; icol<ncol; icol++)
11811032Sshannon 	{
11911032Sshannon 	if (k != ctype(lin,icol))
12011032Sshannon 		return(0);
12111032Sshannon 	}
12211032Sshannon return(k);
12311032Sshannon }
12411032Sshannon # define SPAN "\\^"
12511032Sshannon permute()
12611032Sshannon {
12711032Sshannon int irow, jcol, is;
12811032Sshannon char *start, *strig;
12911032Sshannon for(jcol=0; jcol<ncol; jcol++)
13011032Sshannon 	{
13111032Sshannon 	for(irow=1; irow<nlin; irow++)
13211032Sshannon 		{
13311032Sshannon 		if (vspand(irow,jcol,0))
13411032Sshannon 			{
13511032Sshannon 			is = prev(irow);
13611032Sshannon 			if (is<0)
13711032Sshannon 				error("Vertical spanning in first row not allowed");
13811032Sshannon 			start = table[is][jcol].col;
13911032Sshannon 			strig = table[is][jcol].rcol;
14011032Sshannon 			while (irow<nlin &&vspand(irow,jcol,0))
14111032Sshannon 				irow++;
14211032Sshannon 			table[--irow][jcol].col = start;
14311032Sshannon 			table[irow][jcol].rcol = strig;
14411032Sshannon 			while (is<irow)
14511032Sshannon 				{
14611032Sshannon 				table[is][jcol].rcol =0;
14711032Sshannon 				table[is][jcol].col= SPAN;
14811032Sshannon 				is = next(is);
14911032Sshannon 				}
15011032Sshannon 			}
15111032Sshannon 		}
15211032Sshannon 	}
15311032Sshannon }
15411032Sshannon vspand(ir,ij,ifform)
15511032Sshannon {
15611032Sshannon if (ir<0) return(0);
15711032Sshannon if (ir>=nlin)return(0);
15811032Sshannon if (instead[ir]) return(0);
15911032Sshannon if (ifform==0 && ctype(ir,ij)=='^') return(1);
16011032Sshannon if (table[ir][ij].rcol!=0) return(0);
16111032Sshannon if (fullbot[ir]) return(0);
16211032Sshannon return(vspen(table[ir][ij].col));
16311032Sshannon }
16411032Sshannon vspen(s)
16511032Sshannon 	char *s;
16611032Sshannon {
16711032Sshannon if (s==0) return(0);
16811032Sshannon if (!point(s)) return(0);
16911032Sshannon return(match(s, SPAN));
17011032Sshannon }
171