1 /* 2 * Copyright 2003 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 7 /* All Rights Reserved */ 8 9 /* 10 * Copyright (c) 1980 Regents of the University of California. 11 * All rights reserved. The Berkeley software License Agreement 12 * specifies the terms and conditions for redistribution. 13 */ 14 15 #pragma ident "%Z%%M% %I% %E% SMI" 16 17 /* t5.c: read data for table */ 18 # include "t..c" 19 20 void permute(void); 21 22 void 23 gettbl(void) 24 { 25 int icol, ch; 26 cstore=cspace= chspace(); 27 textflg=0; 28 for (nlin=nslin=0; gets1(cstore, MAXSTR); nlin++) 29 { 30 stynum[nlin]=nslin; 31 if (prefix(".TE", cstore)) 32 { 33 leftover=0; 34 break; 35 } 36 if (prefix(".TC", cstore) || prefix(".T&", cstore)) 37 { 38 readspec(); 39 nslin++; 40 } 41 if (nlin>=MAXLIN) 42 { 43 leftover=cstore; 44 break; 45 } 46 fullbot[nlin]=0; 47 if (cstore[0] == '.' && !isdigit((unsigned char)cstore[1])) 48 { 49 instead[nlin] = cstore; 50 while (*cstore++); 51 continue; 52 } 53 else instead[nlin] = 0; 54 if (nodata(nlin)) 55 { 56 if (ch = oneh(nlin)) 57 fullbot[nlin]= ch; 58 nlin++; 59 nslin++; 60 instead[nlin]=(char *)0; 61 fullbot[nlin]=0; 62 } 63 table[nlin] = (struct colstr *) alocv((ncol+2)*sizeof(table[0][0])); 64 if (cstore[1]==0) 65 switch(cstore[0]) 66 { 67 case '_': fullbot[nlin]= '-'; continue; 68 case '=': fullbot[nlin]= '='; continue; 69 } 70 stynum[nlin] = nslin; 71 nslin = min(nslin+1, nclin-1); 72 for (icol = 0; icol <ncol; icol++) 73 { 74 table[nlin][icol].col = cstore; 75 table[nlin][icol].rcol=0; 76 ch=1; 77 if (match(cstore, "T{")) /* text follows */ 78 /* get_text was originally gettext and was renamed */ 79 table[nlin][icol].col = 80 (char *)get_text(cstore, nlin, icol, 81 font[stynum[nlin]][icol], 82 csize[stynum[nlin]][icol]); 83 else 84 { 85 for(; (ch= *cstore) != '\0' && ch != tab; cstore++) 86 ; 87 *cstore++ = '\0'; 88 switch(ctype(nlin,icol)) /* numerical or alpha, subcol */ 89 { 90 case 'n': 91 table[nlin][icol].rcol = 92 (char *)maknew(table[nlin][icol].col); 93 break; 94 case 'a': 95 table[nlin][icol].rcol = table[nlin][icol].col; 96 table[nlin][icol].col = ""; 97 break; 98 } 99 } 100 while (ctype(nlin,icol+1)== 's') /* spanning */ 101 table[nlin][++icol].col = ""; 102 if (ch == '\0') break; 103 } 104 while (++icol <ncol+2) 105 { 106 table[nlin][icol].col = ""; 107 table [nlin][icol].rcol=0; 108 } 109 while (*cstore != '\0') 110 cstore++; 111 if (cstore-cspace > MAXCHS) 112 cstore = cspace = chspace(); 113 } 114 last = cstore; 115 permute(); 116 if (textflg) untext(); 117 return; 118 } 119 120 int 121 nodata(int il) 122 { 123 int c; 124 for (c=0; c<ncol;c++) 125 { 126 switch(ctype(il,c)) 127 { 128 case 'c': case 'n': case 'r': case 'l': case 's': case 'a': 129 return(0); 130 } 131 } 132 return(1); 133 } 134 135 int 136 oneh(int lin) 137 { 138 int k, icol; 139 k = ctype(lin,0); 140 for(icol=1; icol<ncol; icol++) 141 { 142 if (k != ctype(lin,icol)) 143 return(0); 144 } 145 return(k); 146 } 147 148 # define SPAN "\\^" 149 150 void 151 permute(void) 152 { 153 int irow, jcol, is; 154 char *start, *strig; 155 for(jcol=0; jcol<ncol; jcol++) 156 { 157 for(irow=1; irow<nlin; irow++) 158 { 159 if (vspand(irow,jcol,0)) 160 { 161 is = prev(irow); 162 if (is<0) 163 error(gettext("Vertical spanning in first row not allowed")); 164 start = table[is][jcol].col; 165 strig = table[is][jcol].rcol; 166 while (irow<nlin &&vspand(irow,jcol,0)) 167 irow++; 168 table[--irow][jcol].col = start; 169 table[irow][jcol].rcol = strig; 170 while (is<irow) 171 { 172 table[is][jcol].rcol =0; 173 table[is][jcol].col= SPAN; 174 is = next(is); 175 } 176 } 177 } 178 } 179 } 180 181 int 182 vspand(int ir, int ij, int ifform) 183 { 184 if (ir<0) return(0); 185 if (ir>=nlin)return(0); 186 if (instead[ir]) return(0); 187 if (ifform==0 && ctype(ir,ij)=='^') return(1); 188 if (table[ir]==0) return(0); 189 if (table[ir][ij].rcol!=0) return(0); 190 if (fullbot[ir]) return(0); 191 return(vspen(table[ir][ij].col)); 192 } 193 194 int 195 vspen(char *s) 196 { 197 if (s==0) return(0); 198 if (!point(s)) return(0); 199 return(match(s, SPAN)); 200 } 201