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