Blame


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