-/* $Id: tbl_term.c,v 1.65 2018/11/29 23:08:13 schwarze Exp $ */
+/* $Id: tbl_term.c,v 1.68 2019/02/09 21:02:47 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
#include <string.h>
#include "mandoc.h"
+#include "tbl.h"
#include "out.h"
#include "term.h"
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;
+ int dvert, fc, horiz, lhori, rhori, uvert;
/* 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,
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. */
/* Set up the columns. */
tp->flags |= TERMP_MULTICOL;
+ tp->tcol->offset = offset;
horiz = 0;
switch (sp->pos) {
case TBL_SPAN_HORIZ:
(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;
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,
}
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);
}
(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);
}
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;
}