t6.c (7270B)
1 /* t6.c: compute tab stops */ 2 # define tx(a) (a>0 && a<128) 3 # include "t.h" 4 # define FN(i,c) font[c][stynum[i]] 5 # define SZ(i,c) csize[c][stynum[i]] 6 # define TMP1 S1 7 # define TMP2 S2 8 9 void 10 maktab(void) /* define the tab stops of the table */ 11 { 12 int icol, ilin, tsep, k, ik, vforml, il, s, text; 13 char *ss; 14 15 for (icol = 0; icol < ncol; icol++) { 16 doubled[icol] = acase[icol] = 0; 17 Bprint(&tabout, ".nr %2s 0\n", reg(icol, CRIGHT)); 18 for (text = 0; text < 2; text++) { 19 if (text) 20 Bprint(&tabout, ".%2s\n.rm %2s\n", reg(icol, CRIGHT), 21 reg(icol, CRIGHT)); 22 for (ilin = 0; ilin < nlin; ilin++) { 23 if (instead[ilin] || fullbot[ilin]) 24 continue; 25 vforml = ilin; 26 for (il = prev(ilin); il >= 0 && vspen(table[il][icol].col); il = prev(il)) 27 vforml = il; 28 if (fspan(vforml, icol)) 29 continue; 30 if (filler(table[ilin][icol].col)) 31 continue; 32 if ((flags[icol][stynum[ilin]] & ZEROW) != 0) 33 continue; 34 switch (ctype(vforml, icol)) { 35 case 'a': 36 acase[icol] = 1; 37 ss = table[ilin][icol].col; 38 s = (int)(uintptr)ss; 39 if (s > 0 && s < 128 && text) { 40 if (doubled[icol] == 0) 41 Bprint(&tabout, ".nr %d 0\n.nr %d 0\n", 42 S1, S2); 43 doubled[icol] = 1; 44 Bprint(&tabout, ".if \\n(%c->\\n(%d .nr %d \\n(%c-\n", 45 s, S2, S2, s); 46 } 47 case 'n': 48 if (table[ilin][icol].rcol != 0) { 49 if (doubled[icol] == 0 && text == 0) 50 Bprint(&tabout, ".nr %d 0\n.nr %d 0\n", 51 S1, S2); 52 doubled[icol] = 1; 53 if (real(ss = table[ilin][icol].col) && !vspen(ss)) { 54 s = (int)(uintptr)ss; 55 if (tx(s) != text) 56 continue; 57 Bprint(&tabout, ".nr %d ", TMP); 58 wide(ss, FN(vforml, icol), SZ(vforml, icol)); 59 Bprint(&tabout, "\n"); 60 Bprint(&tabout, ".if \\n(%d<\\n(%d .nr %d \\n(%d\n", 61 S1, TMP, S1, TMP); 62 } 63 if (text == 0 && real(ss = table[ilin][icol].rcol) && !vspen(ss) && !barent(ss)) { 64 Bprint(&tabout, ".nr %d \\w%c%s%c\n", 65 TMP, F1, ss, F1); 66 Bprint(&tabout, ".if \\n(%d<\\n(%d .nr %d \\n(%d\n", S2, TMP, S2, 67 TMP); 68 } 69 continue; 70 } 71 case 'r': 72 case 'c': 73 case 'l': 74 if (real(ss = table[ilin][icol].col) && !vspen(ss)) { 75 s = (int)(uintptr)ss; 76 if (tx(s) != text) 77 continue; 78 Bprint(&tabout, ".nr %d ", TMP); 79 wide(ss, FN(vforml, icol), SZ(vforml, icol)); 80 Bprint(&tabout, "\n"); 81 Bprint(&tabout, ".if \\n(%2s<\\n(%d .nr %2s \\n(%d\n", 82 reg(icol, CRIGHT), TMP, reg(icol, CRIGHT), TMP); 83 } 84 } 85 } 86 } 87 if (acase[icol]) { 88 Bprint(&tabout, ".if \\n(%d>=\\n(%2s .nr %2s \\n(%du+2n\n", 89 S2, reg(icol, CRIGHT), reg(icol, CRIGHT), S2); 90 } 91 if (doubled[icol]) { 92 Bprint(&tabout, ".nr %2s \\n(%d\n", reg(icol, CMID), S1); 93 Bprint(&tabout, ".nr %d \\n(%2s+\\n(%d\n", TMP, reg(icol, CMID), S2); 94 Bprint(&tabout, ".if \\n(%d>\\n(%2s .nr %2s \\n(%d\n", TMP, 95 reg(icol, CRIGHT), reg(icol, CRIGHT), TMP); 96 Bprint(&tabout, ".if \\n(%d<\\n(%2s .nr %2s +(\\n(%2s-\\n(%d)/2\n", 97 TMP, reg(icol, CRIGHT), reg(icol, CMID), reg(icol, CRIGHT), TMP); 98 } 99 if (cll[icol][0]) { 100 Bprint(&tabout, ".nr %d %sn\n", TMP, cll[icol]); 101 Bprint(&tabout, ".if \\n(%2s<\\n(%d .nr %2s \\n(%d\n", 102 reg(icol, CRIGHT), TMP, reg(icol, CRIGHT), TMP); 103 } 104 for (ilin = 0; ilin < nlin; ilin++) 105 if (k = lspan(ilin, icol)) { 106 ss = table[ilin][icol-k].col; 107 if (!real(ss) || barent(ss) || vspen(ss) ) 108 continue; 109 Bprint(&tabout, ".nr %d ", TMP); 110 wide(table[ilin][icol-k].col, FN(ilin, icol - k), SZ(ilin, icol - k)); 111 for (ik = k; ik >= 0; ik--) { 112 Bprint(&tabout, "-\\n(%2s", reg(icol - ik, CRIGHT)); 113 if (!expflg && ik > 0) 114 Bprint(&tabout, "-%dn", sep[icol-ik]); 115 } 116 Bprint(&tabout, "\n"); 117 Bprint(&tabout, ".if \\n(%d>0 .nr %d \\n(%d/%d\n", TMP, 118 TMP, TMP, k); 119 Bprint(&tabout, ".if \\n(%d<0 .nr %d 0\n", TMP, TMP); 120 for (ik = 1; ik <= k; ik++) { 121 if (doubled[icol-k+ik]) 122 Bprint(&tabout, ".nr %2s +\\n(%d/2\n", 123 reg(icol - k + ik, CMID), TMP); 124 Bprint(&tabout, ".nr %2s +\\n(%d\n", 125 reg(icol - k + ik, CRIGHT), TMP); 126 } 127 } 128 } 129 if (textflg) 130 untext(); 131 /* if even requested, make all columns widest width */ 132 if (evenflg) { 133 Bprint(&tabout, ".nr %d 0\n", TMP); 134 for (icol = 0; icol < ncol; icol++) { 135 if (evenup[icol] == 0) 136 continue; 137 Bprint(&tabout, ".if \\n(%2s>\\n(%d .nr %d \\n(%2s\n", 138 reg(icol, CRIGHT), TMP, TMP, reg(icol, CRIGHT)); 139 } 140 for (icol = 0; icol < ncol; icol++) { 141 if (evenup[icol] == 0) 142 /* if column not evened just retain old interval */ 143 continue; 144 if (doubled[icol]) 145 Bprint(&tabout, ".nr %2s (100*\\n(%2s/\\n(%2s)*\\n(%d/100\n", 146 reg(icol, CMID), reg(icol, CMID), reg(icol, CRIGHT), TMP); 147 /* that nonsense with the 100's and parens tries 148 to avoid overflow while proportionally shifting 149 the middle of the number */ 150 Bprint(&tabout, ".nr %2s \\n(%d\n", reg(icol, CRIGHT), TMP); 151 } 152 } 153 /* now adjust for total table width */ 154 for (tsep = icol = 0; icol < ncol; icol++) 155 tsep += sep[icol]; 156 if (expflg) { 157 Bprint(&tabout, ".nr %d 0", TMP); 158 for (icol = 0; icol < ncol; icol++) 159 Bprint(&tabout, "+\\n(%2s", reg(icol, CRIGHT)); 160 Bprint(&tabout, "\n"); 161 Bprint(&tabout, ".nr %d \\n(.l-\\n(%d\n", TMP, TMP); 162 if (boxflg || dboxflg || allflg) 163 /* tsep += 1; */ {} 164 else 165 tsep -= sep[ncol-1]; 166 Bprint(&tabout, ".nr %d \\n(%d/%d\n", TMP, TMP, tsep); 167 Bprint(&tabout, ".if \\n(%d<0 .nr %d 0\n", TMP, TMP); 168 } else 169 Bprint(&tabout, ".nr %d 1n\n", TMP); 170 Bprint(&tabout, ".nr %2s 0\n", reg(-1, CRIGHT)); 171 tsep = (boxflg || allflg || dboxflg || left1flg) ? 2 : 0; 172 if (sep[-1] >= 0) 173 tsep = sep[-1]; 174 for (icol = 0; icol < ncol; icol++) { 175 Bprint(&tabout, ".nr %2s \\n(%2s+((%d*\\n(%d)/2)\n", reg(icol, CLEFT), 176 reg(icol - 1, CRIGHT), tsep, TMP); 177 Bprint(&tabout, ".nr %2s +\\n(%2s\n", reg(icol, CRIGHT), reg(icol, CLEFT)); 178 if (doubled[icol]) { 179 /* the next line is last-ditch effort to avoid zero field width */ 180 /*Bprint(&tabout, ".if \\n(%2s=0 .nr %2s 1\n",reg(icol,CMID), reg(icol,CMID));*/ 181 Bprint(&tabout, ".nr %2s +\\n(%2s\n", reg(icol, CMID), 182 reg(icol, CLEFT)); 183 /* Bprint(&tabout, ".if n .if \\n(%s%%24>0 .nr %s +12u\n",reg(icol,CMID), reg(icol,CMID)); */ 184 } 185 tsep = sep[icol] * 2; 186 } 187 if (rightl) 188 Bprint(&tabout, ".nr %s (\\n(%s+\\n(%s)/2\n", reg(ncol - 1, CRIGHT), 189 reg(ncol - 1, CLEFT), reg(ncol - 2, CRIGHT)); 190 Bprint(&tabout, ".nr TW \\n(%2s\n", reg(ncol - 1, CRIGHT)); 191 tsep = sep[ncol-1]; 192 if (boxflg || allflg || dboxflg) 193 Bprint(&tabout, ".nr TW +((%d*\\n(%d)/2)\n", tsep, TMP); 194 Bprint(&tabout, 195 ".if t .if (\\n(TW+\\n(.o)>7.65i .tm Table at line %d file %s is too wide - \\n(TW units\n", iline - 1, ifile); 196 return; 197 } 198 199 200 void 201 wide(char *s, char *fn, char *size) 202 { 203 if (point(s)) { 204 Bprint(&tabout, "\\w%c", F1); 205 if (*fn > 0) 206 putfont(fn); 207 if (*size) 208 putsize(size); 209 Bprint(&tabout, "%s", s); 210 if (*fn > 0) 211 putfont("P"); 212 if (*size) 213 putsize("0"); 214 Bprint(&tabout, "%c", F1); 215 } else 216 Bprint(&tabout, "\\n(%c-", (int)(uintptr)s); 217 } 218 219 220 int 221 filler(char *s) 222 { 223 return (point(s) && s[0] == '\\' && s[1] == 'R'); 224 }