/* t5.c: read data for table */ # include "t..c" gettbl() { int icol, ch; cstore=cspace= chspace(); textflg=0; for (nlin=nslin=0; gets1(cstore); nlin++) { stynum[nlin]=nslin; if (prefix(".TE", cstore)) { leftover=0; break; } if (prefix(".TC", cstore) || prefix(".T&", cstore)) { readspec(); nslin++; } if (nlin>=MAXLIN) { leftover=1; break; } fullbot[nlin]=0; if (cstore[0] == '.' && letter(cstore[1])) { instead[nlin] = cstore; while (*cstore++); continue; } else instead[nlin] = 0; if (nodata(nlin)) { if (ch = oneh(nlin)) fullbot[nlin]= ch; nlin++; nslin++; instead[nlin]=fullbot[nlin]=0; } table[nlin] = alocv((ncol+2)*sizeof(table[0][0])); if (cstore[1]==0) switch(cstore[0]) { case '_': fullbot[nlin]= '-'; continue; case '=': fullbot[nlin]= '='; continue; } stynum[nlin] = nslin; nslin = min(nslin+1, nclin-1); for (icol = 0; icol <ncol; icol++) { table[nlin][icol].col = cstore; table[nlin][icol].rcol=0; ch=1; if (match(cstore, "T{")) /* text follows */ table[nlin][icol].col = gettext(cstore, nlin, icol, font[stynum[nlin]][icol], csize[stynum[nlin]][icol]); else { for(; (ch= *cstore) != '\0' && ch != tab; cstore++) ; *cstore++ = '\0'; switch(ctype(nlin,icol)) /* numerical or alpha, subcol */ { case 'n': table[nlin][icol].rcol = maknew(table[nlin][icol].col); break; case 'a': table[nlin][icol].rcol = table[nlin][icol].col; table[nlin][icol].col = ""; break; } } while (ctype(nlin,icol+1)== 's') /* spanning */ table[nlin][++icol].col = ""; if (ch == '\0') break; } while (++icol <ncol+2) { table[nlin][icol].col = ""; table [nlin][icol].rcol=0; } while (*cstore != '\0') cstore++; if (cstore-cspace > MAXCHS) cstore = cspace = chspace(); } last = cstore; permute(); if (textflg) untext(); return; } nodata(il) { int c; for (c=0; c<ncol;c++) { switch(ctype(il,c)) { case 'c': case 'n': case 'r': case 'l': case 's': case 'a': return(0); } } return(1); } oneh(lin) { int k, icol; k = ctype(lin,0); for(icol=1; icol<ncol; icol++) { if (k != ctype(nlin,icol)) return(0); } return(k); } # define SPAN "\\^" permute() { int irow, jcol, is, vv; char *start, *strig, *vo, *vn; for(jcol=0; jcol<ncol; jcol++) { for(irow=1; irow<nlin; irow++) { if (vspand(irow,jcol)) { is = prev(irow); start = table[is][jcol].col; strig = table[is][jcol].rcol; while (irow<nlin &&vspand(irow,jcol)) irow++; table[--irow][jcol].col = start; table[irow][jcol].rcol = strig; style[stynum[irow]][jcol] = ctype(is,jcol); vo = font[stynum[is]][jcol]; vn = font[stynum[irow]][jcol]; for(vv=0; vv<2; vv++) vn[vv]=vo[vv]; vo = csize[stynum[is]][jcol]; vn = csize[stynum[irow]][jcol]; for(vv=0; vv<4; vv++) vn[vv]=vo[vv]; while (is<irow) { table[is][jcol].rcol =0; table[is][jcol].col= SPAN; is = next(is); } } } } } vspand(ir,ij) { if (instead[ir]) return(0); if (ctype(ir,ij)=='^') return(1); if (table[ir][ij].rcol!=0) return(0); if (fullbot[ir]) return(0); return(vspen(table[ir][ij].col)); } vspen(s) char *s; { if (s==0) return(0); if (!point(s)) return(0); return(match(s, SPAN)); }