Skip to content

Commit

Permalink
When drawing a horizontal line in tbl(7) UTF-8 output, it is not
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
ischwarze committed Mar 16, 2019
1 parent c8e58a4 commit b3e6a32
Showing 1 changed file with 18 additions and 13 deletions.
31 changes: 18 additions & 13 deletions usr.bin/mandoc/tbl_term.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* $OpenBSD: tbl_term.c,v 1.56 2019/02/09 21:01:24 schwarze Exp $ */
/* $OpenBSD: tbl_term.c,v 1.57 2019/03/16 21:35:11 schwarze Exp $ */
/*
* Copyright (c) 2009, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011-2019 Ingo Schwarze <schwarze@openbsd.org>
Expand Down Expand Up @@ -44,7 +44,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 *,
Expand Down Expand Up @@ -220,9 +221,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. */
Expand Down Expand Up @@ -340,7 +341,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 :
Expand Down Expand Up @@ -555,12 +556,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);
Expand All @@ -569,17 +570,18 @@ 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;
}

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. */
Expand All @@ -590,6 +592,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) {
Expand All @@ -598,11 +601,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. */

Expand All @@ -618,7 +621,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. */

Expand All @@ -644,6 +647,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;
Expand All @@ -654,7 +659,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. */
Expand Down

0 comments on commit b3e6a32

Please sign in to comment.