diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-01-01 14:27:59 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-01-01 14:27:59 +0000 |
commit | b69ab451ca0beed4df1de5e4e0da97c747850198 (patch) | |
tree | 432a0d2c258d4ce0fb1d0cc7a46eee895cd7e595 /mdoc_term.c | |
parent | 1229fdd9d84784744b71813ed8b0845b20d4f2ee (diff) | |
download | mandoc-b69ab451ca0beed4df1de5e4e0da97c747850198.tar.gz |
Cleaned-up column handling to be char-compatible with groff (thanks Ingo Schwarze).
Fixed assertion in exceeded rmargin by ridiculous columns.
Diffstat (limited to 'mdoc_term.c')
-rw-r--r-- | mdoc_term.c | 62 |
1 files changed, 37 insertions, 25 deletions
diff --git a/mdoc_term.c b/mdoc_term.c index 6127a0d9..1540f08f 100644 --- a/mdoc_term.c +++ b/mdoc_term.c @@ -651,7 +651,7 @@ termp_it_pre(DECL_ARGS) const struct mdoc_node *bl, *nn; char buf[7]; int i, type, keys[3], vals[3]; - size_t width, offset; + size_t width, offset, ncols, dcol; if (MDOC_BLOCK == n->type) { print_bvspace(p, n->parent->parent, n); @@ -679,41 +679,52 @@ termp_it_pre(DECL_ARGS) type = arg_listtype(bl); assert(-1 != type); + if (vals[1] >= 0) + offset = a2offs(&bl->args->argv[vals[1]]); + /* Calculate real width and offset. */ switch (type) { case (MDOC_Column): if (MDOC_BODY == n->type) break; - /* - * Work around groff's column handling. The offset is - * equal to the sum of all widths leading to the current - * column (plus the -offset value). If this column - * exceeds the stated number of columns, the width is - * set as 0, else it's the stated column width (later - * the 0 will be adjusted to default 10 or, if in the - * last column case, set to stretch to the margin). + + /* + * Imitate groff's column handling. + * For each earlier column, add its width. + * For less than 5 columns, add two more blanks per column. + * For exactly 5 columns, add only one more blank per column. + * For more than 5 columns, add no blanks per column. */ - for (i = 0, nn = n->prev; nn && - i < (int)bl->args->argv[vals[2]].sz; - nn = nn->prev, i++) - offset += a2width - (&bl->args->argv[vals[2]], i); - - /* Whether exceeds maximum column. */ - if (i < (int)bl->args->argv[vals[2]].sz) - width = a2width(&bl->args->argv[vals[2]], i); - else - width = 0; + ncols = bl->args->argv[vals[2]].sz; + /* LINTED */ + dcol = ncols < 5 ? 2 : ncols == 5 ? 1 : 0; + for (i=0, nn=n->prev; nn && i < (int)ncols; nn=nn->prev, i++) + offset += a2width(&bl->args->argv[vals[2]], i) + dcol; - if (vals[1] >= 0) - offset += a2offs(&bl->args->argv[vals[1]]); + /* + * FIXME: newer groff only wants one space between + * columns > 5; however, a2width will have min. two + * spaces. For now, let this slide. + */ + + /* + * Use the declared column widths, + * extended as explained in the preceding paragraph. + */ + if (i < (int)ncols) + width = a2width(&bl->args->argv[vals[2]], i) + dcol; + + /* + * When exceeding the declared number of columns, + * leave the remaining widths at 0. + * This will later be adjusted to the default width of 10, + * or, for the last column, stretched to the right margin. + */ break; default: if (vals[0] >= 0) width = a2width(&bl->args->argv[vals[0]], 0); - if (vals[1] >= 0) - offset += a2offs(&bl->args->argv[vals[1]]); break; } @@ -898,7 +909,8 @@ termp_it_pre(DECL_ARGS) * right-most column is filled to the right margin. */ if (MDOC_HEAD == n->type && - MDOC_BODY == n->next->type) + MDOC_BODY == n->next->type && + p->rmargin < p->maxrmargin) p->rmargin = p->maxrmargin; break; default: |