114508Ssam #ifndef lint 2*34023Sbostic static char sccsid[] = "@(#)t4.c 4.3 04/19/88"; 314508Ssam #endif 411031Sshannon 511031Sshannon /* t4.c: read table specification */ 611031Sshannon # include "t..c" 711031Sshannon int oncol; 811031Sshannon getspec() 911031Sshannon { 1011031Sshannon int icol, i; 1111031Sshannon for(icol=0; icol<MAXCOL; icol++) 1211031Sshannon { 1311031Sshannon sep[icol]= -1; 1411031Sshannon evenup[icol]=0; 1511031Sshannon cll[icol][0]=0; 1611031Sshannon for(i=0; i<MAXHEAD; i++) 1711031Sshannon { 1811031Sshannon csize[i][icol][0]=0; 1911031Sshannon vsize[i][icol][0]=0; 2011031Sshannon font[i][icol][0] = lefline[i][icol] = 0; 2111031Sshannon ctop[i][icol]=0; 2211031Sshannon style[i][icol]= 'l'; 2311031Sshannon } 2411031Sshannon } 2511031Sshannon nclin=ncol=0; 2611031Sshannon oncol =0; 2711031Sshannon left1flg=rightl=0; 2811031Sshannon readspec(); 2911031Sshannon fprintf(tabout, ".rm"); 3011031Sshannon for(i=0; i<ncol; i++) 3111031Sshannon fprintf(tabout, " %02d", 80+i); 3211031Sshannon fprintf(tabout, "\n"); 3311031Sshannon } 3411031Sshannon readspec() 3511031Sshannon { 3611031Sshannon int icol, c, sawchar, stopc, i; 3711031Sshannon char sn[10], *snp, *temp; 3811031Sshannon sawchar=icol=0; 3911031Sshannon while (c=get1char()) 4011031Sshannon { 4111031Sshannon switch(c) 4211031Sshannon { 4311031Sshannon default: 4411031Sshannon if (c != tab) 4511031Sshannon error("bad table specification character"); 4611031Sshannon case ' ': /* note this is also case tab */ 4711031Sshannon continue; 4811031Sshannon case '\n': 4911031Sshannon if(sawchar==0) continue; 5011031Sshannon case ',': 5111031Sshannon case '.': /* end of table specification */ 5211031Sshannon ncol = max(ncol, icol); 5311031Sshannon if (lefline[nclin][ncol]>0) {ncol++; rightl++;}; 5411031Sshannon if(sawchar) 5511031Sshannon nclin++; 5611031Sshannon if (nclin>=MAXHEAD) 5711031Sshannon error("too many lines in specification"); 5811031Sshannon icol=0; 5911031Sshannon if (ncol==0 || nclin==0) 6011031Sshannon error("no specification"); 6111031Sshannon if (c== '.') 6211031Sshannon { 6311031Sshannon while ((c=get1char()) && c != '\n') 6411031Sshannon if (c != ' ' && c != '\t') 6511031Sshannon error("dot not last character on format line"); 6611031Sshannon /* fix up sep - default is 3 except at edge */ 6711031Sshannon for(icol=0; icol<ncol; icol++) 6811031Sshannon if (sep[icol]<0) 6911031Sshannon sep[icol] = icol+1<ncol ? 3 : 1; 7011031Sshannon if (oncol == 0) 7111031Sshannon oncol = ncol; 7211031Sshannon else if (oncol +2 <ncol) 7311031Sshannon error("tried to widen table in T&, not allowed"); 7411031Sshannon return; 7511031Sshannon } 7611031Sshannon sawchar=0; 7711031Sshannon continue; 7811031Sshannon case 'C': case 'S': case 'R': case 'N': case 'L': case 'A': 7911031Sshannon c += ('a'-'A'); 8011031Sshannon case '_': if (c=='_') c= '-'; 8111031Sshannon case '=': case '-': 8211031Sshannon case '^': 8311031Sshannon case 'c': case 's': case 'n': case 'r': case 'l': case 'a': 84*34023Sbostic if (icol>=MAXCOL) 85*34023Sbostic error("too many columns in table"); 8611031Sshannon style[nclin][icol]=c; 8711031Sshannon if (c== 's' && icol<=0) 8811031Sshannon error("first column can not be S-type"); 8911031Sshannon if (c=='s' && style[nclin][icol-1] == 'a') 9011031Sshannon { 9111031Sshannon fprintf(tabout, ".tm warning: can't span a-type cols, changed to l\n"); 9211031Sshannon style[nclin][icol-1] = 'l'; 9311031Sshannon } 9411031Sshannon if (c=='s' && style[nclin][icol-1] == 'n') 9511031Sshannon { 9611031Sshannon fprintf(tabout, ".tm warning: can't span n-type cols, changed to c\n"); 9711031Sshannon style[nclin][icol-1] = 'c'; 9811031Sshannon } 9911031Sshannon icol++; 10011031Sshannon if (c=='^' && nclin<=0) 10111031Sshannon error("first row can not contain vertical span"); 10211031Sshannon sawchar=1; 10311031Sshannon continue; 10411031Sshannon case 'b': case 'i': 10511031Sshannon c += 'A'-'a'; 10611031Sshannon case 'B': case 'I': 10711031Sshannon if (icol==0) continue; 10811031Sshannon snp=font[nclin][icol-1]; 10911031Sshannon snp[0]= (c=='I' ? '2' : '3'); 11011031Sshannon snp[1]=0; 11111031Sshannon continue; 11211031Sshannon case 't': case 'T': 11311031Sshannon if (icol>0) 11411031Sshannon ctop[nclin][icol-1] = 1; 11511031Sshannon continue; 11611031Sshannon case 'd': case 'D': 11711031Sshannon if (icol>0) 11811031Sshannon ctop[nclin][icol-1] = -1; 11911031Sshannon continue; 12011031Sshannon case 'f': case 'F': 12111031Sshannon if (icol==0) continue; 12211031Sshannon snp=font[nclin][icol-1]; 12311031Sshannon snp[0]=snp[1]=stopc=0; 12411031Sshannon for(i=0; i<2; i++) 12511031Sshannon { 12611031Sshannon c = get1char(); 12711031Sshannon if (i==0 && c=='(') 12811031Sshannon { 12911031Sshannon stopc=')'; 13011031Sshannon c = get1char(); 13111031Sshannon } 13211031Sshannon if (c==0) break; 13311031Sshannon if (c==stopc) {stopc=0; break;} 13411031Sshannon if (stopc==0) if (c==' ' || c== tab ) break; 13511031Sshannon if (c=='\n'){un1getc(c); break;} 13611031Sshannon snp[i] = c; 13711031Sshannon if (c>= '0' && c<= '9') break; 13811031Sshannon } 13911031Sshannon if (stopc) if (get1char()!=stopc) 14011031Sshannon error("Nonterminated font name"); 14111031Sshannon continue; 14211031Sshannon case 'P': case 'p': 14311031Sshannon if (icol<=0) continue; 14411031Sshannon temp = snp = csize[nclin][icol-1]; 14511031Sshannon while (c = get1char()) 14611031Sshannon { 14711031Sshannon if (c== ' ' || c== tab || c=='\n') break; 14811031Sshannon if (c=='-' || c == '+') 14911031Sshannon if (snp>temp) 15011031Sshannon break; 15111031Sshannon else 15211031Sshannon *snp++=c; 15311031Sshannon else 15411031Sshannon if (digit(c)) 15511031Sshannon *snp++ = c; 15611031Sshannon else break; 15711031Sshannon if (snp-temp>4) 15811031Sshannon error("point size too large"); 15911031Sshannon } 16011031Sshannon *snp = 0; 16111031Sshannon if (atoi(temp)>36) 16211031Sshannon error("point size unreasonable"); 16311031Sshannon un1getc (c); 16411031Sshannon continue; 16511031Sshannon case 'V': case 'v': 16611031Sshannon if (icol<=0) continue; 16711031Sshannon temp = snp = vsize[nclin][icol-1]; 16811031Sshannon while (c = get1char()) 16911031Sshannon { 17011031Sshannon if (c== ' ' || c== tab || c=='\n') break; 17111031Sshannon if (c=='-' || c == '+') 17211031Sshannon if (snp>temp) 17311031Sshannon break; 17411031Sshannon else 17511031Sshannon *snp++=c; 17611031Sshannon else 17711031Sshannon if (digit(c)) 17811031Sshannon *snp++ = c; 17911031Sshannon else break; 18011031Sshannon if (snp-temp>4) 18111031Sshannon error("vertical spacing value too large"); 18211031Sshannon } 18311031Sshannon *snp=0; 18411031Sshannon un1getc(c); 18511031Sshannon continue; 18611031Sshannon case 'w': case 'W': 18711031Sshannon snp = cll [icol-1]; 18811031Sshannon /* Dale Smith didn't like this check - possible to have two text blocks 18911031Sshannon of different widths now .... 19011031Sshannon if (*snp) 19111031Sshannon { 19211031Sshannon fprintf(tabout, "Ignored second width specification"); 19311031Sshannon continue; 19411031Sshannon } 19511031Sshannon /* end commented out code ... */ 19611031Sshannon stopc=0; 19711031Sshannon while (c = get1char()) 19811031Sshannon { 19911031Sshannon if (snp==cll[icol-1] && c=='(') 20011031Sshannon { 20111031Sshannon stopc = ')'; 20211031Sshannon continue; 20311031Sshannon } 20411031Sshannon if ( !stopc && (c>'9' || c< '0')) 20511031Sshannon break; 20611031Sshannon if (stopc && c== stopc) 20711031Sshannon break; 20811031Sshannon *snp++ =c; 20911031Sshannon } 21011031Sshannon *snp=0; 21111031Sshannon if (snp-cll[icol-1]>CLLEN) 21211031Sshannon error ("column width too long"); 21311031Sshannon if (!stopc) 21411031Sshannon un1getc(c); 21511031Sshannon continue; 21611031Sshannon case 'e': case 'E': 21711031Sshannon if (icol<1) continue; 21811031Sshannon evenup[icol-1]=1; 21911031Sshannon evenflg=1; 22011031Sshannon continue; 22111031Sshannon case '0': case '1': case '2': case '3': case '4': 22211031Sshannon case '5': case '6': case '7': case '8': case '9': 22311031Sshannon sn[0] = c; 22411031Sshannon snp=sn+1; 22511031Sshannon while (digit(*snp++ = c = get1char())) 22611031Sshannon ; 22711031Sshannon un1getc(c); 22811031Sshannon sep[icol-1] = max(sep[icol-1], numb(sn)); 22911031Sshannon continue; 23011031Sshannon case '|': 23111031Sshannon lefline[nclin][icol]++; 23211031Sshannon if (icol==0) left1flg=1; 23311031Sshannon continue; 23411031Sshannon } 23511031Sshannon } 23611031Sshannon error("EOF reading table specification"); 23711031Sshannon } 238