diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-12-30 10:26:00 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-12-30 10:26:00 +0000 |
commit | bb503db26691fd10d98793fe9960376cd9835add (patch) | |
tree | a75cb8b4dcf38ea8ba65a4b66737230945de3fb3 | |
parent | e875ab2ae5330f3a0ed3e650ab2ea07460c2266a (diff) | |
download | mandoc-bb503db26691fd10d98793fe9960376cd9835add.tar.gz |
Assign layout cells to parsed data. This follows primarily from
tbl.bsd.lv, although it has been reimplemented.
-rw-r--r-- | libroff.h | 2 | ||||
-rw-r--r-- | tbl_data.c | 31 |
2 files changed, 33 insertions, 0 deletions
@@ -61,6 +61,7 @@ struct tbl_row { }; struct tbl_dat { + struct tbl_cell *layout; /* layout cell: CAN BE NULL */ struct tbl_dat *next; char *string; int flags; @@ -71,6 +72,7 @@ struct tbl_dat { }; struct tbl_span { + struct tbl_row *layout; /* layout row: CAN BE NULL */ struct tbl_dat *first; struct tbl_dat *last; int flags; @@ -31,11 +31,25 @@ data(struct tbl *tbl, struct tbl_span *dp, int ln, const char *p, int *pos) { struct tbl_dat *dat; + struct tbl_cell *cp; int sv; + cp = NULL; + if (dp->last && dp->last->layout) + cp = dp->last->layout->next; + else if (NULL == dp->last) + cp = dp->layout->first; + + /* Skip over spanners to data formats. */ + + while (cp && (TBL_CELL_VERT == cp->pos || + TBL_CELL_DVERT == cp->pos)) + cp = cp->next; + /* FIXME: warn about losing data contents if cell is HORIZ. */ dat = mandoc_calloc(1, sizeof(struct tbl_dat)); + dat->layout = cp; if (dp->last) { dp->last->next = dat; @@ -70,6 +84,7 @@ int tbl_data(struct tbl *tbl, int ln, const char *p) { struct tbl_span *dp; + struct tbl_row *rp; int pos; pos = 0; @@ -79,7 +94,23 @@ tbl_data(struct tbl *tbl, int ln, const char *p) return(1); } + /* + * Choose a layout row: take the one following the last parsed + * span's. If that doesn't exist, use the last parsed span's. + * If there's no last parsed span, use the first row. This can + * be NULL! + */ + + if (tbl->last_span) { + assert(tbl->last_span->layout); + rp = tbl->last_span->layout->next; + if (NULL == rp) + rp = tbl->last_span->layout; + } else + rp = tbl->first_row; + dp = mandoc_calloc(1, sizeof(struct tbl_span)); + dp->layout = rp; if (tbl->last_span) { tbl->last_span->next = dp; |