114509Ssam #ifndef lint 2*24737Sbloom static char sccsid[] = "@(#)t5.c 4.3 09/14/85"; 314509Ssam #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 { 27*24737Sbloom leftover=(int)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++; 44*24737Sbloom instead[nlin]=(char *)0; 45*24737Sbloom fullbot[nlin]=0; 4611032Sshannon } 47*24737Sbloom table[nlin] = (struct colstr *)alocv((ncol+2)*sizeof(table[0][0])); 4811032Sshannon if (cstore[1]==0) 4911032Sshannon switch(cstore[0]) 5011032Sshannon { 5111032Sshannon case '_': fullbot[nlin]= '-'; continue; 5211032Sshannon case '=': fullbot[nlin]= '='; continue; 5311032Sshannon } 5411032Sshannon stynum[nlin] = nslin; 5511032Sshannon nslin = min(nslin+1, nclin-1); 5611032Sshannon for (icol = 0; icol <ncol; icol++) 5711032Sshannon { 5811032Sshannon table[nlin][icol].col = cstore; 5911032Sshannon table[nlin][icol].rcol=0; 6011032Sshannon ch=1; 6111032Sshannon if (match(cstore, "T{")) /* text follows */ 6211032Sshannon table[nlin][icol].col = 63*24737Sbloom (char *)gettext(cstore, nlin, icol, 6411032Sshannon font[stynum[nlin]][icol], 6511032Sshannon csize[stynum[nlin]][icol]); 6611032Sshannon else 6711032Sshannon { 6811032Sshannon for(; (ch= *cstore) != '\0' && ch != tab; cstore++) 6911032Sshannon ; 7011032Sshannon *cstore++ = '\0'; 7111032Sshannon switch(ctype(nlin,icol)) /* numerical or alpha, subcol */ 7211032Sshannon { 7311032Sshannon case 'n': 74*24737Sbloom table[nlin][icol].rcol = 75*24737Sbloom (char *)maknew(table[nlin][icol].col); 7611032Sshannon break; 7711032Sshannon case 'a': 7811032Sshannon table[nlin][icol].rcol = table[nlin][icol].col; 7911032Sshannon table[nlin][icol].col = ""; 8011032Sshannon break; 8111032Sshannon } 8211032Sshannon } 8311032Sshannon while (ctype(nlin,icol+1)== 's') /* spanning */ 8411032Sshannon table[nlin][++icol].col = ""; 8511032Sshannon if (ch == '\0') break; 8611032Sshannon } 8711032Sshannon while (++icol <ncol+2) 8811032Sshannon { 8911032Sshannon table[nlin][icol].col = ""; 9011032Sshannon table [nlin][icol].rcol=0; 9111032Sshannon } 9211032Sshannon while (*cstore != '\0') 9311032Sshannon cstore++; 9411032Sshannon if (cstore-cspace > MAXCHS) 9511032Sshannon cstore = cspace = chspace(); 9611032Sshannon } 9711032Sshannon last = cstore; 9811032Sshannon permute(); 9911032Sshannon if (textflg) untext(); 10011032Sshannon return; 10111032Sshannon } 10211032Sshannon nodata(il) 10311032Sshannon { 10411032Sshannon int c; 10511032Sshannon for (c=0; c<ncol;c++) 10611032Sshannon { 10711032Sshannon switch(ctype(il,c)) 10811032Sshannon { 10911032Sshannon case 'c': case 'n': case 'r': case 'l': case 's': case 'a': 11011032Sshannon return(0); 11111032Sshannon } 11211032Sshannon } 11311032Sshannon return(1); 11411032Sshannon } 11511032Sshannon oneh(lin) 11611032Sshannon { 11711032Sshannon int k, icol; 11811032Sshannon k = ctype(lin,0); 11911032Sshannon for(icol=1; icol<ncol; icol++) 12011032Sshannon { 12111032Sshannon if (k != ctype(lin,icol)) 12211032Sshannon return(0); 12311032Sshannon } 12411032Sshannon return(k); 12511032Sshannon } 12611032Sshannon # define SPAN "\\^" 12711032Sshannon permute() 12811032Sshannon { 12911032Sshannon int irow, jcol, is; 13011032Sshannon char *start, *strig; 13111032Sshannon for(jcol=0; jcol<ncol; jcol++) 13211032Sshannon { 13311032Sshannon for(irow=1; irow<nlin; irow++) 13411032Sshannon { 13511032Sshannon if (vspand(irow,jcol,0)) 13611032Sshannon { 13711032Sshannon is = prev(irow); 13811032Sshannon if (is<0) 13911032Sshannon error("Vertical spanning in first row not allowed"); 14011032Sshannon start = table[is][jcol].col; 14111032Sshannon strig = table[is][jcol].rcol; 14211032Sshannon while (irow<nlin &&vspand(irow,jcol,0)) 14311032Sshannon irow++; 14411032Sshannon table[--irow][jcol].col = start; 14511032Sshannon table[irow][jcol].rcol = strig; 14611032Sshannon while (is<irow) 14711032Sshannon { 14811032Sshannon table[is][jcol].rcol =0; 14911032Sshannon table[is][jcol].col= SPAN; 15011032Sshannon is = next(is); 15111032Sshannon } 15211032Sshannon } 15311032Sshannon } 15411032Sshannon } 15511032Sshannon } 15611032Sshannon vspand(ir,ij,ifform) 15711032Sshannon { 15811032Sshannon if (ir<0) return(0); 15911032Sshannon if (ir>=nlin)return(0); 16011032Sshannon if (instead[ir]) return(0); 16111032Sshannon if (ifform==0 && ctype(ir,ij)=='^') return(1); 16211032Sshannon if (table[ir][ij].rcol!=0) return(0); 16311032Sshannon if (fullbot[ir]) return(0); 16411032Sshannon return(vspen(table[ir][ij].col)); 16511032Sshannon } 16611032Sshannon vspen(s) 16711032Sshannon char *s; 16811032Sshannon { 16911032Sshannon if (s==0) return(0); 17011032Sshannon if (!point(s)) return(0); 17111032Sshannon return(match(s, SPAN)); 17211032Sshannon } 173