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