1*11032Sshannon /* t5.c 4.1 83/02/12 */ 2*11032Sshannon 3*11032Sshannon /* t5.c: read data for table */ 4*11032Sshannon # include "t..c" 5*11032Sshannon gettbl() 6*11032Sshannon { 7*11032Sshannon int icol, ch; 8*11032Sshannon cstore=cspace= chspace(); 9*11032Sshannon textflg=0; 10*11032Sshannon for (nlin=nslin=0; gets1(cstore); nlin++) 11*11032Sshannon { 12*11032Sshannon stynum[nlin]=nslin; 13*11032Sshannon if (prefix(".TE", cstore)) 14*11032Sshannon { 15*11032Sshannon leftover=0; 16*11032Sshannon break; 17*11032Sshannon } 18*11032Sshannon if (prefix(".TC", cstore) || prefix(".T&", cstore)) 19*11032Sshannon { 20*11032Sshannon readspec(); 21*11032Sshannon nslin++; 22*11032Sshannon } 23*11032Sshannon if (nlin>=MAXLIN) 24*11032Sshannon { 25*11032Sshannon leftover=cstore; 26*11032Sshannon break; 27*11032Sshannon } 28*11032Sshannon fullbot[nlin]=0; 29*11032Sshannon if (cstore[0] == '.' && !isdigit(cstore[1])) 30*11032Sshannon { 31*11032Sshannon instead[nlin] = cstore; 32*11032Sshannon while (*cstore++); 33*11032Sshannon continue; 34*11032Sshannon } 35*11032Sshannon else instead[nlin] = 0; 36*11032Sshannon if (nodata(nlin)) 37*11032Sshannon { 38*11032Sshannon if (ch = oneh(nlin)) 39*11032Sshannon fullbot[nlin]= ch; 40*11032Sshannon nlin++; 41*11032Sshannon nslin++; 42*11032Sshannon instead[nlin]=fullbot[nlin]=0; 43*11032Sshannon } 44*11032Sshannon table[nlin] = alocv((ncol+2)*sizeof(table[0][0])); 45*11032Sshannon if (cstore[1]==0) 46*11032Sshannon switch(cstore[0]) 47*11032Sshannon { 48*11032Sshannon case '_': fullbot[nlin]= '-'; continue; 49*11032Sshannon case '=': fullbot[nlin]= '='; continue; 50*11032Sshannon } 51*11032Sshannon stynum[nlin] = nslin; 52*11032Sshannon nslin = min(nslin+1, nclin-1); 53*11032Sshannon for (icol = 0; icol <ncol; icol++) 54*11032Sshannon { 55*11032Sshannon table[nlin][icol].col = cstore; 56*11032Sshannon table[nlin][icol].rcol=0; 57*11032Sshannon ch=1; 58*11032Sshannon if (match(cstore, "T{")) /* text follows */ 59*11032Sshannon table[nlin][icol].col = 60*11032Sshannon gettext(cstore, nlin, icol, 61*11032Sshannon font[stynum[nlin]][icol], 62*11032Sshannon csize[stynum[nlin]][icol]); 63*11032Sshannon else 64*11032Sshannon { 65*11032Sshannon for(; (ch= *cstore) != '\0' && ch != tab; cstore++) 66*11032Sshannon ; 67*11032Sshannon *cstore++ = '\0'; 68*11032Sshannon switch(ctype(nlin,icol)) /* numerical or alpha, subcol */ 69*11032Sshannon { 70*11032Sshannon case 'n': 71*11032Sshannon table[nlin][icol].rcol = maknew(table[nlin][icol].col); 72*11032Sshannon break; 73*11032Sshannon case 'a': 74*11032Sshannon table[nlin][icol].rcol = table[nlin][icol].col; 75*11032Sshannon table[nlin][icol].col = ""; 76*11032Sshannon break; 77*11032Sshannon } 78*11032Sshannon } 79*11032Sshannon while (ctype(nlin,icol+1)== 's') /* spanning */ 80*11032Sshannon table[nlin][++icol].col = ""; 81*11032Sshannon if (ch == '\0') break; 82*11032Sshannon } 83*11032Sshannon while (++icol <ncol+2) 84*11032Sshannon { 85*11032Sshannon table[nlin][icol].col = ""; 86*11032Sshannon table [nlin][icol].rcol=0; 87*11032Sshannon } 88*11032Sshannon while (*cstore != '\0') 89*11032Sshannon cstore++; 90*11032Sshannon if (cstore-cspace > MAXCHS) 91*11032Sshannon cstore = cspace = chspace(); 92*11032Sshannon } 93*11032Sshannon last = cstore; 94*11032Sshannon permute(); 95*11032Sshannon if (textflg) untext(); 96*11032Sshannon return; 97*11032Sshannon } 98*11032Sshannon nodata(il) 99*11032Sshannon { 100*11032Sshannon int c; 101*11032Sshannon for (c=0; c<ncol;c++) 102*11032Sshannon { 103*11032Sshannon switch(ctype(il,c)) 104*11032Sshannon { 105*11032Sshannon case 'c': case 'n': case 'r': case 'l': case 's': case 'a': 106*11032Sshannon return(0); 107*11032Sshannon } 108*11032Sshannon } 109*11032Sshannon return(1); 110*11032Sshannon } 111*11032Sshannon oneh(lin) 112*11032Sshannon { 113*11032Sshannon int k, icol; 114*11032Sshannon k = ctype(lin,0); 115*11032Sshannon for(icol=1; icol<ncol; icol++) 116*11032Sshannon { 117*11032Sshannon if (k != ctype(lin,icol)) 118*11032Sshannon return(0); 119*11032Sshannon } 120*11032Sshannon return(k); 121*11032Sshannon } 122*11032Sshannon # define SPAN "\\^" 123*11032Sshannon permute() 124*11032Sshannon { 125*11032Sshannon int irow, jcol, is; 126*11032Sshannon char *start, *strig; 127*11032Sshannon for(jcol=0; jcol<ncol; jcol++) 128*11032Sshannon { 129*11032Sshannon for(irow=1; irow<nlin; irow++) 130*11032Sshannon { 131*11032Sshannon if (vspand(irow,jcol,0)) 132*11032Sshannon { 133*11032Sshannon is = prev(irow); 134*11032Sshannon if (is<0) 135*11032Sshannon error("Vertical spanning in first row not allowed"); 136*11032Sshannon start = table[is][jcol].col; 137*11032Sshannon strig = table[is][jcol].rcol; 138*11032Sshannon while (irow<nlin &&vspand(irow,jcol,0)) 139*11032Sshannon irow++; 140*11032Sshannon table[--irow][jcol].col = start; 141*11032Sshannon table[irow][jcol].rcol = strig; 142*11032Sshannon while (is<irow) 143*11032Sshannon { 144*11032Sshannon table[is][jcol].rcol =0; 145*11032Sshannon table[is][jcol].col= SPAN; 146*11032Sshannon is = next(is); 147*11032Sshannon } 148*11032Sshannon } 149*11032Sshannon } 150*11032Sshannon } 151*11032Sshannon } 152*11032Sshannon vspand(ir,ij,ifform) 153*11032Sshannon { 154*11032Sshannon if (ir<0) return(0); 155*11032Sshannon if (ir>=nlin)return(0); 156*11032Sshannon if (instead[ir]) return(0); 157*11032Sshannon if (ifform==0 && ctype(ir,ij)=='^') return(1); 158*11032Sshannon if (table[ir][ij].rcol!=0) return(0); 159*11032Sshannon if (fullbot[ir]) return(0); 160*11032Sshannon return(vspen(table[ir][ij].col)); 161*11032Sshannon } 162*11032Sshannon vspen(s) 163*11032Sshannon char *s; 164*11032Sshannon { 165*11032Sshannon if (s==0) return(0); 166*11032Sshannon if (!point(s)) return(0); 167*11032Sshannon return(match(s, SPAN)); 168*11032Sshannon } 169