summaryrefslogtreecommitdiff
path: root/usr.bin/mandoc/tbl_term.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2019-01-31 16:06:14 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2019-01-31 16:06:14 +0000
commit67e9e4bbfcb6b3a6d2dd6ab57915b05722035035 (patch)
tree96e27cf8e9d97a861913b286ece0aa18bc38cd66 /usr.bin/mandoc/tbl_term.c
parentb1a4429f71cbce9e9d567f38fe72070f3f2e7a71 (diff)
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).
Diffstat (limited to 'usr.bin/mandoc/tbl_term.c')
-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;
}