From 0d8fbcc4ac721403309bd5d810f4a97a7474cf0a Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Tue, 25 Jan 2011 12:16:22 +0000 Subject: Do not skip data after horizontal lines in the layout. Instead, let one line of input data add two new spans to the tbl tree during one single call of tbl_data(). Note that this causes the horizontal line to get parsed into the tbl tree, but not yet used in the output, which will be fixed next. Avoids data loss in cpu(4/hppa). ok kristaps@ --- tbl_data.c | 62 +++++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 17 deletions(-) (limited to 'tbl_data.c') diff --git a/tbl_data.c b/tbl_data.c index 980a584c..0b8646e0 100644 --- a/tbl_data.c +++ b/tbl_data.c @@ -1,6 +1,7 @@ -/* $Id: tbl_data.c,v 1.19 2011/01/11 14:12:01 kristaps Exp $ */ +/* $Id: tbl_data.c,v 1.20 2011/01/25 12:16:22 schwarze Exp $ */ /* - * Copyright (c) 2009, 2010 Kristaps Dzonsons + * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons + * Copyright (c) 2011 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -30,6 +31,8 @@ static int data(struct tbl_node *, struct tbl_span *, int, const char *, int *); +static struct tbl_span *newspan(struct tbl_node *, struct tbl_row *); + static int data(struct tbl_node *tbl, struct tbl_span *dp, @@ -172,6 +175,27 @@ tbl_cdata(struct tbl_node *tbl, int ln, const char *p) return(0); } +static struct tbl_span * +newspan(struct tbl_node *tbl, struct tbl_row *rp) +{ + struct tbl_span *dp; + + dp = mandoc_calloc(1, sizeof(struct tbl_span)); + dp->tbl = &tbl->opts; + dp->layout = rp; + dp->head = tbl->first_head; + + if (tbl->last_span) { + tbl->last_span->next = dp; + tbl->last_span = dp; + } else { + tbl->last_span = tbl->first_span = dp; + dp->flags |= TBL_SPAN_FIRST; + } + + return(dp); +} + int tbl_data(struct tbl_node *tbl, int ln, const char *p) { @@ -196,9 +220,24 @@ tbl_data(struct tbl_node *tbl, int ln, const char *p) if (tbl->last_span) { assert(tbl->last_span->layout); - if (tbl->last_span->pos == TBL_SPAN_DATA) - rp = tbl->last_span->layout->next; - else + if (tbl->last_span->pos == TBL_SPAN_DATA) { + for (rp = tbl->last_span->layout->next; + rp && rp->first; rp = rp->next) { + switch (rp->first->pos) { + case (TBL_CELL_HORIZ): + dp = newspan(tbl, rp); + dp->pos = TBL_SPAN_HORIZ; + continue; + case (TBL_CELL_DHORIZ): + dp = newspan(tbl, rp); + dp->pos = TBL_SPAN_DHORIZ; + continue; + default: + break; + } + break; + } + } else rp = tbl->last_span->layout; if (NULL == rp) @@ -208,18 +247,7 @@ tbl_data(struct tbl_node *tbl, int ln, const char *p) assert(rp); - dp = mandoc_calloc(1, sizeof(struct tbl_span)); - dp->tbl = &tbl->opts; - dp->layout = rp; - dp->head = tbl->first_head; - - if (tbl->last_span) { - tbl->last_span->next = dp; - tbl->last_span = dp; - } else { - tbl->last_span = tbl->first_span = dp; - dp->flags |= TBL_SPAN_FIRST; - } + dp = newspan(tbl, rp); if ( ! strcmp(p, "_")) { dp->pos = TBL_SPAN_HORIZ; -- cgit v1.2.3