Commit | Line | Data |
---|---|---|
476fcd16 | 1 | #ifndef lint |
eb15f2fa | 2 | static char sccsid[] = "@(#)t4.c 4.3 %G%"; |
476fcd16 | 3 | #endif |
dfef12f4 BS |
4 | |
5 | /* t4.c: read table specification */ | |
6 | # include "t..c" | |
7 | int oncol; | |
8 | getspec() | |
9 | { | |
10 | int icol, i; | |
11 | for(icol=0; icol<MAXCOL; icol++) | |
12 | { | |
13 | sep[icol]= -1; | |
14 | evenup[icol]=0; | |
15 | cll[icol][0]=0; | |
16 | for(i=0; i<MAXHEAD; i++) | |
17 | { | |
18 | csize[i][icol][0]=0; | |
19 | vsize[i][icol][0]=0; | |
20 | font[i][icol][0] = lefline[i][icol] = 0; | |
21 | ctop[i][icol]=0; | |
22 | style[i][icol]= 'l'; | |
23 | } | |
24 | } | |
25 | nclin=ncol=0; | |
26 | oncol =0; | |
27 | left1flg=rightl=0; | |
28 | readspec(); | |
29 | fprintf(tabout, ".rm"); | |
30 | for(i=0; i<ncol; i++) | |
31 | fprintf(tabout, " %02d", 80+i); | |
32 | fprintf(tabout, "\n"); | |
33 | } | |
34 | readspec() | |
35 | { | |
36 | int icol, c, sawchar, stopc, i; | |
37 | char sn[10], *snp, *temp; | |
38 | sawchar=icol=0; | |
39 | while (c=get1char()) | |
40 | { | |
41 | switch(c) | |
42 | { | |
43 | default: | |
44 | if (c != tab) | |
45 | error("bad table specification character"); | |
46 | case ' ': /* note this is also case tab */ | |
47 | continue; | |
48 | case '\n': | |
49 | if(sawchar==0) continue; | |
50 | case ',': | |
51 | case '.': /* end of table specification */ | |
52 | ncol = max(ncol, icol); | |
53 | if (lefline[nclin][ncol]>0) {ncol++; rightl++;}; | |
54 | if(sawchar) | |
55 | nclin++; | |
56 | if (nclin>=MAXHEAD) | |
57 | error("too many lines in specification"); | |
58 | icol=0; | |
59 | if (ncol==0 || nclin==0) | |
60 | error("no specification"); | |
61 | if (c== '.') | |
62 | { | |
63 | while ((c=get1char()) && c != '\n') | |
64 | if (c != ' ' && c != '\t') | |
65 | error("dot not last character on format line"); | |
66 | /* fix up sep - default is 3 except at edge */ | |
67 | for(icol=0; icol<ncol; icol++) | |
68 | if (sep[icol]<0) | |
69 | sep[icol] = icol+1<ncol ? 3 : 1; | |
70 | if (oncol == 0) | |
71 | oncol = ncol; | |
72 | else if (oncol +2 <ncol) | |
73 | error("tried to widen table in T&, not allowed"); | |
74 | return; | |
75 | } | |
76 | sawchar=0; | |
77 | continue; | |
78 | case 'C': case 'S': case 'R': case 'N': case 'L': case 'A': | |
79 | c += ('a'-'A'); | |
80 | case '_': if (c=='_') c= '-'; | |
81 | case '=': case '-': | |
82 | case '^': | |
83 | case 'c': case 's': case 'n': case 'r': case 'l': case 'a': | |
eb15f2fa KB |
84 | if (icol>=MAXCOL) |
85 | error("too many columns in table"); | |
dfef12f4 BS |
86 | style[nclin][icol]=c; |
87 | if (c== 's' && icol<=0) | |
88 | error("first column can not be S-type"); | |
89 | if (c=='s' && style[nclin][icol-1] == 'a') | |
90 | { | |
91 | fprintf(tabout, ".tm warning: can't span a-type cols, changed to l\n"); | |
92 | style[nclin][icol-1] = 'l'; | |
93 | } | |
94 | if (c=='s' && style[nclin][icol-1] == 'n') | |
95 | { | |
96 | fprintf(tabout, ".tm warning: can't span n-type cols, changed to c\n"); | |
97 | style[nclin][icol-1] = 'c'; | |
98 | } | |
99 | icol++; | |
100 | if (c=='^' && nclin<=0) | |
101 | error("first row can not contain vertical span"); | |
dfef12f4 BS |
102 | sawchar=1; |
103 | continue; | |
104 | case 'b': case 'i': | |
105 | c += 'A'-'a'; | |
106 | case 'B': case 'I': | |
107 | if (icol==0) continue; | |
108 | snp=font[nclin][icol-1]; | |
109 | snp[0]= (c=='I' ? '2' : '3'); | |
110 | snp[1]=0; | |
111 | continue; | |
112 | case 't': case 'T': | |
113 | if (icol>0) | |
114 | ctop[nclin][icol-1] = 1; | |
115 | continue; | |
116 | case 'd': case 'D': | |
117 | if (icol>0) | |
118 | ctop[nclin][icol-1] = -1; | |
119 | continue; | |
120 | case 'f': case 'F': | |
121 | if (icol==0) continue; | |
122 | snp=font[nclin][icol-1]; | |
123 | snp[0]=snp[1]=stopc=0; | |
124 | for(i=0; i<2; i++) | |
125 | { | |
126 | c = get1char(); | |
127 | if (i==0 && c=='(') | |
128 | { | |
129 | stopc=')'; | |
130 | c = get1char(); | |
131 | } | |
132 | if (c==0) break; | |
133 | if (c==stopc) {stopc=0; break;} | |
134 | if (stopc==0) if (c==' ' || c== tab ) break; | |
135 | if (c=='\n'){un1getc(c); break;} | |
136 | snp[i] = c; | |
137 | if (c>= '0' && c<= '9') break; | |
138 | } | |
139 | if (stopc) if (get1char()!=stopc) | |
140 | error("Nonterminated font name"); | |
141 | continue; | |
142 | case 'P': case 'p': | |
143 | if (icol<=0) continue; | |
144 | temp = snp = csize[nclin][icol-1]; | |
145 | while (c = get1char()) | |
146 | { | |
147 | if (c== ' ' || c== tab || c=='\n') break; | |
148 | if (c=='-' || c == '+') | |
149 | if (snp>temp) | |
150 | break; | |
151 | else | |
152 | *snp++=c; | |
153 | else | |
154 | if (digit(c)) | |
155 | *snp++ = c; | |
156 | else break; | |
157 | if (snp-temp>4) | |
158 | error("point size too large"); | |
159 | } | |
160 | *snp = 0; | |
161 | if (atoi(temp)>36) | |
162 | error("point size unreasonable"); | |
163 | un1getc (c); | |
164 | continue; | |
165 | case 'V': case 'v': | |
166 | if (icol<=0) continue; | |
167 | temp = snp = vsize[nclin][icol-1]; | |
168 | while (c = get1char()) | |
169 | { | |
170 | if (c== ' ' || c== tab || c=='\n') break; | |
171 | if (c=='-' || c == '+') | |
172 | if (snp>temp) | |
173 | break; | |
174 | else | |
175 | *snp++=c; | |
176 | else | |
177 | if (digit(c)) | |
178 | *snp++ = c; | |
179 | else break; | |
180 | if (snp-temp>4) | |
181 | error("vertical spacing value too large"); | |
182 | } | |
183 | *snp=0; | |
184 | un1getc(c); | |
185 | continue; | |
186 | case 'w': case 'W': | |
187 | snp = cll [icol-1]; | |
188 | /* Dale Smith didn't like this check - possible to have two text blocks | |
189 | of different widths now .... | |
190 | if (*snp) | |
191 | { | |
192 | fprintf(tabout, "Ignored second width specification"); | |
193 | continue; | |
194 | } | |
195 | /* end commented out code ... */ | |
196 | stopc=0; | |
197 | while (c = get1char()) | |
198 | { | |
199 | if (snp==cll[icol-1] && c=='(') | |
200 | { | |
201 | stopc = ')'; | |
202 | continue; | |
203 | } | |
204 | if ( !stopc && (c>'9' || c< '0')) | |
205 | break; | |
206 | if (stopc && c== stopc) | |
207 | break; | |
208 | *snp++ =c; | |
209 | } | |
210 | *snp=0; | |
211 | if (snp-cll[icol-1]>CLLEN) | |
212 | error ("column width too long"); | |
213 | if (!stopc) | |
214 | un1getc(c); | |
215 | continue; | |
216 | case 'e': case 'E': | |
217 | if (icol<1) continue; | |
218 | evenup[icol-1]=1; | |
219 | evenflg=1; | |
220 | continue; | |
221 | case '0': case '1': case '2': case '3': case '4': | |
222 | case '5': case '6': case '7': case '8': case '9': | |
223 | sn[0] = c; | |
224 | snp=sn+1; | |
225 | while (digit(*snp++ = c = get1char())) | |
226 | ; | |
227 | un1getc(c); | |
228 | sep[icol-1] = max(sep[icol-1], numb(sn)); | |
229 | continue; | |
230 | case '|': | |
231 | lefline[nclin][icol]++; | |
232 | if (icol==0) left1flg=1; | |
233 | continue; | |
234 | } | |
235 | } | |
236 | error("EOF reading table specification"); | |
237 | } |