From 954789a256b33b8959f60aba1e516a62d7577dce Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Fri, 7 Jan 2011 14:59:52 +0000 Subject: Fixes: T} can be followed by a delimiter then more data. Make this work and add documentation for it. Also make tbl_term() not puke if the number of data cells is less than the number of layout cells (which happens from time to time). This still needs work because we should pad out empty cells so that the borders all work out. --- tbl.7 | 5 ++++- tbl_data.c | 20 ++++++++++++++++---- tbl_layout.c | 14 ++++++++++++++ tbl_term.c | 23 ++++++++++++----------- 4 files changed, 46 insertions(+), 16 deletions(-) diff --git a/tbl.7 b/tbl.7 index 0ca55816..79248986 100644 --- a/tbl.7 +++ b/tbl.7 @@ -277,7 +277,10 @@ If the last cell of a line is .Cm T{ , all subsequent lines are included as part of the cell until .Cm T} -is specified on its own line. +is specified as its own data cell. +It may then be followed by a tab +.Pq or as designated by Cm tab +or an end-of-line to terminate the row. .Sh COMPATIBILITY This section documents compatibility between mandoc and other .Nm diff --git a/tbl_data.c b/tbl_data.c index e0d80230..c036572f 100644 --- a/tbl_data.c +++ b/tbl_data.c @@ -118,15 +118,27 @@ tbl_cdata(struct tbl_node *tbl, int ln, const char *p) { struct tbl_dat *dat; size_t sz; + int pos; - if (0 == strcmp(p, "T}")) { - tbl->part = TBL_PART_DATA; - return(1); - } + pos = 0; dat = tbl->last_span->last; dat->pos = TBL_DATA_DATA; + if (p[pos] == 'T' && p[pos + 1] == '}') { + pos += 2; + if (p[pos] == tbl->opts.tab) { + tbl->part = TBL_PART_DATA; + pos++; + return(data(tbl, tbl->last_span, ln, p, &pos)); + } else if ('\0' == p[pos]) { + tbl->part = TBL_PART_DATA; + return(1); + } + + /* Fallthrough: T} is part of a word. */ + } + if (dat->string) { sz = strlen(p) + strlen(dat->string) + 2; dat->string = mandoc_realloc(dat->string, sz); diff --git a/tbl_layout.c b/tbl_layout.c index 20c774bc..50e9728d 100644 --- a/tbl_layout.c +++ b/tbl_layout.c @@ -90,6 +90,20 @@ mod: break; } + /* Throw away parenthesised expression. */ + + if ('(' == p[*pos]) { + (*pos)++; + while (p[*pos] && ')' != p[*pos]) + (*pos)++; + if (')' == p[*pos]) { + (*pos)++; + goto mod; + } + TBL_MSG(tbl, MANDOCERR_TBLLAYOUT, ln, *pos); + return(0); + } + /* Parse numerical spacing from modifier string. */ if (isdigit((unsigned char)p[*pos])) { diff --git a/tbl_term.c b/tbl_term.c index ab1a4f62..62573486 100644 --- a/tbl_term.c +++ b/tbl_term.c @@ -272,7 +272,7 @@ tbl_data(struct termp *tp, const struct tbl *tbl, break; } - pos = dp->layout ? dp->layout->pos : TBL_CELL_LEFT; + pos = dp && dp->layout ? dp->layout->pos : TBL_CELL_LEFT; switch (pos) { case (TBL_CELL_HORIZ): @@ -344,34 +344,37 @@ tbl_literal(struct termp *tp, const struct tbl_dat *dp, { size_t padl, padr, ssz; enum tbl_cellt pos; + const char *str; padl = padr = 0; - pos = dp->layout ? dp->layout->pos : TBL_CELL_LEFT; + pos = dp && dp->layout ? dp->layout->pos : TBL_CELL_LEFT; + str = dp && dp->string ? dp->string : ""; + ssz = term_len(tp, 1); switch (pos) { case (TBL_CELL_LONG): padl = ssz; - padr = col->width - term_strlen(tp, dp->string) - ssz; + padr = col->width - term_strlen(tp, str) - ssz; break; case (TBL_CELL_CENTRE): - padl = col->width - term_strlen(tp, dp->string); + padl = col->width - term_strlen(tp, str); if (padl % 2) padr++; padl /= 2; padr += padl; break; case (TBL_CELL_RIGHT): - padl = col->width - term_strlen(tp, dp->string); + padl = col->width - term_strlen(tp, str); break; default: - padr = col->width - term_strlen(tp, dp->string); + padr = col->width - term_strlen(tp, str); break; } tbl_char(tp, ASCII_NBRSP, padl); - term_word(tp, dp->string); + term_word(tp, str); tbl_char(tp, ASCII_NBRSP, padr); } @@ -391,9 +394,7 @@ tbl_number(struct termp *tp, const struct tbl *tbl, * and the maximum decimal; right-pad by the remaining amount. */ - str = ""; - if (dp->string) - str = dp->string; + str = dp && dp->string ? dp->string : ""; sz = term_strlen(tp, str); @@ -418,7 +419,7 @@ tbl_number(struct termp *tp, const struct tbl *tbl, padl = col->decimal - d; tbl_char(tp, ASCII_NBRSP, padl); - term_word(tp, dp->string); + term_word(tp, str); tbl_char(tp, ASCII_NBRSP, col->width - sz - padl); } -- cgit