| 1 | #ifndef lint |
| 2 | static char sccsid[] = "@(#)t4.c 4.2 8/11/83"; |
| 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 | style[nclin][icol]=c; |
| 85 | if (c== 's' && icol<=0) |
| 86 | error("first column can not be S-type"); |
| 87 | if (c=='s' && style[nclin][icol-1] == 'a') |
| 88 | { |
| 89 | fprintf(tabout, ".tm warning: can't span a-type cols, changed to l\n"); |
| 90 | style[nclin][icol-1] = 'l'; |
| 91 | } |
| 92 | if (c=='s' && style[nclin][icol-1] == 'n') |
| 93 | { |
| 94 | fprintf(tabout, ".tm warning: can't span n-type cols, changed to c\n"); |
| 95 | style[nclin][icol-1] = 'c'; |
| 96 | } |
| 97 | icol++; |
| 98 | if (c=='^' && nclin<=0) |
| 99 | error("first row can not contain vertical span"); |
| 100 | if (icol>=MAXCOL) |
| 101 | error("too many columns in table"); |
| 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 | } |