tu.c (4777B)
1 /* tu.c: draws horizontal lines */ 2 # include "t.h" 3 4 void 5 makeline(int i, int c, int lintype) 6 { 7 int cr, type, shortl; 8 9 type = thish(i, c); 10 if (type == 0) 11 return; 12 shortl = (table[i][c].col[0] == '\\'); 13 if (c > 0 && !shortl && thish(i, c - 1) == type) 14 return; 15 if (shortl == 0) 16 for (cr = c; cr < ncol && (ctype(i, cr) == 's' || type == thish(i, cr)); cr++) 17 ; 18 else 19 for (cr = c + 1; cr < ncol && ctype(i, cr) == 's'; cr++) 20 ; 21 drawline(i, c, cr - 1, lintype, 0, shortl); 22 } 23 24 25 void 26 fullwide(int i, int lintype) 27 { 28 int cr, cl; 29 30 if (!pr1403) 31 Bprint(&tabout, ".nr %d \\n(.v\n.vs \\n(.vu-\\n(.sp\n", SVS); 32 cr = 0; 33 while (cr < ncol) { 34 cl = cr; 35 while (i > 0 && vspand(prev(i), cl, 1)) 36 cl++; 37 for (cr = cl; cr < ncol; cr++) 38 if (i > 0 && vspand(prev(i), cr, 1)) 39 break; 40 if (cl < ncol) 41 drawline(i, cl, (cr < ncol ? cr - 1 : cr), lintype, 1, 0); 42 } 43 Bprint(&tabout, "\n"); 44 if (!pr1403) 45 Bprint(&tabout, ".vs \\n(%du\n", SVS); 46 } 47 48 49 void 50 drawline(int i, int cl, int cr, int lintype, int noheight, int shortl) 51 { 52 char *exhr, *exhl, *lnch; 53 int lcount, ln, linpos, oldpos, nodata; 54 55 lcount = 0; 56 exhr = exhl = ""; 57 switch (lintype) { 58 case '-': 59 lcount = 1; 60 break; 61 case '=': 62 lcount = pr1403 ? 1 : 2; 63 break; 64 case SHORTLINE: 65 lcount = 1; 66 break; 67 } 68 if (lcount <= 0) 69 return; 70 nodata = cr - cl >= ncol || noheight || allh(i); 71 if (!nodata) 72 Bprint(&tabout, "\\v'-.5m'"); 73 for (ln = oldpos = 0; ln < lcount; ln++) { 74 linpos = 2 * ln - lcount + 1; 75 if (linpos != oldpos) 76 Bprint(&tabout, "\\v'%dp'", linpos - oldpos); 77 oldpos = linpos; 78 if (shortl == 0) { 79 tohcol(cl); 80 if (lcount > 1) { 81 switch (interv(i, cl)) { 82 case TOP: 83 exhl = ln == 0 ? "1p" : "-1p"; 84 break; 85 case BOT: 86 exhl = ln == 1 ? "1p" : "-1p"; 87 break; 88 case THRU: 89 exhl = "1p"; 90 break; 91 } 92 if (exhl[0]) 93 Bprint(&tabout, "\\h'%s'", exhl); 94 } else if (lcount == 1) { 95 switch (interv(i, cl)) { 96 case TOP: 97 case BOT: 98 exhl = "-1p"; 99 break; 100 case THRU: 101 exhl = "1p"; 102 break; 103 } 104 if (exhl[0]) 105 Bprint(&tabout, "\\h'%s'", exhl); 106 } 107 if (lcount > 1) { 108 switch (interv(i, cr + 1)) { 109 case TOP: 110 exhr = ln == 0 ? "-1p" : "+1p"; 111 break; 112 case BOT: 113 exhr = ln == 1 ? "-1p" : "+1p"; 114 break; 115 case THRU: 116 exhr = "-1p"; 117 break; 118 } 119 } else if (lcount == 1) { 120 switch (interv(i, cr + 1)) { 121 case TOP: 122 case BOT: 123 exhr = "+1p"; 124 break; 125 case THRU: 126 exhr = "-1p"; 127 break; 128 } 129 } 130 } else 131 Bprint(&tabout, "\\h'|\\n(%2su'", reg(cl, CLEFT)); 132 Bprint(&tabout, "\\s\\n(%d", LSIZE); 133 if (linsize) 134 Bprint(&tabout, "\\v'-\\n(%dp/6u'", LSIZE); 135 if (shortl) 136 Bprint(&tabout, "\\l'|\\n(%2su'", reg(cr, CRIGHT)); 137 else 138 { 139 lnch = "\\(ul"; 140 if (pr1403) 141 lnch = lintype == 2 ? "=" : "\\(ru"; 142 if (cr + 1 >= ncol) 143 Bprint(&tabout, "\\l'|\\n(TWu%s%s'", exhr, lnch); 144 else 145 Bprint(&tabout, "\\l'(|\\n(%2su+|\\n(%2su)/2u%s%s'", reg(cr, CRIGHT), 146 reg(cr + 1, CLEFT), exhr, lnch); 147 } 148 if (linsize) 149 Bprint(&tabout, "\\v'\\n(%dp/6u'", LSIZE); 150 Bprint(&tabout, "\\s0"); 151 } 152 if (oldpos != 0) 153 Bprint(&tabout, "\\v'%dp'", -oldpos); 154 if (!nodata) 155 Bprint(&tabout, "\\v'+.5m'"); 156 } 157 158 159 void 160 getstop(void) 161 { 162 int i, c, k, junk, stopp; 163 164 stopp = 1; 165 for (i = 0; i < MAXLIN; i++) 166 linestop[i] = 0; 167 for (i = 0; i < nlin; i++) 168 for (c = 0; c < ncol; c++) { 169 k = left(i, c, &junk); 170 if (k >= 0 && linestop[k] == 0) 171 linestop[k] = ++stopp; 172 } 173 if (boxflg || allflg || dboxflg) 174 linestop[0] = 1; 175 } 176 177 178 int 179 left(int i, int c, int *lwidp) 180 { 181 int kind, li, lj; 182 /* returns -1 if no line to left */ 183 /* returns number of line where it starts */ 184 /* stores into lwid the kind of line */ 185 *lwidp = 0; 186 if (i < 0) 187 return(-1); 188 kind = lefdata(i, c); 189 if (kind == 0) 190 return(-1); 191 if (i + 1 < nlin) 192 if (lefdata(next(i), c) == kind) 193 return(-1); 194 li = i; 195 while (i >= 0 && lefdata(i, c) == kind) 196 i = prev(li = i); 197 if (prev(li) == -1) 198 li = 0; 199 *lwidp = kind; 200 for (lj = i + 1; lj < li; lj++) 201 if (instead[lj] && strcmp(instead[lj], ".TH") == 0) 202 return(li); 203 for (i = i + 1; i < li; i++) 204 if (fullbot[i]) 205 li = i; 206 return(li); 207 } 208 209 210 int 211 lefdata(int i, int c) 212 { 213 int ck; 214 215 if (i >= nlin) 216 i = nlin - 1; 217 if (ctype(i, c) == 's') { 218 for (ck = c; ctype(i, ck) == 's'; ck--) 219 ; 220 if (thish(i, ck) == 0) 221 return(0); 222 } 223 i = stynum[i]; 224 i = lefline[c][i]; 225 if (i > 0) 226 return(i); 227 if (dboxflg && c == 0) 228 return(2); 229 if (allflg) 230 return(1); 231 if (boxflg && c == 0) 232 return(1); 233 return(0); 234 } 235 236 237 int 238 next(int i) 239 { 240 while (i + 1 < nlin) { 241 i++; 242 if (!fullbot[i] && !instead[i]) 243 break; 244 } 245 return(i); 246 } 247 248 249 int 250 prev(int i) 251 { 252 while (--i >= 0 && (fullbot[i] || instead[i])) 253 ; 254 return(i); 255 }