summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorschwarze <schwarze@openbsd.org>2019-01-31 16:06:13 +0000
committerschwarze <schwarze@openbsd.org>2019-01-31 16:06:13 +0000
commit4aa95b9f11ec104a20c3402a76e76ab0cfb29a4e (patch)
tree22e8e54a4e9cb1bd0f6c4cd7b25fe52f032ce13e
parentmake struct chng.status a enum for readability. (diff)
downloadwireguard-openbsd-4aa95b9f11ec104a20c3402a76e76ab0cfb29a4e.tar.xz
wireguard-openbsd-4aa95b9f11ec104a20c3402a76e76ab0cfb29a4e.zip
Fix tbl(7) centering in mdoc(7) documents.
Since resetting of offsets works quite differently in the mdoc(7) and man(7) formatters, the tbl(7) formatter needs to save the global offset on entry and restore it on exit. The additional indentation needed for table centering has to be added to its own offset variable and applied to each line of the table, rather than only to the first. Bug found by bentley@ in emulators/fceux(6).
-rw-r--r--usr.bin/mandoc/tbl_term.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/usr.bin/mandoc/tbl_term.c b/usr.bin/mandoc/tbl_term.c
index 286bf065648..3b32fde266d 100644
--- a/usr.bin/mandoc/tbl_term.c
+++ b/usr.bin/mandoc/tbl_term.c
@@ -1,7 +1,7 @@
-/* $OpenBSD: tbl_term.c,v 1.54 2018/12/12 21:54:30 schwarze Exp $ */
+/* $OpenBSD: tbl_term.c,v 1.55 2019/01/31 16:06:13 schwarze Exp $ */
/*
* Copyright (c) 2009, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2011-2018 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2011-2019 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -161,6 +161,7 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
const struct tbl_cell *cp, *cpn, *cpp, *cps;
const struct tbl_dat *dp;
static size_t offset;
+ size_t save_offset;
size_t coloff, tsz;
int hspans, ic, more;
int dvert, fc, horiz, line, uvert;
@@ -168,6 +169,7 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
/* Inhibit printing of spaces: we do padding ourselves. */
tp->flags |= TERMP_NOSPACE | TERMP_NONOSPACE;
+ save_offset = tp->tcol->offset;
/*
* The first time we're invoked for a given table block,
@@ -209,8 +211,9 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
tsz += tp->tbl.cols[sp->opts->cols - 1].width;
if (offset + tsz > tp->tcol->rmargin)
tsz -= 1;
- tp->tcol->offset = offset + tp->tcol->rmargin > tsz ?
+ offset = offset + tp->tcol->rmargin > tsz ?
(offset + tp->tcol->rmargin - tsz) / 2 : 0;
+ tp->tcol->offset = offset;
}
/* Horizontal frame at the start of boxed tables. */
@@ -225,6 +228,7 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
/* Set up the columns. */
tp->flags |= TERMP_MULTICOL;
+ tp->tcol->offset = offset;
horiz = 0;
switch (sp->pos) {
case TBL_SPAN_HORIZ:
@@ -565,12 +569,12 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
assert(tp->tbl.cols);
free(tp->tbl.cols);
tp->tbl.cols = NULL;
- tp->tcol->offset = offset;
} 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);
+ tp->tcol->offset = save_offset;
tp->flags &= ~TERMP_NONOSPACE;
}