summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tbl.75
-rw-r--r--tbl_data.c20
-rw-r--r--tbl_layout.c14
-rw-r--r--tbl_term.c23
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);
}