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