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