|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.