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