From 49803152fb211a06850fbee706084bf34a370704 Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Wed, 5 Jan 2011 15:37:23 +0000 Subject: Stuff tbl_calc() into out.c so that it can be shared by all output modes (isn't now, but will need to be, used by -T[x]html also). Necessitated a lot of churn in getting tbl_calc* code out of tbl_term.c and into out.c, including renaming some structures and so on. The abstraction is in having a pointer to a wrapper function for calculating string widths. The char devices use term_strlen and term_len; the others will probably just use strlen(). While at it, remove some superfluous assertions in the tbl code. This allows all tbl manuals to clear. Lastly, set the right-margin to be the maximum margin for each table span. This allows big, complicated tbl-pages like terminfo to be displayed. They're ugly, but they work. --- out.c | 202 +++++++++++++++++++++++++++++++++++ out.h | 39 ++++--- tbl_term.c | 348 ++++++++++++++++++------------------------------------------- term.h | 2 +- 4 files changed, 328 insertions(+), 263 deletions(-) diff --git a/out.c b/out.c index 09a7b989..9e89321f 100644 --- a/out.c +++ b/out.c @@ -27,8 +27,16 @@ #include #include +#include "mandoc.h" #include "out.h" +static void tblcalc_data(struct rofftbl *, struct roffcol *, + const struct tbl *, const struct tbl_dat *); +static void tblcalc_literal(struct rofftbl *, struct roffcol *, + const struct tbl_dat *); +static void tblcalc_number(struct rofftbl *, struct roffcol *, + const struct tbl *, const struct tbl_dat *); + /* * Convert a `scaling unit' to a consistent form, or fail. Scaling * units are documented in groff.7, mdoc.7, man.7. @@ -358,3 +366,197 @@ a2roffdeco(enum roffdeco *d, const char **word, size_t *sz) return(i); } + +/* + * Calculate the abstract widths and decimal positions of columns in a + * table. This routine allocates the columns structures then runs over + * all rows and cells in the table. The function pointers in "tbl" are + * used for the actual width calculations. + */ +void +tblcalc(struct rofftbl *tbl, const struct tbl_span *sp) +{ + const struct tbl_dat *dp; + const struct tbl_head *hp; + struct roffcol *col; + + /* + * Allocate the master column specifiers. These will hold the + * widths and decimal positions for all cells in the column. It + * must be freed and nullified by the caller. + */ + + assert(NULL == tbl->cols); + tbl->cols = calloc(sp->tbl->cols, sizeof(struct roffcol)); + + hp = sp->head; + + for ( ; sp; sp = sp->next) { + if (TBL_SPAN_DATA != sp->pos) + continue; + /* + * 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) { + if (NULL == dp->layout) + continue; + col = &tbl->cols[dp->layout->head->ident]; + 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 +tblcalc_data(struct rofftbl *tbl, struct roffcol *col, + const struct tbl *tp, const struct tbl_dat *dp) +{ + size_t sz; + + /* Branch down into data sub-types. */ + + switch (dp->layout->pos) { + case (TBL_CELL_HORIZ): + /* FALLTHROUGH */ + case (TBL_CELL_DHORIZ): + sz = (*tbl->len)(1, tbl->arg); + if (col->width < sz) + col->width = sz; + break; + case (TBL_CELL_LONG): + /* FALLTHROUGH */ + case (TBL_CELL_CENTRE): + /* FALLTHROUGH */ + case (TBL_CELL_LEFT): + /* FALLTHROUGH */ + case (TBL_CELL_RIGHT): + tblcalc_literal(tbl, col, dp); + break; + case (TBL_CELL_NUMBER): + tblcalc_number(tbl, col, tp, dp); + break; + default: + abort(); + /* NOTREACHED */ + } +} + +static void +tblcalc_literal(struct rofftbl *tbl, struct roffcol *col, + const struct tbl_dat *dp) +{ + size_t sz, bufsz, spsz; + + /* + * 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). + */ + + sz = bufsz = spsz = 0; + if (dp->string) + sz = (*tbl->slen)(dp->string, tbl->arg); + + assert(dp->layout); + switch (dp->layout->pos) { + case (TBL_CELL_LONG): + /* FALLTHROUGH */ + case (TBL_CELL_CENTRE): + bufsz = (*tbl->len)(2, 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; +} + +static void +tblcalc_number(struct rofftbl *tbl, struct roffcol *col, + const struct tbl *tp, const struct tbl_dat *dp) +{ + int i; + size_t sz, psz, ssz, d; + char *cp; + const char *str; + char buf[2]; + + /* TODO: use spacing modifier. */ + + /* + * First calculate number width and decimal place (last + 1 for + * no-decimal numbers). If the stored decimal is subsequent + * 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. + * Finally, re-assign the stored values. + */ + + str = ""; + if (dp->string) + str = dp->string; + + sz = (*tbl->slen)(str, tbl->arg); + + buf[0] = tp->decimal; + buf[1] = '\0'; + + psz = (*tbl->slen)(buf, tbl->arg); + + if (NULL != (cp = strchr(str, tp->decimal))) { + buf[1] = '\0'; + for (ssz = 0, i = 0; cp != &str[i]; i++) { + buf[0] = str[i]; + ssz += (*tbl->slen)(buf, tbl->arg); + } + d = ssz + psz; + } 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) { + sz += col->decimal - d; + d = col->decimal; + } else + col->width += d - col->decimal; + + if (sz > col->width) + col->width = sz; + if (d > col->decimal) + col->decimal = d; +} + + diff --git a/out.h b/out.h index ee91b3d4..9802389f 100644 --- a/out.h +++ b/out.h @@ -21,6 +21,21 @@ __BEGIN_DECLS +struct roffcol { + size_t width; /* width of cell */ + size_t decimal; /* decimal position in cell */ +}; + +typedef size_t (*tbl_strlen)(const char *, void *); +typedef size_t (*tbl_len)(size_t, void *); + +struct rofftbl { + tbl_strlen slen; /* calculate string length */ + tbl_len len; /* produce width of empty space */ + struct roffcol *cols; /* master column specifiers */ + void *arg; /* passed to slen and len */ +}; + enum roffscale { SCALE_CM, SCALE_IN, @@ -40,11 +55,11 @@ enum roffdeco { DECO_SPECIAL, /* special character */ DECO_SSPECIAL, /* single-char special */ DECO_RESERVED, /* reserved word */ - DECO_BOLD, - DECO_ITALIC, - DECO_ROMAN, - DECO_PREVIOUS, - DECO_NOSPACE, + DECO_BOLD, /* bold font */ + DECO_ITALIC, /* italic font */ + DECO_ROMAN, /* "normal" undecorated font */ + DECO_PREVIOUS, /* revert to previous font */ + DECO_NOSPACE, /* suppress spacing */ DECO_FONT, /* font */ DECO_FFONT, /* font family */ DECO_MAX @@ -55,10 +70,6 @@ struct roffsu { double scale; }; -#define SCALE_INVERT(p) \ - do { (p)->scale = -(p)->scale; } \ - while (/* CONSTCOND */ 0) - #define SCALE_VS_INIT(p, v) \ do { (p)->unit = SCALE_VS; \ (p)->scale = (v); } \ @@ -69,11 +80,11 @@ struct roffsu { (p)->scale = (v); } \ while (/* CONSTCOND */ 0) -int a2roffsu(const char *, - struct roffsu *, enum roffscale); -int a2roffdeco(enum roffdeco *, const char **, size_t *); -void time2a(time_t, char *, size_t); +int a2roffsu(const char *, struct roffsu *, enum roffscale); +int a2roffdeco(enum roffdeco *, const char **, size_t *); +void time2a(time_t, char *, size_t); +void tblcalc(struct rofftbl *tbl, const struct tbl_span *); __END_DECLS -#endif /*!HTML_H*/ +#endif /*!OUT_H*/ diff --git a/tbl_term.c b/tbl_term.c index de0b0652..0430577a 100644 --- a/tbl_term.c +++ b/tbl_term.c @@ -30,44 +30,49 @@ /* FIXME: `n' modifier doesn't always do the right thing. */ /* FIXME: `n' modifier doesn't use the cell-spacing buffer. */ -static inline void tbl_char(struct termp *, char, int); -static void tbl_hframe(struct termp *, - const struct tbl_span *); -static void tbl_data_number(struct termp *, - const struct tbl *, - const struct tbl_dat *, - const struct termp_tbl *); -static void tbl_data_literal(struct termp *, - const struct tbl_dat *, - const struct termp_tbl *); -static void tbl_data(struct termp *, const struct tbl *, - const struct tbl_dat *, - const struct termp_tbl *); -static void tbl_spanner(struct termp *, - const struct tbl_head *); -static void tbl_hrule(struct termp *, - const struct tbl_span *); -static void tbl_vframe(struct termp *, - const struct tbl *); -static void tbl_calc(struct termp *, - const struct tbl_span *); -static void tbl_calc_data(struct termp *, - const struct tbl *, - const struct tbl_dat *, - struct termp_tbl *); -static void tbl_calc_data_literal(struct termp *, - const struct tbl_dat *, - struct termp_tbl *); -static void tbl_calc_data_number(struct termp *, - const struct tbl *, - const struct tbl_dat *, - struct termp_tbl *); +static size_t term_tbl_len(size_t, void *); +static size_t term_tbl_strlen(const char *, void *); +static void tbl_char(struct termp *, char, int); +static void tbl_data(struct termp *, const struct tbl *, + const struct tbl_dat *, + const struct roffcol *); +static void tbl_hframe(struct termp *, const struct tbl_span *); +static void tbl_literal(struct termp *, const struct tbl_dat *, + const struct roffcol *); +static void tbl_number(struct termp *, const struct tbl *, + const struct tbl_dat *, + const struct roffcol *); +static void tbl_hrule(struct termp *, const struct tbl_span *); +static void tbl_vframe(struct termp *, const struct tbl *); +static void tbl_vrule(struct termp *, const struct tbl_head *); + + +static size_t +term_tbl_strlen(const char *p, void *arg) +{ + + return(term_strlen((const struct termp *)arg, p)); +} + +static size_t +term_tbl_len(size_t sz, void *arg) +{ + + return(term_len((const struct termp *)arg, sz)); +} void term_tbl(struct termp *tp, const struct tbl_span *sp) { - const struct tbl_head *hp; - const struct tbl_dat *dp; + const struct tbl_head *hp; + const struct tbl_dat *dp; + struct roffcol *col; + int rmargin, maxrmargin; + + rmargin = tp->rmargin; + maxrmargin = tp->maxrmargin; + + tp->rmargin = tp->maxrmargin = TERM_MAXMARGIN; /* Inhibit printing of spaces: we do padding ourselves. */ @@ -75,24 +80,18 @@ term_tbl(struct termp *tp, const struct tbl_span *sp) tp->flags |= TERMP_NOSPACE; /* - * The first time we're invoked for a given table block, create - * the termp_tbl structure. This contains the column - * configuration for the entire table, e.g., table-wide column - * width, decimal point, etc. + * The first time we're invoked for a given table block, + * calculate the table widths and decimal positions. */ if (TBL_SPAN_FIRST & sp->flags) { - assert(NULL == tp->tbl); - tp->tbl = calloc - (sp->tbl->cols, sizeof(struct termp_tbl)); - if (NULL == tp->tbl) { - perror(NULL); - exit(EXIT_FAILURE); - } - tbl_calc(tp, sp); - - /* Flush out any preceding data. */ term_flushln(tp); + + tp->tbl.len = term_tbl_len; + tp->tbl.slen = term_tbl_strlen; + tp->tbl.arg = tp; + + tblcalc(&tp->tbl, sp); } /* Horizontal frame at the start of boxed tables. */ @@ -124,13 +123,14 @@ term_tbl(struct termp *tp, const struct tbl_span *sp) case (TBL_HEAD_VERT): /* FALLTHROUGH */ case (TBL_HEAD_DVERT): - tbl_spanner(tp, hp); + tbl_vrule(tp, hp); continue; case (TBL_HEAD_DATA): break; } - tbl_data(tp, sp->tbl, dp, - &tp->tbl[hp->ident]); + + col = &tp->tbl.cols[hp->ident]; + tbl_data(tp, sp->tbl, dp, col); /* Go to the next data cell. */ if (dp) @@ -149,12 +149,14 @@ term_tbl(struct termp *tp, const struct tbl_span *sp) if (TBL_SPAN_LAST & sp->flags) { tbl_hframe(tp, sp); - assert(tp->tbl); - free(tp->tbl); - tp->tbl = NULL; + assert(tp->tbl.cols); + free(tp->tbl.cols); + tp->tbl.cols = NULL; } tp->flags &= ~TERMP_NONOSPACE; + tp->rmargin = rmargin; + tp->maxrmargin = maxrmargin; } @@ -178,7 +180,7 @@ tbl_hrule(struct termp *tp, const struct tbl_span *sp) /* FIXME: don't use `+' between data and a spanner! */ for (hp = sp->head; hp; hp = hp->next) { - width = tp->tbl[hp->ident].width; + width = tp->tbl.cols[hp->ident].width; switch (hp->pos) { case (TBL_HEAD_DATA): tbl_char(tp, c, width); @@ -217,7 +219,7 @@ tbl_hframe(struct termp *tp, const struct tbl_span *sp) if (TBL_OPT_DBOX & sp->tbl->opts) { term_word(tp, "+"); for (hp = sp->head; hp; hp = hp->next) { - width = tp->tbl[hp->ident].width; + width = tp->tbl.cols[hp->ident].width; tbl_char(tp, '-', width); } term_word(tp, "+"); @@ -226,7 +228,7 @@ tbl_hframe(struct termp *tp, const struct tbl_span *sp) term_word(tp, "+"); for (hp = sp->head; hp; hp = hp->next) { - width = tp->tbl[hp->ident].width; + width = tp->tbl.cols[hp->ident].width; switch (hp->pos) { case (TBL_HEAD_DATA): tbl_char(tp, '-', width); @@ -243,28 +245,28 @@ tbl_hframe(struct termp *tp, const struct tbl_span *sp) static void tbl_data(struct termp *tp, const struct tbl *tbl, const struct tbl_dat *dp, - const struct termp_tbl *tbp) + const struct roffcol *col) { enum tbl_cellt pos; if (NULL == dp) { - tbl_char(tp, ASCII_NBRSP, tbp->width); + tbl_char(tp, ASCII_NBRSP, col->width); return; } switch (dp->pos) { case (TBL_DATA_NONE): - tbl_char(tp, ASCII_NBRSP, tbp->width); + tbl_char(tp, ASCII_NBRSP, col->width); return; case (TBL_DATA_HORIZ): /* FALLTHROUGH */ case (TBL_DATA_NHORIZ): - tbl_char(tp, '-', tbp->width); + tbl_char(tp, '-', col->width); return; case (TBL_DATA_NDHORIZ): /* FALLTHROUGH */ case (TBL_DATA_DHORIZ): - tbl_char(tp, '=', tbp->width); + tbl_char(tp, '=', col->width); return; default: break; @@ -274,10 +276,10 @@ tbl_data(struct termp *tp, const struct tbl *tbl, switch (pos) { case (TBL_CELL_HORIZ): - tbl_char(tp, '-', tbp->width); + tbl_char(tp, '-', col->width); break; case (TBL_CELL_DHORIZ): - tbl_char(tp, '=', tbp->width); + tbl_char(tp, '=', col->width); break; case (TBL_CELL_LONG): /* FALLTHROUGH */ @@ -286,18 +288,19 @@ tbl_data(struct termp *tp, const struct tbl *tbl, case (TBL_CELL_LEFT): /* FALLTHROUGH */ case (TBL_CELL_RIGHT): - tbl_data_literal(tp, dp, tbp); + tbl_literal(tp, dp, col); break; case (TBL_CELL_NUMBER): - tbl_data_number(tp, tbl, dp, tbp); + tbl_number(tp, tbl, dp, col); break; default: abort(); /* NOTREACHED */ } } + static void -tbl_spanner(struct termp *tp, const struct tbl_head *hp) +tbl_vrule(struct termp *tp, const struct tbl_head *hp) { switch (hp->pos) { @@ -315,20 +318,16 @@ tbl_spanner(struct termp *tp, const struct tbl_head *hp) static void tbl_vframe(struct termp *tp, const struct tbl *tbl) { - /* Always just a single vertical line. */ if (TBL_OPT_BOX & tbl->opts || TBL_OPT_DBOX & tbl->opts) term_word(tp, "|"); } -static inline void +static void tbl_char(struct termp *tp, char c, int len) { int i, sz; - char cp[2]; - - cp[0] = c; - cp[1] = '\0'; + const char cp[2] = {c, '\0'}; sz = term_strlen(tp, cp); @@ -337,9 +336,8 @@ tbl_char(struct termp *tp, char c, int len) } static void -tbl_data_literal(struct termp *tp, - const struct tbl_dat *dp, - const struct termp_tbl *tblp) +tbl_literal(struct termp *tp, const struct tbl_dat *dp, + const struct roffcol *col) { int padl, padr, ssz; enum tbl_cellt pos; @@ -352,20 +350,20 @@ tbl_data_literal(struct termp *tp, switch (pos) { case (TBL_CELL_LONG): padl = ssz; - padr = tblp->width - term_strlen(tp, dp->string) - ssz; + padr = col->width - term_strlen(tp, dp->string) - ssz; break; case (TBL_CELL_CENTRE): - padl = tblp->width - term_strlen(tp, dp->string); + padl = col->width - term_strlen(tp, dp->string); if (padl % 2) padr++; padl /= 2; padr += padl; break; case (TBL_CELL_RIGHT): - padl = tblp->width - term_strlen(tp, dp->string); + padl = col->width - term_strlen(tp, dp->string); break; default: - padr = tblp->width - term_strlen(tp, dp->string); + padr = col->width - term_strlen(tp, dp->string); break; } @@ -375,140 +373,36 @@ tbl_data_literal(struct termp *tp, } static void -tbl_data_number(struct termp *tp, const struct tbl *tbl, +tbl_number(struct termp *tp, const struct tbl *tbl, const struct tbl_dat *dp, - const struct termp_tbl *tblp) + const struct roffcol *col) { - char *decp, buf[2]; - int d, padl, sz, psz, ssz, i; + char *cp; + char buf[2]; + const char *str; + size_t sz, psz, ssz, d, padl; + int i; /* * See calc_data_number(). Left-pad by taking the offset of our * and the maximum decimal; right-pad by the remaining amount. */ - sz = term_strlen(tp, dp->string); - psz = term_strlen(tp, "."); + str = ""; + if (dp->string) + str = dp->string; - if (NULL != (decp = strchr(dp->string, tbl->decimal))) { - buf[1] = '\0'; - for (ssz = i = 0; decp != &dp->string[i]; i++) { - buf[0] = dp->string[i]; - ssz += term_strlen(tp, buf); - } - d = ssz + psz; - } else - d = sz + psz; + sz = term_strlen(tp, str); - assert(d <= tblp->decimal); - assert(sz - d <= tblp->width - tblp->decimal); + buf[0] = tbl->decimal; + buf[1] = '\0'; - padl = tblp->decimal - d + term_len(tp, 1); - assert(tblp->width - sz - padl); + psz = term_strlen(tp, buf); - tbl_char(tp, ASCII_NBRSP, padl); - term_word(tp, dp->string); - tbl_char(tp, ASCII_NBRSP, tblp->width - sz - padl); -} - -static void -tbl_calc(struct termp *tp, const struct tbl_span *sp) -{ - const struct tbl_dat *dp; - const struct tbl_head *hp; - struct termp_tbl *p; - - /* Calculate width as the max of column cells' widths. */ - - hp = sp->head; - - for ( ; sp; sp = sp->next) { - if (TBL_SPAN_DATA != sp->pos) - continue; - - for (dp = sp->first; dp; dp = dp->next) { - if (NULL == dp->layout) - continue; - p = &tp->tbl[dp->layout->head->ident]; - tbl_calc_data(tp, sp->tbl, dp, p); - } - } - - /* Calculate width as the simple spanner value. */ - - for ( ; hp; hp = hp->next) - switch (hp->pos) { - case (TBL_HEAD_VERT): - tp->tbl[hp->ident].width = term_len(tp, 1); - break; - case (TBL_HEAD_DVERT): - tp->tbl[hp->ident].width = term_len(tp, 2); - break; - default: - break; - } -} - -static void -tbl_calc_data(struct termp *tp, const struct tbl *tbl, - const struct tbl_dat *dp, struct termp_tbl *tblp) -{ - int sz; - - /* Branch down into data sub-types. */ - - switch (dp->layout->pos) { - case (TBL_CELL_HORIZ): - /* FALLTHROUGH */ - case (TBL_CELL_DHORIZ): - sz = term_len(tp, 1); - if (tblp->width < sz) - tblp->width = sz; - break; - case (TBL_CELL_LONG): - /* FALLTHROUGH */ - case (TBL_CELL_CENTRE): - /* FALLTHROUGH */ - case (TBL_CELL_LEFT): - /* FALLTHROUGH */ - case (TBL_CELL_RIGHT): - tbl_calc_data_literal(tp, dp, tblp); - break; - case (TBL_CELL_NUMBER): - tbl_calc_data_number(tp, tbl, dp, tblp); - break; - default: - abort(); - /* NOTREACHED */ - } -} - -static void -tbl_calc_data_number(struct termp *tp, const struct tbl *tbl, - const struct tbl_dat *dp, struct termp_tbl *tblp) -{ - int sz, d, psz, i, ssz; - char *cp, buf[2]; - - /* - * First calculate number width and decimal place (last + 1 for - * no-decimal numbers). If the stored decimal is subsequent - * 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. - * Finally, re-assign the stored values. - */ - - /* TODO: use spacing modifier. */ - - assert(dp->string); - sz = term_strlen(tp, dp->string); - psz = term_strlen(tp, "."); - - if (NULL != (cp = strchr(dp->string, tbl->decimal))) { + if (NULL != (cp = strchr(str, tbl->decimal))) { buf[1] = '\0'; - for (ssz = i = 0; cp != &dp->string[i]; i++) { - buf[0] = dp->string[i]; + for (ssz = 0, i = 0; cp != &str[i]; i++) { + buf[0] = str[i]; ssz += term_strlen(tp, buf); } d = ssz + psz; @@ -516,54 +410,12 @@ tbl_calc_data_number(struct termp *tp, const struct tbl *tbl, d = sz + psz; sz += term_len(tp, 2); + d += term_len(tp, 1); - if (tblp->decimal > d) { - sz += tblp->decimal - d; - d = tblp->decimal; - } else - tblp->width += d - tblp->decimal; + padl = col->decimal - d; - if (sz > tblp->width) - tblp->width = sz; - if (d > tblp->decimal) - tblp->decimal = d; + tbl_char(tp, ASCII_NBRSP, padl); + term_word(tp, dp->string); + tbl_char(tp, ASCII_NBRSP, col->width - sz - padl); } -static void -tbl_calc_data_literal(struct termp *tp, - const struct tbl_dat *dp, - struct termp_tbl *tblp) -{ - int sz, bufsz, spsz; - - /* - * 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). - */ - - assert(dp->string); - sz = term_strlen(tp, dp->string); - - switch (dp->layout->pos) { - case (TBL_CELL_LONG): - /* FALLTHROUGH */ - case (TBL_CELL_CENTRE): - bufsz = term_len(tp, 2); - break; - default: - bufsz = term_len(tp, 1); - break; - } - - spsz = 0; - if (dp->layout->spacing) - spsz = term_len(tp, dp->layout->spacing); - - if (spsz) - bufsz = bufsz > spsz ? bufsz : spsz; - - sz += bufsz; - if (tblp->width < sz) - tblp->width = sz; -} diff --git a/term.h b/term.h index de6bbbaf..0ada6094 100644 --- a/term.h +++ b/term.h @@ -78,7 +78,7 @@ struct termp_tbl { struct termp { enum termtype type; - struct termp_tbl *tbl; /* table configuration */ + struct rofftbl tbl; /* table configuration */ size_t defrmargin; /* Right margin of the device. */ size_t rmargin; /* Current right margin. */ size_t maxrmargin; /* Max right margin. */ -- cgit