aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tbl_data.c
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
commitf4ef2b56c63e66af623a65be9e0bc802888eacb5 (patch)
tree49f83a74b669db2d2084b58fa77a132ff39b6e78 /tbl_data.c
parent106912a8afaf5d13433f9c31bf444d8c6c1361de (diff)
downloadmandoc-f4ef2b56c63e66af623a65be9e0bc802888eacb5.tar.gz
mandoc-f4ef2b56c63e66af623a65be9e0bc802888eacb5.tar.zst
mandoc-f4ef2b56c63e66af623a65be9e0bc802888eacb5.zip
Assign layout cells to parsed data. This follows primarily from
tbl.bsd.lv, although it has been reimplemented.
Diffstat (limited to 'tbl_data.c')
-rw-r--r--tbl_data.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/tbl_data.c b/tbl_data.c
index 3e89ca6a..a86cd295 100644
--- a/tbl_data.c
+++ b/tbl_data.c
@@ -1,4 +1,4 @@
-/* $Id: tbl_data.c,v 1.2 2010/12/30 09:34:07 kristaps Exp $ */
+/* $Id: tbl_data.c,v 1.3 2010/12/30 10:26:00 kristaps Exp $ */
/*
* Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -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;