1: /* t4.c: read table specification */
2: # include "t..c"
3: int oncol;
4: getspec()
5: {
6: int icol, i;
7: for(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: }
21: nclin=ncol=0;
22: oncol =0;
23: left1flg=rightl=0;
24: readspec();
25: fprintf(tabout, ".rm");
26: for(i=0; i<ncol; i++)
27: fprintf(tabout, " %02d", 80+i);
28: fprintf(tabout, "\n");
29: }
30: readspec()
31: {
32: int icol, c, sawchar, stopc, i;
33: char sn[10], *snp, *temp;
34: sawchar=icol=0;
35: while (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: }
232: error("EOF reading table specification");
233: }
Defined functions
Defined variables
oncol
defined in line
3; used 4 times