Blob


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