| /* tu.c: draws horizontal lines */ |
| # include "t.h" |
| |
| void |
| makeline(int i, int c, int lintype) |
| { |
| int cr, type, shortl; |
| |
| type = thish(i, c); |
| if (type == 0) |
| return; |
| shortl = (table[i][c].col[0] == '\\'); |
| if (c > 0 && !shortl && thish(i, c - 1) == type) |
| return; |
| if (shortl == 0) |
| for (cr = c; cr < ncol && (ctype(i, cr) == 's' || type == thish(i, cr)); cr++) |
| ; |
| else |
| for (cr = c + 1; cr < ncol && ctype(i, cr) == 's'; cr++) |
| ; |
| drawline(i, c, cr - 1, lintype, 0, shortl); |
| } |
| |
| |
| void |
| fullwide(int i, int lintype) |
| { |
| int cr, cl; |
| |
| if (!pr1403) |
| Bprint(&tabout, ".nr %d \\n(.v\n.vs \\n(.vu-\\n(.sp\n", SVS); |
| cr = 0; |
| while (cr < ncol) { |
| cl = cr; |
| while (i > 0 && vspand(prev(i), cl, 1)) |
| cl++; |
| for (cr = cl; cr < ncol; cr++) |
| if (i > 0 && vspand(prev(i), cr, 1)) |
| break; |
| if (cl < ncol) |
| drawline(i, cl, (cr < ncol ? cr - 1 : cr), lintype, 1, 0); |
| } |
| Bprint(&tabout, "\n"); |
| if (!pr1403) |
| Bprint(&tabout, ".vs \\n(%du\n", SVS); |
| } |
| |
| |
| void |
| drawline(int i, int cl, int cr, int lintype, int noheight, int shortl) |
| { |
| char *exhr, *exhl, *lnch; |
| int lcount, ln, linpos, oldpos, nodata; |
| |
| lcount = 0; |
| exhr = exhl = ""; |
| switch (lintype) { |
| case '-': |
| lcount = 1; |
| break; |
| case '=': |
| lcount = pr1403 ? 1 : 2; |
| break; |
| case SHORTLINE: |
| lcount = 1; |
| break; |
| } |
| if (lcount <= 0) |
| return; |
| nodata = cr - cl >= ncol || noheight || allh(i); |
| if (!nodata) |
| Bprint(&tabout, "\\v'-.5m'"); |
| for (ln = oldpos = 0; ln < lcount; ln++) { |
| linpos = 2 * ln - lcount + 1; |
| if (linpos != oldpos) |
| Bprint(&tabout, "\\v'%dp'", linpos - oldpos); |
| oldpos = linpos; |
| if (shortl == 0) { |
| tohcol(cl); |
| if (lcount > 1) { |
| switch (interv(i, cl)) { |
| case TOP: |
| exhl = ln == 0 ? "1p" : "-1p"; |
| break; |
| case BOT: |
| exhl = ln == 1 ? "1p" : "-1p"; |
| break; |
| case THRU: |
| exhl = "1p"; |
| break; |
| } |
| if (exhl[0]) |
| Bprint(&tabout, "\\h'%s'", exhl); |
| } else if (lcount == 1) { |
| switch (interv(i, cl)) { |
| case TOP: |
| case BOT: |
| exhl = "-1p"; |
| break; |
| case THRU: |
| exhl = "1p"; |
| break; |
| } |
| if (exhl[0]) |
| Bprint(&tabout, "\\h'%s'", exhl); |
| } |
| if (lcount > 1) { |
| switch (interv(i, cr + 1)) { |
| case TOP: |
| exhr = ln == 0 ? "-1p" : "+1p"; |
| break; |
| case BOT: |
| exhr = ln == 1 ? "-1p" : "+1p"; |
| break; |
| case THRU: |
| exhr = "-1p"; |
| break; |
| } |
| } else if (lcount == 1) { |
| switch (interv(i, cr + 1)) { |
| case TOP: |
| case BOT: |
| exhr = "+1p"; |
| break; |
| case THRU: |
| exhr = "-1p"; |
| break; |
| } |
| } |
| } else |
| Bprint(&tabout, "\\h'|\\n(%2su'", reg(cl, CLEFT)); |
| Bprint(&tabout, "\\s\\n(%d", LSIZE); |
| if (linsize) |
| Bprint(&tabout, "\\v'-\\n(%dp/6u'", LSIZE); |
| if (shortl) |
| Bprint(&tabout, "\\l'|\\n(%2su'", reg(cr, CRIGHT)); |
| else |
| { |
| lnch = "\\(ul"; |
| if (pr1403) |
| lnch = lintype == 2 ? "=" : "\\(ru"; |
| if (cr + 1 >= ncol) |
| Bprint(&tabout, "\\l'|\\n(TWu%s%s'", exhr, lnch); |
| else |
| Bprint(&tabout, "\\l'(|\\n(%2su+|\\n(%2su)/2u%s%s'", reg(cr, CRIGHT), |
| reg(cr + 1, CLEFT), exhr, lnch); |
| } |
| if (linsize) |
| Bprint(&tabout, "\\v'\\n(%dp/6u'", LSIZE); |
| Bprint(&tabout, "\\s0"); |
| } |
| if (oldpos != 0) |
| Bprint(&tabout, "\\v'%dp'", -oldpos); |
| if (!nodata) |
| Bprint(&tabout, "\\v'+.5m'"); |
| } |
| |
| |
| void |
| getstop(void) |
| { |
| int i, c, k, junk, stopp; |
| |
| stopp = 1; |
| for (i = 0; i < MAXLIN; i++) |
| linestop[i] = 0; |
| for (i = 0; i < nlin; i++) |
| for (c = 0; c < ncol; c++) { |
| k = left(i, c, &junk); |
| if (k >= 0 && linestop[k] == 0) |
| linestop[k] = ++stopp; |
| } |
| if (boxflg || allflg || dboxflg) |
| linestop[0] = 1; |
| } |
| |
| |
| int |
| left(int i, int c, int *lwidp) |
| { |
| int kind, li, lj; |
| /* returns -1 if no line to left */ |
| /* returns number of line where it starts */ |
| /* stores into lwid the kind of line */ |
| *lwidp = 0; |
| if (i < 0) |
| return(-1); |
| kind = lefdata(i, c); |
| if (kind == 0) |
| return(-1); |
| if (i + 1 < nlin) |
| if (lefdata(next(i), c) == kind) |
| return(-1); |
| li = i; |
| while (i >= 0 && lefdata(i, c) == kind) |
| i = prev(li = i); |
| if (prev(li) == -1) |
| li = 0; |
| *lwidp = kind; |
| for (lj = i + 1; lj < li; lj++) |
| if (instead[lj] && strcmp(instead[lj], ".TH") == 0) |
| return(li); |
| for (i = i + 1; i < li; i++) |
| if (fullbot[i]) |
| li = i; |
| return(li); |
| } |
| |
| |
| int |
| lefdata(int i, int c) |
| { |
| int ck; |
| |
| if (i >= nlin) |
| i = nlin - 1; |
| if (ctype(i, c) == 's') { |
| for (ck = c; ctype(i, ck) == 's'; ck--) |
| ; |
| if (thish(i, ck) == 0) |
| return(0); |
| } |
| i = stynum[i]; |
| i = lefline[c][i]; |
| if (i > 0) |
| return(i); |
| if (dboxflg && c == 0) |
| return(2); |
| if (allflg) |
| return(1); |
| if (boxflg && c == 0) |
| return(1); |
| return(0); |
| } |
| |
| |
| int |
| next(int i) |
| { |
| while (i + 1 < nlin) { |
| i++; |
| if (!fullbot[i] && !instead[i]) |
| break; |
| } |
| return(i); |
| } |
| |
| |
| int |
| prev(int i) |
| { |
| while (--i >= 0 && (fullbot[i] || instead[i])) |
| ; |
| return(i); |
| } |
| |
| |