1 /*
2 * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
4 */
5
6 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
7 /* All Rights Reserved */
8
9
10 /*
11 * Copyright (c) 1980 Regents of the University of California.
12 * All rights reserved. The Berkeley software License Agreement
13 * specifies the terms and conditions for redistribution.
14 */
15
16 /* t4.c: read table specification */
17 # include "t..c"
18 int oncol;
19
20 void readspec(void);
21
22 void
getspec(void)23 getspec(void)
24 {
25 int icol, i;
26 for(icol=0; icol<MAXCOL; icol++)
27 {
28 sep[icol]= -1;
29 evenup[icol]=0;
30 cll[icol][0]=0;
31 for(i=0; i<MAXHEAD; i++)
32 {
33 csize[i][icol][0]=0;
34 vsize[i][icol][0]=0;
35 font[i][icol][0] = lefline[i][icol] = 0;
36 ctop[i][icol]=0;
37 style[i][icol]= 'l';
38 }
39 }
40 nclin=ncol=0;
41 oncol =0;
42 left1flg=rightl=0;
43 readspec();
44 fprintf(tabout, ".rm");
45 for(i=0; i<ncol; i++)
46 fprintf(tabout, " %02d", 80+i);
47 fprintf(tabout, "\n");
48 }
49
50 void
readspec(void)51 readspec(void)
52 {
53 int icol, c, sawchar, stopc, i;
54 char sn[10], *snp, *temp;
55 sawchar=icol=0;
56 while (c=get1char())
57 {
58 switch(c)
59 {
60 default:
61 if (c != tab)
62 error(gettext("bad table specification character"));
63 /* FALLTHROUGH */
64 case ' ': /* note this is also case tab */
65 continue;
66 case '\n':
67 if(sawchar==0) continue;
68 /* FALLTHROUGH */
69 case ',':
70 case '.': /* end of table specification */
71 ncol = max(ncol, icol);
72 if (lefline[nclin][ncol]>0) {ncol++; rightl++;};
73 if(sawchar)
74 nclin++;
75 if (nclin>=MAXHEAD)
76 error(gettext("too many lines in specification"));
77 icol=0;
78 if (ncol==0 || nclin==0)
79 error(gettext("no specification"));
80 if (c== '.')
81 {
82 while ((c=get1char()) && c != '\n')
83 if (c != ' ' && c != '\t')
84 error(gettext("dot not last character on format line"));
85 /* fix up sep - default is 3 except at edge */
86 for(icol=0; icol<ncol; icol++)
87 if (sep[icol]<0)
88 sep[icol] = icol+1<ncol ? 3 : 1;
89 if (oncol == 0)
90 oncol = ncol;
91 else if (oncol +2 <ncol)
92 error(gettext("tried to widen table in T&, not allowed"));
93 return;
94 }
95 sawchar=0;
96 continue;
97 case 'C': case 'S': case 'R': case 'N': case 'L': case 'A':
98 c += ('a'-'A');
99 /* FALLTHROUGH */
100 case '_': if (c=='_') c= '-';
101 /* FALLTHROUGH */
102 case '=': case '-':
103 case '^':
104 case 'c': case 's': case 'n': case 'r': case 'l': case 'a':
105 style[nclin][icol]=c;
106 if (c== 's' && icol<=0)
107 error(gettext("first column can not be S-type"));
108 if (c=='s' && style[nclin][icol-1] == 'a')
109 {
110 fprintf(tabout, ".tm warning: can't span a-type cols, changed to l\n");
111 style[nclin][icol-1] = 'l';
112 }
113 if (c=='s' && style[nclin][icol-1] == 'n')
114 {
115 fprintf(tabout, ".tm warning: can't span n-type cols, changed to c\n");
116 style[nclin][icol-1] = 'c';
117 }
118 icol++;
119 if (c=='^' && nclin<=0)
120 error(gettext("first row can not contain vertical span"));
121 if (icol>=MAXCOL)
122 error(gettext("too many columns in table"));
123 sawchar=1;
124 continue;
125 case 'b': case 'i':
126 c += 'A'-'a';
127 /* FALLTHRU */
128 case 'B': case 'I':
129 if (sawchar == 0)
130 continue;
131 if (icol==0) continue;
132 snp=font[nclin][icol-1];
133 snp[0]= (c=='I' ? '2' : '3');
134 snp[1]=0;
135 continue;
136 case 't': case 'T':
137 if (sawchar == 0) {
138 continue;
139 }
140 if (icol>0)
141 ctop[nclin][icol-1] = 1;
142 continue;
143 case 'd': case 'D':
144 if (sawchar == 0)
145 continue;
146 if (icol>0)
147 ctop[nclin][icol-1] = -1;
148 continue;
149 case 'f': case 'F':
150 if (sawchar == 0)
151 continue;
152 if (icol==0) continue;
153 snp=font[nclin][icol-1];
154 snp[0]=snp[1]=stopc=0;
155 for(i=0; i<2; i++)
156 {
157 c = get1char();
158 if (i==0 && c=='(')
159 {
160 stopc=')';
161 c = get1char();
162 }
163 if (c==0) break;
164 if (c==stopc) {stopc=0; break;}
165 if (stopc==0) if (c==' ' || c== tab ) break;
166 if (c=='\n'){un1getc(c); break;}
167 snp[i] = c;
168 if (c>= '0' && c<= '9') break;
169 }
170 if (stopc) if (get1char()!=stopc)
171 error(gettext("Nonterminated font name"));
172 continue;
173 case 'P': case 'p':
174 if (sawchar == 0)
175 continue;
176 if (icol<=0) continue;
177 temp = snp = csize[nclin][icol-1];
178 while (c = get1char())
179 {
180 if (c== ' ' || c== tab || c=='\n') break;
181 if (c=='-' || c == '+')
182 if (snp>temp)
183 break;
184 else
185 *snp++=c;
186 else
187 if (digit(c))
188 *snp++ = c;
189 else break;
190 if (snp-temp>4)
191 error(gettext("point size too large"));
192 }
193 *snp = 0;
194 if (atoi(temp)>36)
195 error(gettext("point size unreasonable"));
196 un1getc (c);
197 continue;
198 case 'V': case 'v':
199 if (sawchar == 0)
200 continue;
201 if (icol<=0) continue;
202 temp = snp = vsize[nclin][icol-1];
203 while (c = get1char())
204 {
205 if (c== ' ' || c== tab || c=='\n') break;
206 if (c=='-' || c == '+')
207 if (snp>temp)
208 break;
209 else
210 *snp++=c;
211 else
212 if (digit(c))
213 *snp++ = c;
214 else break;
215 if (snp-temp>4)
216 error(
217 gettext("vertical spacing value too large")
218 );
219 }
220 *snp=0;
221 un1getc(c);
222 continue;
223 case 'w': case 'W':
224 if (sawchar == 0) {
225 /*
226 * This should be an error case.
227 * However, for the backward-compatibility,
228 * treat as if 'c' was specified.
229 */
230 style[nclin][icol] = 'c';
231 icol++;
232 if (icol >= MAXCOL) {
233 error(gettext(
234 "too many columns in table"));
235 }
236 sawchar = 1;
237 }
238
239 snp = cll [icol-1];
240 /* Dale Smith didn't like this check
241 * possible to have two text blocks
242 * of different widths now ....
243 if (*snp)
244 {
245 fprintf(tabout,
246 gettext("Ignored second width specification"));
247 continue;
248 }
249 * end commented out code ... */
250 stopc=0;
251 while (c = get1char())
252 {
253 if (snp==cll[icol-1] && c=='(')
254 {
255 stopc = ')';
256 continue;
257 }
258 if ( !stopc && (c>'9' || c< '0'))
259 break;
260 if (stopc && c== stopc)
261 break;
262 *snp++ =c;
263 }
264 *snp=0;
265 if (snp-cll[icol-1]>CLLEN)
266 error (gettext("column width too long"));
267 if (!stopc)
268 un1getc(c);
269 continue;
270 case 'e': case 'E':
271 if (sawchar == 0)
272 continue;
273 if (icol<1) continue;
274 evenup[icol-1]=1;
275 evenflg=1;
276 continue;
277 case '0': case '1': case '2': case '3': case '4':
278 case '5': case '6': case '7': case '8': case '9':
279 sn[0] = c;
280 snp=sn+1;
281 while (digit(*snp++ = c = get1char()))
282 ;
283 un1getc(c);
284 sep[icol-1] = max(sep[icol-1], numb(sn));
285 continue;
286 case '|':
287 lefline[nclin][icol]++;
288 if (icol==0) left1flg=1;
289 continue;
290 }
291 }
292 error(gettext("EOF reading table specification"));
293 }
294