xref: /csrg-svn/old/tbl/t5.c (revision 11032)
1*11032Sshannon /*	t5.c	4.1	83/02/12	*/
2*11032Sshannon 
3*11032Sshannon  /* t5.c: read data for table */
4*11032Sshannon # include "t..c"
5*11032Sshannon gettbl()
6*11032Sshannon {
7*11032Sshannon int icol, ch;
8*11032Sshannon cstore=cspace= chspace();
9*11032Sshannon textflg=0;
10*11032Sshannon for (nlin=nslin=0; gets1(cstore); nlin++)
11*11032Sshannon 	{
12*11032Sshannon 	stynum[nlin]=nslin;
13*11032Sshannon 	if (prefix(".TE", cstore))
14*11032Sshannon 		{
15*11032Sshannon 		leftover=0;
16*11032Sshannon 		break;
17*11032Sshannon 		}
18*11032Sshannon 	if (prefix(".TC", cstore) || prefix(".T&", cstore))
19*11032Sshannon 		{
20*11032Sshannon 		readspec();
21*11032Sshannon 		nslin++;
22*11032Sshannon 		}
23*11032Sshannon 	if (nlin>=MAXLIN)
24*11032Sshannon 		{
25*11032Sshannon 		leftover=cstore;
26*11032Sshannon 		break;
27*11032Sshannon 		}
28*11032Sshannon 	fullbot[nlin]=0;
29*11032Sshannon 	if (cstore[0] == '.' && !isdigit(cstore[1]))
30*11032Sshannon 		{
31*11032Sshannon 		instead[nlin] = cstore;
32*11032Sshannon 		while (*cstore++);
33*11032Sshannon 		continue;
34*11032Sshannon 		}
35*11032Sshannon 	else instead[nlin] = 0;
36*11032Sshannon 	if (nodata(nlin))
37*11032Sshannon 		{
38*11032Sshannon 		if (ch = oneh(nlin))
39*11032Sshannon 			fullbot[nlin]= ch;
40*11032Sshannon 		nlin++;
41*11032Sshannon 		nslin++;
42*11032Sshannon 		instead[nlin]=fullbot[nlin]=0;
43*11032Sshannon 		}
44*11032Sshannon 	table[nlin] = alocv((ncol+2)*sizeof(table[0][0]));
45*11032Sshannon 	if (cstore[1]==0)
46*11032Sshannon 	switch(cstore[0])
47*11032Sshannon 		{
48*11032Sshannon 		case '_': fullbot[nlin]= '-'; continue;
49*11032Sshannon 		case '=': fullbot[nlin]= '='; continue;
50*11032Sshannon 		}
51*11032Sshannon 	stynum[nlin] = nslin;
52*11032Sshannon 	nslin = min(nslin+1, nclin-1);
53*11032Sshannon 	for (icol = 0; icol <ncol; icol++)
54*11032Sshannon 		{
55*11032Sshannon 		table[nlin][icol].col = cstore;
56*11032Sshannon 		table[nlin][icol].rcol=0;
57*11032Sshannon 		ch=1;
58*11032Sshannon 		if (match(cstore, "T{")) /* text follows */
59*11032Sshannon 			table[nlin][icol].col =
60*11032Sshannon 				gettext(cstore, nlin, icol,
61*11032Sshannon 					font[stynum[nlin]][icol],
62*11032Sshannon 					csize[stynum[nlin]][icol]);
63*11032Sshannon 		else
64*11032Sshannon 			{
65*11032Sshannon 			for(; (ch= *cstore) != '\0' && ch != tab; cstore++)
66*11032Sshannon 					;
67*11032Sshannon 			*cstore++ = '\0';
68*11032Sshannon 			switch(ctype(nlin,icol)) /* numerical or alpha, subcol */
69*11032Sshannon 				{
70*11032Sshannon 				case 'n':
71*11032Sshannon 					table[nlin][icol].rcol = maknew(table[nlin][icol].col);
72*11032Sshannon 					break;
73*11032Sshannon 				case 'a':
74*11032Sshannon 					table[nlin][icol].rcol = table[nlin][icol].col;
75*11032Sshannon 					table[nlin][icol].col = "";
76*11032Sshannon 					break;
77*11032Sshannon 				}
78*11032Sshannon 			}
79*11032Sshannon 		while (ctype(nlin,icol+1)== 's') /* spanning */
80*11032Sshannon 			table[nlin][++icol].col = "";
81*11032Sshannon 		if (ch == '\0') break;
82*11032Sshannon 		}
83*11032Sshannon 	while (++icol <ncol+2)
84*11032Sshannon 		{
85*11032Sshannon 		table[nlin][icol].col = "";
86*11032Sshannon 		table [nlin][icol].rcol=0;
87*11032Sshannon 		}
88*11032Sshannon 	while (*cstore != '\0')
89*11032Sshannon 		 cstore++;
90*11032Sshannon 	if (cstore-cspace > MAXCHS)
91*11032Sshannon 		cstore = cspace = chspace();
92*11032Sshannon 	}
93*11032Sshannon last = cstore;
94*11032Sshannon permute();
95*11032Sshannon if (textflg) untext();
96*11032Sshannon return;
97*11032Sshannon }
98*11032Sshannon nodata(il)
99*11032Sshannon {
100*11032Sshannon int c;
101*11032Sshannon for (c=0; c<ncol;c++)
102*11032Sshannon 	{
103*11032Sshannon 	switch(ctype(il,c))
104*11032Sshannon 		{
105*11032Sshannon 		case 'c': case 'n': case 'r': case 'l': case 's': case 'a':
106*11032Sshannon 			return(0);
107*11032Sshannon 		}
108*11032Sshannon 	}
109*11032Sshannon return(1);
110*11032Sshannon }
111*11032Sshannon oneh(lin)
112*11032Sshannon {
113*11032Sshannon int k, icol;
114*11032Sshannon k = ctype(lin,0);
115*11032Sshannon for(icol=1; icol<ncol; icol++)
116*11032Sshannon 	{
117*11032Sshannon 	if (k != ctype(lin,icol))
118*11032Sshannon 		return(0);
119*11032Sshannon 	}
120*11032Sshannon return(k);
121*11032Sshannon }
122*11032Sshannon # define SPAN "\\^"
123*11032Sshannon permute()
124*11032Sshannon {
125*11032Sshannon int irow, jcol, is;
126*11032Sshannon char *start, *strig;
127*11032Sshannon for(jcol=0; jcol<ncol; jcol++)
128*11032Sshannon 	{
129*11032Sshannon 	for(irow=1; irow<nlin; irow++)
130*11032Sshannon 		{
131*11032Sshannon 		if (vspand(irow,jcol,0))
132*11032Sshannon 			{
133*11032Sshannon 			is = prev(irow);
134*11032Sshannon 			if (is<0)
135*11032Sshannon 				error("Vertical spanning in first row not allowed");
136*11032Sshannon 			start = table[is][jcol].col;
137*11032Sshannon 			strig = table[is][jcol].rcol;
138*11032Sshannon 			while (irow<nlin &&vspand(irow,jcol,0))
139*11032Sshannon 				irow++;
140*11032Sshannon 			table[--irow][jcol].col = start;
141*11032Sshannon 			table[irow][jcol].rcol = strig;
142*11032Sshannon 			while (is<irow)
143*11032Sshannon 				{
144*11032Sshannon 				table[is][jcol].rcol =0;
145*11032Sshannon 				table[is][jcol].col= SPAN;
146*11032Sshannon 				is = next(is);
147*11032Sshannon 				}
148*11032Sshannon 			}
149*11032Sshannon 		}
150*11032Sshannon 	}
151*11032Sshannon }
152*11032Sshannon vspand(ir,ij,ifform)
153*11032Sshannon {
154*11032Sshannon if (ir<0) return(0);
155*11032Sshannon if (ir>=nlin)return(0);
156*11032Sshannon if (instead[ir]) return(0);
157*11032Sshannon if (ifform==0 && ctype(ir,ij)=='^') return(1);
158*11032Sshannon if (table[ir][ij].rcol!=0) return(0);
159*11032Sshannon if (fullbot[ir]) return(0);
160*11032Sshannon return(vspen(table[ir][ij].col));
161*11032Sshannon }
162*11032Sshannon vspen(s)
163*11032Sshannon 	char *s;
164*11032Sshannon {
165*11032Sshannon if (s==0) return(0);
166*11032Sshannon if (!point(s)) return(0);
167*11032Sshannon return(match(s, SPAN));
168*11032Sshannon }
169