summaryrefslogtreecommitdiffstats
path: root/tbl_term.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2019-02-09 21:02:47 +0000
committerIngo Schwarze <schwarze@openbsd.org>2019-02-09 21:02:47 +0000
commita3e97e30f7b0752d324f2a8dc6da61bc6585b822 (patch)
tree09a68b9385d2b003a08d9b289a4ad22fdcb9bc62 /tbl_term.c
parent94abcff9fc6ce36fc492979c34aafd92f5440d71 (diff)
downloadmandoc-a3e97e30f7b0752d324f2a8dc6da61bc6585b822.tar.gz
The horizontal line in a data cell containing only "_" or "="
connects to the horizontally adjacent vertical line or cell; fixing a bug reported by bentley@.
Diffstat (limited to 'tbl_term.c')
-rw-r--r--tbl_term.c91
1 files changed, 44 insertions, 47 deletions
diff --git a/tbl_term.c b/tbl_term.c
index 7dbf5fa5..a0162847 100644
--- a/tbl_term.c
+++ b/tbl_term.c
@@ -166,7 +166,7 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
size_t save_offset;
size_t coloff, tsz;
int hspans, ic, more;
- int dvert, fc, horiz, line, uvert;
+ int dvert, fc, horiz, lhori, rhori, uvert;
/* Inhibit printing of spaces: we do padding ourselves. */
@@ -325,11 +325,13 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
(horiz || (IS_HORIZ(sp->layout->first) &&
!IS_HORIZ(sp->prev->layout->first))))
uvert = sp->prev->layout->vert;
- line = sp->pos == TBL_SPAN_DHORIZ ||
+ rhori = sp->pos == TBL_SPAN_DHORIZ ||
+ (sp->first != NULL && sp->first->pos == TBL_DATA_DHORIZ) ||
sp->layout->first->pos == TBL_CELL_DHORIZ ? 2 :
sp->pos == TBL_SPAN_HORIZ ||
+ (sp->first != NULL && sp->first->pos == TBL_DATA_HORIZ) ||
sp->layout->first->pos == TBL_CELL_HORIZ ? 1 : 0;
- fc = BUP * uvert + BDOWN * dvert + BRIGHT * line;
+ fc = BUP * uvert + BDOWN * dvert + BRIGHT * rhori;
if (uvert > 0 || dvert > 0 || (horiz && sp->opts->lvert)) {
(*tp->advance)(tp, tp->tcols->offset);
tp->viscol = tp->tcol->offset;
@@ -402,6 +404,15 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
cpn = cpn->next;
}
+ lhori = (cp != NULL &&
+ cp->pos == TBL_CELL_DHORIZ) ||
+ (dp != NULL &&
+ dp->pos == TBL_DATA_DHORIZ) ? 2 :
+ (cp != NULL &&
+ cp->pos == TBL_CELL_HORIZ) ||
+ (dp != NULL &&
+ dp->pos == TBL_DATA_HORIZ) ? 1 : 0;
+
/*
* Skip later cells in a span,
* figure out whether to start a span,
@@ -454,57 +465,36 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
}
while (tp->viscol < tp->tcol->rmargin +
tp->tbl.cols[ic].spacing / 2)
- tbl_direct_border(tp, fc, 1);
+ tbl_direct_border(tp,
+ BHORIZ * lhori, 1);
if (tp->tcol + 1 == tp->tcols + tp->lasttcol)
continue;
- if (cp != NULL) {
- switch (cp->pos) {
- case TBL_CELL_HORIZ:
- fc = BLEFT;
- break;
- case TBL_CELL_DHORIZ:
- fc = BLEFT * 2;
- break;
- default:
- fc = 0;
- break;
- }
+ if (cp != NULL)
cp = cp->next;
- }
- if (cp != NULL) {
- switch (cp->pos) {
- case TBL_CELL_HORIZ:
- fc += BRIGHT;
- break;
- case TBL_CELL_DHORIZ:
- fc += BRIGHT * 2;
- break;
- default:
- break;
- }
- }
+
+ rhori = (cp != NULL &&
+ cp->pos == TBL_CELL_DHORIZ) ||
+ (dp != NULL &&
+ dp->pos == TBL_DATA_DHORIZ) ? 2 :
+ (cp != NULL &&
+ cp->pos == TBL_CELL_HORIZ) ||
+ (dp != NULL &&
+ dp->pos == TBL_DATA_HORIZ) ? 1 : 0;
+
if (tp->tbl.cols[ic].spacing)
- tbl_direct_border(tp, fc +
+ tbl_direct_border(tp,
+ BLEFT * lhori + BRIGHT * rhori +
BUP * uvert + BDOWN * dvert, 1);
if (tp->enc == TERMENC_UTF8)
uvert = dvert = 0;
- if (fc != 0) {
- if (cp != NULL &&
- cp->pos == TBL_CELL_HORIZ)
- fc = BHORIZ;
- else if (cp != NULL &&
- cp->pos == TBL_CELL_DHORIZ)
- fc = BHORIZ * 2;
- else
- fc = 0;
- }
if (tp->tbl.cols[ic].spacing > 2 &&
- (uvert > 1 || dvert > 1 || fc != 0))
- tbl_direct_border(tp, fc +
+ (uvert > 1 || dvert > 1 || rhori))
+ tbl_direct_border(tp,
+ BHORIZ * rhori +
BUP * (uvert > 1) +
BDOWN * (dvert > 1), 1);
}
@@ -528,20 +518,27 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
(horiz || (IS_HORIZ(sp->layout->last) &&
!IS_HORIZ(sp->prev->layout->last))))
uvert = sp->prev->layout->last->vert;
- line = sp->pos == TBL_SPAN_DHORIZ ||
+ lhori = sp->pos == TBL_SPAN_DHORIZ ||
+ (sp->last != NULL &&
+ sp->last->pos == TBL_DATA_DHORIZ &&
+ sp->last->layout->col + 1 == sp->opts->cols) ||
(sp->layout->last->pos == TBL_CELL_DHORIZ &&
sp->layout->last->col + 1 == sp->opts->cols) ? 2 :
sp->pos == TBL_SPAN_HORIZ ||
+ (sp->last != NULL &&
+ sp->last->pos == TBL_DATA_HORIZ &&
+ sp->last->layout->col + 1 == sp->opts->cols) ||
(sp->layout->last->pos == TBL_CELL_HORIZ &&
sp->layout->last->col + 1 == sp->opts->cols) ? 1 : 0;
- fc = BUP * uvert + BDOWN * dvert + BLEFT * line;
+ fc = BUP * uvert + BDOWN * dvert + BLEFT * lhori;
if (uvert > 0 || dvert > 0 || (horiz && sp->opts->rvert)) {
if (horiz == 0 && (IS_HORIZ(sp->layout->last) == 0 ||
sp->layout->last->col + 1 < sp->opts->cols)) {
tp->tcol++;
- (*tp->advance)(tp,
- tp->tcol->offset > tp->viscol ?
- tp->tcol->offset - tp->viscol : 1);
+ do {
+ tbl_direct_border(tp,
+ BHORIZ * lhori, 1);
+ } while (tp->viscol < tp->tcol->offset);
}
tbl_direct_border(tp, fc, 1);
}