summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-12-30 10:26:00 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-12-30 10:26:00 +0000
commitbb503db26691fd10d98793fe9960376cd9835add (patch)
treea75cb8b4dcf38ea8ba65a4b66737230945de3fb3
parente875ab2ae5330f3a0ed3e650ab2ea07460c2266a (diff)
downloadmandoc-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.h2
-rw-r--r--tbl_data.c31
2 files changed, 33 insertions, 0 deletions
diff --git a/libroff.h b/libroff.h
index c593644e..e310275c 100644
--- a/libroff.h
+++ b/libroff.h
@@ -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;
diff --git a/tbl_data.c b/tbl_data.c
index d5089d22..e0de6235 100644
--- a/tbl_data.c
+++ b/tbl_data.c
@@ -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;