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