1*14509Ssam #ifndef lint 2*14509Ssam static char sccsid[] = "@(#)t5.c 4.2 08/11/83"; 3*14509Ssam #endif 411032Sshannon 511032Sshannon /* t5.c: read data for table */ 611032Sshannon # include "t..c" 711032Sshannon gettbl() 811032Sshannon { 911032Sshannon int icol, ch; 1011032Sshannon cstore=cspace= chspace(); 1111032Sshannon textflg=0; 1211032Sshannon for (nlin=nslin=0; gets1(cstore); nlin++) 1311032Sshannon { 1411032Sshannon stynum[nlin]=nslin; 1511032Sshannon if (prefix(".TE", cstore)) 1611032Sshannon { 1711032Sshannon leftover=0; 1811032Sshannon break; 1911032Sshannon } 2011032Sshannon if (prefix(".TC", cstore) || prefix(".T&", cstore)) 2111032Sshannon { 2211032Sshannon readspec(); 2311032Sshannon nslin++; 2411032Sshannon } 2511032Sshannon if (nlin>=MAXLIN) 2611032Sshannon { 2711032Sshannon leftover=cstore; 2811032Sshannon break; 2911032Sshannon } 3011032Sshannon fullbot[nlin]=0; 3111032Sshannon if (cstore[0] == '.' && !isdigit(cstore[1])) 3211032Sshannon { 3311032Sshannon instead[nlin] = cstore; 3411032Sshannon while (*cstore++); 3511032Sshannon continue; 3611032Sshannon } 3711032Sshannon else instead[nlin] = 0; 3811032Sshannon if (nodata(nlin)) 3911032Sshannon { 4011032Sshannon if (ch = oneh(nlin)) 4111032Sshannon fullbot[nlin]= ch; 4211032Sshannon nlin++; 4311032Sshannon nslin++; 4411032Sshannon instead[nlin]=fullbot[nlin]=0; 4511032Sshannon } 4611032Sshannon table[nlin] = alocv((ncol+2)*sizeof(table[0][0])); 4711032Sshannon if (cstore[1]==0) 4811032Sshannon switch(cstore[0]) 4911032Sshannon { 5011032Sshannon case '_': fullbot[nlin]= '-'; continue; 5111032Sshannon case '=': fullbot[nlin]= '='; continue; 5211032Sshannon } 5311032Sshannon stynum[nlin] = nslin; 5411032Sshannon nslin = min(nslin+1, nclin-1); 5511032Sshannon for (icol = 0; icol <ncol; icol++) 5611032Sshannon { 5711032Sshannon table[nlin][icol].col = cstore; 5811032Sshannon table[nlin][icol].rcol=0; 5911032Sshannon ch=1; 6011032Sshannon if (match(cstore, "T{")) /* text follows */ 6111032Sshannon table[nlin][icol].col = 6211032Sshannon gettext(cstore, nlin, icol, 6311032Sshannon font[stynum[nlin]][icol], 6411032Sshannon csize[stynum[nlin]][icol]); 6511032Sshannon else 6611032Sshannon { 6711032Sshannon for(; (ch= *cstore) != '\0' && ch != tab; cstore++) 6811032Sshannon ; 6911032Sshannon *cstore++ = '\0'; 7011032Sshannon switch(ctype(nlin,icol)) /* numerical or alpha, subcol */ 7111032Sshannon { 7211032Sshannon case 'n': 7311032Sshannon table[nlin][icol].rcol = maknew(table[nlin][icol].col); 7411032Sshannon break; 7511032Sshannon case 'a': 7611032Sshannon table[nlin][icol].rcol = table[nlin][icol].col; 7711032Sshannon table[nlin][icol].col = ""; 7811032Sshannon break; 7911032Sshannon } 8011032Sshannon } 8111032Sshannon while (ctype(nlin,icol+1)== 's') /* spanning */ 8211032Sshannon table[nlin][++icol].col = ""; 8311032Sshannon if (ch == '\0') break; 8411032Sshannon } 8511032Sshannon while (++icol <ncol+2) 8611032Sshannon { 8711032Sshannon table[nlin][icol].col = ""; 8811032Sshannon table [nlin][icol].rcol=0; 8911032Sshannon } 9011032Sshannon while (*cstore != '\0') 9111032Sshannon cstore++; 9211032Sshannon if (cstore-cspace > MAXCHS) 9311032Sshannon cstore = cspace = chspace(); 9411032Sshannon } 9511032Sshannon last = cstore; 9611032Sshannon permute(); 9711032Sshannon if (textflg) untext(); 9811032Sshannon return; 9911032Sshannon } 10011032Sshannon nodata(il) 10111032Sshannon { 10211032Sshannon int c; 10311032Sshannon for (c=0; c<ncol;c++) 10411032Sshannon { 10511032Sshannon switch(ctype(il,c)) 10611032Sshannon { 10711032Sshannon case 'c': case 'n': case 'r': case 'l': case 's': case 'a': 10811032Sshannon return(0); 10911032Sshannon } 11011032Sshannon } 11111032Sshannon return(1); 11211032Sshannon } 11311032Sshannon oneh(lin) 11411032Sshannon { 11511032Sshannon int k, icol; 11611032Sshannon k = ctype(lin,0); 11711032Sshannon for(icol=1; icol<ncol; icol++) 11811032Sshannon { 11911032Sshannon if (k != ctype(lin,icol)) 12011032Sshannon return(0); 12111032Sshannon } 12211032Sshannon return(k); 12311032Sshannon } 12411032Sshannon # define SPAN "\\^" 12511032Sshannon permute() 12611032Sshannon { 12711032Sshannon int irow, jcol, is; 12811032Sshannon char *start, *strig; 12911032Sshannon for(jcol=0; jcol<ncol; jcol++) 13011032Sshannon { 13111032Sshannon for(irow=1; irow<nlin; irow++) 13211032Sshannon { 13311032Sshannon if (vspand(irow,jcol,0)) 13411032Sshannon { 13511032Sshannon is = prev(irow); 13611032Sshannon if (is<0) 13711032Sshannon error("Vertical spanning in first row not allowed"); 13811032Sshannon start = table[is][jcol].col; 13911032Sshannon strig = table[is][jcol].rcol; 14011032Sshannon while (irow<nlin &&vspand(irow,jcol,0)) 14111032Sshannon irow++; 14211032Sshannon table[--irow][jcol].col = start; 14311032Sshannon table[irow][jcol].rcol = strig; 14411032Sshannon while (is<irow) 14511032Sshannon { 14611032Sshannon table[is][jcol].rcol =0; 14711032Sshannon table[is][jcol].col= SPAN; 14811032Sshannon is = next(is); 14911032Sshannon } 15011032Sshannon } 15111032Sshannon } 15211032Sshannon } 15311032Sshannon } 15411032Sshannon vspand(ir,ij,ifform) 15511032Sshannon { 15611032Sshannon if (ir<0) return(0); 15711032Sshannon if (ir>=nlin)return(0); 15811032Sshannon if (instead[ir]) return(0); 15911032Sshannon if (ifform==0 && ctype(ir,ij)=='^') return(1); 16011032Sshannon if (table[ir][ij].rcol!=0) return(0); 16111032Sshannon if (fullbot[ir]) return(0); 16211032Sshannon return(vspen(table[ir][ij].col)); 16311032Sshannon } 16411032Sshannon vspen(s) 16511032Sshannon char *s; 16611032Sshannon { 16711032Sshannon if (s==0) return(0); 16811032Sshannon if (!point(s)) return(0); 16911032Sshannon return(match(s, SPAN)); 17011032Sshannon } 171