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