summaryrefslogtreecommitdiffstats
path: root/out.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2011-09-20 23:05:49 +0000
committerIngo Schwarze <schwarze@openbsd.org>2011-09-20 23:05:49 +0000
commit8fc4fad7b7d7d55a4795fe5d53b3e37512c6ccc6 (patch)
treefbe4b7bf3529f2ec30f702af67b7894d51952491 /out.c
parentfe441512b43c423df68921dc8d83c637b18f9b3a (diff)
downloadmandoc-8fc4fad7b7d7d55a4795fe5d53b3e37512c6ccc6.tar.gz
Major rewrite of the horizontal spacing of tables
to work both with and without frames and rulers. ok kristaps@
Diffstat (limited to 'out.c')
-rw-r--r--out.c51
1 files changed, 10 insertions, 41 deletions
diff --git a/out.c b/out.c
index ee4217c1..ea0c5903 100644
--- a/out.c
+++ b/out.c
@@ -144,6 +144,7 @@ tblcalc(struct rofftbl *tbl, const struct tbl_span *sp)
const struct tbl_dat *dp;
const struct tbl_head *hp;
struct roffcol *col;
+ int spans;
/*
* Allocate the master column specifiers. These will hold the
@@ -160,11 +161,18 @@ tblcalc(struct rofftbl *tbl, const struct tbl_span *sp)
for ( ; sp; sp = sp->next) {
if (TBL_SPAN_DATA != sp->pos)
continue;
+ spans = 1;
/*
* Account for the data cells in the layout, matching it
* to data cells in the data section.
*/
for (dp = sp->first; dp; dp = dp->next) {
+ /* Do not used spanned cells in the calculation. */
+ if (0 < --spans)
+ continue;
+ spans = dp->spans;
+ if (1 < spans)
+ continue;
assert(dp->layout);
col = &tbl->cols[dp->layout->head->ident];
tblcalc_data(tbl, col, sp->tbl, dp);
@@ -231,39 +239,12 @@ static void
tblcalc_literal(struct rofftbl *tbl, struct roffcol *col,
const struct tbl_dat *dp)
{
- size_t sz, bufsz, spsz;
+ size_t sz;
const char *str;
- /*
- * Calculate our width and use the spacing, with a minimum
- * spacing dictated by position (centre, e.g,. gets a space on
- * either side, while right/left get a single adjacent space).
- */
-
- bufsz = spsz = 0;
str = dp->string ? dp->string : "";
sz = (*tbl->slen)(str, tbl->arg);
- /* FIXME: TBL_DATA_HORIZ et al.? */
-
- assert(dp->layout);
- switch (dp->layout->pos) {
- case (TBL_CELL_LONG):
- /* FALLTHROUGH */
- case (TBL_CELL_CENTRE):
- bufsz = (*tbl->len)(1, tbl->arg);
- break;
- default:
- bufsz = (*tbl->len)(1, tbl->arg);
- break;
- }
-
- if (dp->layout->spacing) {
- spsz = (*tbl->len)(dp->layout->spacing, tbl->arg);
- bufsz = bufsz > spsz ? bufsz : spsz;
- }
-
- sz += bufsz;
if (col->width < sz)
col->width = sz;
}
@@ -280,7 +261,7 @@ tblcalc_number(struct rofftbl *tbl, struct roffcol *col,
/*
* First calculate number width and decimal place (last + 1 for
- * no-decimal numbers). If the stored decimal is subsequent
+ * non-decimal numbers). If the stored decimal is subsequent to
* ours, make our size longer by that difference
* (right-"shifting"); similarly, if ours is subsequent the
* stored, then extend the stored size by the difference.
@@ -307,11 +288,6 @@ tblcalc_number(struct rofftbl *tbl, struct roffcol *col,
} else
d = sz + psz;
- /* Padding. */
-
- sz += (*tbl->len)(2, tbl->arg);
- d += (*tbl->len)(1, tbl->arg);
-
/* Adjust the settings for this column. */
if (col->decimal > d) {
@@ -324,11 +300,4 @@ tblcalc_number(struct rofftbl *tbl, struct roffcol *col,
col->width = sz;
if (d > col->decimal)
col->decimal = d;
-
- /* Adjust for stipulated width. */
-
- if (col->width < dp->layout->spacing)
- col->width = dp->layout->spacing;
}
-
-