summaryrefslogtreecommitdiffstats
path: root/tbl_term.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2019-03-16 21:35:48 +0000
committerIngo Schwarze <schwarze@openbsd.org>2019-03-16 21:35:48 +0000
commit82eb7222138a9bd43ba13994fd04b6167d6d6ca5 (patch)
treec4e1bbcf7212216f9b4e3f93e5d6340b31cb5a86 /tbl_term.c
parentf71645a33de1fd3613e7f15842ede47c7492d79e (diff)
downloadmandoc-82eb7222138a9bd43ba13994fd04b6167d6d6ca5.tar.gz
When drawing a horizontal line in tbl(7) UTF-8 output, it is not
sufficient to look at two data rows, but up to three are needed: the one above to identify vertical lines branching off upward, the row itself (in case the line is in a data row rather than a layout line) to figure out the horizontal line style, and the row below to identify vertical lines branching off downward. As an example, bentley@ reported from the mpv(1) manual page that in a tbl(7) having a vertical line in the middle and a horizontal line in the bottom data row, the vertical line extended below the bottom horizontal line.
Diffstat (limited to 'tbl_term.c')
-rw-r--r--tbl_term.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/tbl_term.c b/tbl_term.c
index a0162847..f9a88091 100644
--- a/tbl_term.c
+++ b/tbl_term.c
@@ -46,7 +46,8 @@ static void tbl_fill_border(struct termp *, int, size_t);
static void tbl_fill_char(struct termp *, char, size_t);
static void tbl_fill_string(struct termp *, const char *, size_t);
static void tbl_hrule(struct termp *, const struct tbl_span *,
- const struct tbl_span *, int);
+ const struct tbl_span *, const struct tbl_span *,
+ int);
static void tbl_literal(struct termp *, const struct tbl_dat *,
const struct roffcol *);
static void tbl_number(struct termp *, const struct tbl_opts *,
@@ -222,9 +223,9 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
if (tp->enc == TERMENC_ASCII &&
sp->opts->opts & TBL_OPT_DBOX)
- tbl_hrule(tp, NULL, sp, TBL_OPT_DBOX);
+ tbl_hrule(tp, NULL, sp, sp, TBL_OPT_DBOX);
if (sp->opts->opts & (TBL_OPT_DBOX | TBL_OPT_BOX))
- tbl_hrule(tp, NULL, sp, TBL_OPT_BOX);
+ tbl_hrule(tp, NULL, sp, sp, TBL_OPT_BOX);
}
/* Set up the columns. */
@@ -342,7 +343,7 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
more = 0;
if (horiz)
- tbl_hrule(tp, sp->prev, sp, 0);
+ tbl_hrule(tp, sp->prev, sp, sp->next, 0);
else {
cp = sp->layout->first;
cpn = sp->next == NULL ? NULL :
@@ -557,12 +558,12 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
tp->tcol->rmargin = tp->maxrmargin;
if (sp->next == NULL) {
if (sp->opts->opts & (TBL_OPT_DBOX | TBL_OPT_BOX)) {
- tbl_hrule(tp, sp, NULL, TBL_OPT_BOX);
+ tbl_hrule(tp, sp, sp, NULL, TBL_OPT_BOX);
tp->skipvsp = 1;
}
if (tp->enc == TERMENC_ASCII &&
sp->opts->opts & TBL_OPT_DBOX) {
- tbl_hrule(tp, sp, NULL, TBL_OPT_DBOX);
+ tbl_hrule(tp, sp, sp, NULL, TBL_OPT_DBOX);
tp->skipvsp = 2;
}
assert(tp->tbl.cols);
@@ -571,7 +572,7 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
} else if (horiz == 0 && sp->opts->opts & TBL_OPT_ALLBOX &&
(sp->next == NULL || sp->next->pos == TBL_SPAN_DATA ||
sp->next->next != NULL))
- tbl_hrule(tp, sp, sp->next, TBL_OPT_ALLBOX);
+ tbl_hrule(tp, sp, sp, sp->next, TBL_OPT_ALLBOX);
tp->tcol->offset = save_offset;
tp->flags &= ~TERMP_NONOSPACE;
@@ -579,9 +580,10 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
static void
tbl_hrule(struct termp *tp, const struct tbl_span *spp,
- const struct tbl_span *spn, int flags)
+ const struct tbl_span *sp, const struct tbl_span *spn, int flags)
{
const struct tbl_cell *cpp; /* Layout cell above this line. */
+ const struct tbl_cell *cp; /* Layout cell in this line. */
const struct tbl_cell *cpn; /* Layout cell below this line. */
const struct tbl_dat *dpn; /* Data cell below this line. */
const struct roffcol *col; /* Contains width and spacing. */
@@ -592,6 +594,7 @@ tbl_hrule(struct termp *tp, const struct tbl_span *spp,
int uw, dw; /* Vertical line widths. */
cpp = spp == NULL ? NULL : spp->layout->first;
+ cp = sp == NULL ? NULL : sp->layout->first;
cpn = spn == NULL ? NULL : spn->layout->first;
dpn = NULL;
if (spn != NULL) {
@@ -600,11 +603,11 @@ tbl_hrule(struct termp *tp, const struct tbl_span *spp,
else if (spn->next != NULL)
dpn = spn->next->first;
}
- opts = spn == NULL ? spp->opts->opts : spn->opts->opts;
+ opts = sp->opts->opts;
bw = opts & TBL_OPT_DBOX ? (tp->enc == TERMENC_UTF8 ? 2 : 1) :
opts & (TBL_OPT_BOX | TBL_OPT_ALLBOX) ? 1 : 0;
hw = flags == TBL_OPT_DBOX || flags == TBL_OPT_BOX ? bw :
- spn->pos == TBL_SPAN_DHORIZ ? 2 : 1;
+ sp->pos == TBL_SPAN_DHORIZ ? 2 : 1;
/* Print the left end of the line. */
@@ -620,7 +623,7 @@ tbl_hrule(struct termp *tp, const struct tbl_span *spp,
cpn->pos != TBL_CELL_DOWN ? BRIGHT * hw : 0), 1);
for (;;) {
- col = tp->tbl.cols + (cpn == NULL ? cpp->col : cpn->col);
+ col = tp->tbl.cols + cp->col;
/* Print the horizontal line inside this column. */
@@ -646,6 +649,8 @@ tbl_hrule(struct termp *tp, const struct tbl_span *spp,
}
cpp = cpp->next;
}
+ if (cp != NULL)
+ cp = cp->next;
if (cpn != NULL) {
if (flags != TBL_OPT_DBOX) {
dw = cpn->vert;
@@ -656,7 +661,7 @@ tbl_hrule(struct termp *tp, const struct tbl_span *spp,
while (dpn != NULL && dpn->layout != cpn)
dpn = dpn->next;
}
- if (cpp == NULL && cpn == NULL)
+ if (cpp == NULL && cp == NULL && cpn == NULL)
break;
/* Vertical lines do not cross spanned cells. */