version 1.41, 2011/07/17 15:24:25 |
version 1.44, 2012/05/27 17:54:54 |
Line 69 a2roffsu(const char *src, struct roffsu *dst, enum rof |
|
Line 69 a2roffsu(const char *src, struct roffsu *dst, enum rof |
|
return(0); |
return(0); |
|
|
while (i < BUFSIZ) { |
while (i < BUFSIZ) { |
if ( ! isdigit((u_char)*src)) { |
if ( ! isdigit((unsigned char)*src)) { |
if ('.' != *src) |
if ('.' != *src) |
break; |
break; |
else if (hasd) |
else if (hasd) |
Line 144 tblcalc(struct rofftbl *tbl, const struct tbl_span *sp |
|
Line 144 tblcalc(struct rofftbl *tbl, const struct tbl_span *sp |
|
const struct tbl_dat *dp; |
const struct tbl_dat *dp; |
const struct tbl_head *hp; |
const struct tbl_head *hp; |
struct roffcol *col; |
struct roffcol *col; |
|
int spans; |
|
|
/* |
/* |
* Allocate the master column specifiers. These will hold the |
* Allocate the master column specifiers. These will hold the |
Line 160 tblcalc(struct rofftbl *tbl, const struct tbl_span *sp |
|
Line 161 tblcalc(struct rofftbl *tbl, const struct tbl_span *sp |
|
for ( ; sp; sp = sp->next) { |
for ( ; sp; sp = sp->next) { |
if (TBL_SPAN_DATA != sp->pos) |
if (TBL_SPAN_DATA != sp->pos) |
continue; |
continue; |
|
spans = 1; |
/* |
/* |
* Account for the data cells in the layout, matching it |
* Account for the data cells in the layout, matching it |
* to data cells in the data section. |
* to data cells in the data section. |
*/ |
*/ |
for (dp = sp->first; dp; dp = dp->next) { |
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); |
assert(dp->layout); |
col = &tbl->cols[dp->layout->head->ident]; |
col = &tbl->cols[dp->layout->head->ident]; |
tblcalc_data(tbl, col, sp->tbl, dp); |
tblcalc_data(tbl, col, sp->tbl, dp); |
} |
} |
} |
} |
|
|
/* |
|
* Calculate width of the spanners. These get one space for a |
|
* vertical line, two for a double-vertical line. |
|
*/ |
|
|
|
for ( ; hp; hp = hp->next) { |
|
col = &tbl->cols[hp->ident]; |
|
switch (hp->pos) { |
|
case (TBL_HEAD_VERT): |
|
col->width = (*tbl->len)(1, tbl->arg); |
|
break; |
|
case (TBL_HEAD_DVERT): |
|
col->width = (*tbl->len)(2, tbl->arg); |
|
break; |
|
default: |
|
break; |
|
} |
|
} |
|
} |
} |
|
|
static void |
static void |
|
|
tblcalc_literal(struct rofftbl *tbl, struct roffcol *col, |
tblcalc_literal(struct rofftbl *tbl, struct roffcol *col, |
const struct tbl_dat *dp) |
const struct tbl_dat *dp) |
{ |
{ |
size_t sz, bufsz, spsz; |
size_t sz; |
const char *str; |
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 : ""; |
str = dp->string ? dp->string : ""; |
sz = (*tbl->slen)(str, tbl->arg); |
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) |
if (col->width < sz) |
col->width = sz; |
col->width = sz; |
} |
} |
Line 280 tblcalc_number(struct rofftbl *tbl, struct roffcol *co |
|
Line 242 tblcalc_number(struct rofftbl *tbl, struct roffcol *co |
|
|
|
/* |
/* |
* First calculate number width and decimal place (last + 1 for |
* 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 |
* ours, make our size longer by that difference |
* (right-"shifting"); similarly, if ours is subsequent the |
* (right-"shifting"); similarly, if ours is subsequent the |
* stored, then extend the stored size by the difference. |
* stored, then extend the stored size by the difference. |
Line 307 tblcalc_number(struct rofftbl *tbl, struct roffcol *co |
|
Line 269 tblcalc_number(struct rofftbl *tbl, struct roffcol *co |
|
} else |
} else |
d = sz + psz; |
d = sz + psz; |
|
|
/* Padding. */ |
|
|
|
sz += (*tbl->len)(2, tbl->arg); |
|
d += (*tbl->len)(1, tbl->arg); |
|
|
|
/* Adjust the settings for this column. */ |
/* Adjust the settings for this column. */ |
|
|
if (col->decimal > d) { |
if (col->decimal > d) { |
Line 324 tblcalc_number(struct rofftbl *tbl, struct roffcol *co |
|
Line 281 tblcalc_number(struct rofftbl *tbl, struct roffcol *co |
|
col->width = sz; |
col->width = sz; |
if (d > col->decimal) |
if (d > col->decimal) |
col->decimal = d; |
col->decimal = d; |
|
|
/* Adjust for stipulated width. */ |
|
|
|
if (col->width < dp->layout->spacing) |
|
col->width = dp->layout->spacing; |
|
} |
} |
|
|
|
|