version 1.102, 2009/11/12 05:50:12 |
version 1.106, 2010/01/01 14:32:52 |
Line 471 a2width(const struct mdoc_argv *arg, int pos) |
|
Line 471 a2width(const struct mdoc_argv *arg, int pos) |
|
if ( ! a2roffsu(arg->value[pos], &su, SCALE_MAX)) |
if ( ! a2roffsu(arg->value[pos], &su, SCALE_MAX)) |
SCALE_HS_INIT(&su, strlen(arg->value[pos])); |
SCALE_HS_INIT(&su, strlen(arg->value[pos])); |
|
|
/* XXX: pachemu? */ |
/* |
|
* This is a bit if a magic number on groff's part. Be careful |
|
* in changing it, as the MDOC_Column handler will subtract one |
|
* from this for >5 columns (don't go below zero!). |
|
*/ |
return(term_hspan(&su) + 2); |
return(term_hspan(&su) + 2); |
} |
} |
|
|
Line 651 termp_it_pre(DECL_ARGS) |
|
Line 655 termp_it_pre(DECL_ARGS) |
|
const struct mdoc_node *bl, *nn; |
const struct mdoc_node *bl, *nn; |
char buf[7]; |
char buf[7]; |
int i, type, keys[3], vals[3]; |
int i, type, keys[3], vals[3]; |
size_t width, offset; |
size_t width, offset, ncols; |
|
int dcol; |
|
|
if (MDOC_BLOCK == n->type) { |
if (MDOC_BLOCK == n->type) { |
print_bvspace(p, n->parent->parent, n); |
print_bvspace(p, n->parent->parent, n); |
Line 679 termp_it_pre(DECL_ARGS) |
|
Line 684 termp_it_pre(DECL_ARGS) |
|
type = arg_listtype(bl); |
type = arg_listtype(bl); |
assert(-1 != type); |
assert(-1 != type); |
|
|
|
if (vals[1] >= 0) |
|
offset = a2offs(&bl->args->argv[vals[1]]); |
|
|
/* Calculate real width and offset. */ |
/* Calculate real width and offset. */ |
|
|
switch (type) { |
switch (type) { |
case (MDOC_Column): |
case (MDOC_Column): |
if (MDOC_BODY == n->type) |
if (MDOC_BODY == n->type) |
break; |
break; |
/* |
|
* Work around groff's column handling. The offset is |
/* |
* equal to the sum of all widths leading to the current |
* Imitate groff's column handling. |
* column (plus the -offset value). If this column |
* For each earlier column, add its width. |
* exceeds the stated number of columns, the width is |
* For less than 5 columns, add two more blanks per column. |
* set as 0, else it's the stated column width (later |
* For exactly 5 columns, add only one more blank per column. |
* the 0 will be adjusted to default 10 or, if in the |
* For more than 5 columns, SUBTRACT one column. We can |
* last column case, set to stretch to the margin). |
* do this because a2width() pads exactly 2 spaces. |
*/ |
*/ |
for (i = 0, nn = n->prev; nn && |
ncols = bl->args->argv[vals[2]].sz; |
i < (int)bl->args->argv[vals[2]].sz; |
dcol = ncols < 5 ? 2 : ncols == 5 ? 1 : -1; |
nn = nn->prev, i++) |
for (i=0, nn=n->prev; nn && i < (int)ncols; nn=nn->prev, i++) |
offset += a2width |
offset += a2width(&bl->args->argv[vals[2]], i) + |
(&bl->args->argv[vals[2]], i); |
(size_t)dcol; |
|
|
/* Whether exceeds maximum column. */ |
/* |
if (i < (int)bl->args->argv[vals[2]].sz) |
* Use the declared column widths, |
width = a2width(&bl->args->argv[vals[2]], i); |
* extended as explained in the preceding paragraph. |
else |
*/ |
width = 0; |
if (i < (int)ncols) |
|
width = a2width(&bl->args->argv[vals[2]], i) + |
|
(size_t)dcol; |
|
|
if (vals[1] >= 0) |
/* |
offset += a2offs(&bl->args->argv[vals[1]]); |
* 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; |
break; |
default: |
default: |
if (vals[0] >= 0) |
if (vals[0] >= 0) |
width = a2width(&bl->args->argv[vals[0]], 0); |
width = a2width(&bl->args->argv[vals[0]], 0); |
if (vals[1] >= 0) |
|
offset += a2offs(&bl->args->argv[vals[1]]); |
|
break; |
break; |
} |
} |
|
|
Line 898 termp_it_pre(DECL_ARGS) |
|
Line 910 termp_it_pre(DECL_ARGS) |
|
* right-most column is filled to the right margin. |
* right-most column is filled to the right margin. |
*/ |
*/ |
if (MDOC_HEAD == n->type && |
if (MDOC_HEAD == n->type && |
MDOC_BODY == n->next->type) |
MDOC_BODY == n->next->type && |
|
p->rmargin < p->maxrmargin) |
p->rmargin = p->maxrmargin; |
p->rmargin = p->maxrmargin; |
break; |
break; |
default: |
default: |
Line 1020 termp_fl_pre(DECL_ARGS) |
|
Line 1033 termp_fl_pre(DECL_ARGS) |
|
|
|
term_fontpush(p, TERMFONT_BOLD); |
term_fontpush(p, TERMFONT_BOLD); |
term_word(p, "\\-"); |
term_word(p, "\\-"); |
p->flags |= TERMP_NOSPACE; |
|
|
/* A blank `Fl' should incur a subsequent space. */ |
|
|
|
if (n->child) |
|
p->flags |= TERMP_NOSPACE; |
|
|
return(1); |
return(1); |
} |
} |
|
|