version 1.43, 2017/06/16 20:01:06 |
version 1.44, 2017/07/04 21:08:29 |
Line 196 tbl_data(struct tbl_node *tbl, int ln, const char *p, |
|
Line 196 tbl_data(struct tbl_node *tbl, int ln, const char *p, |
|
{ |
{ |
struct tbl_row *rp; |
struct tbl_row *rp; |
struct tbl_cell *cp; |
struct tbl_cell *cp; |
struct tbl_span *sp, *spi; |
struct tbl_span *sp; |
struct tbl_dat *dp; |
|
int have_data, spans; |
|
|
|
rp = (sp = tbl->last_span) == NULL ? tbl->first_row : |
rp = (sp = tbl->last_span) == NULL ? tbl->first_row : |
sp->pos == TBL_SPAN_DATA && sp->layout->next != NULL ? |
sp->pos == TBL_SPAN_DATA && sp->layout->next != NULL ? |
Line 206 tbl_data(struct tbl_node *tbl, int ln, const char *p, |
|
Line 204 tbl_data(struct tbl_node *tbl, int ln, const char *p, |
|
|
|
assert(rp != NULL); |
assert(rp != NULL); |
|
|
sp = newspan(tbl, ln, rp); |
|
|
|
if ( ! strcmp(p, "_")) { |
if ( ! strcmp(p, "_")) { |
|
sp = newspan(tbl, ln, rp); |
sp->pos = TBL_SPAN_HORIZ; |
sp->pos = TBL_SPAN_HORIZ; |
return; |
return; |
} else if ( ! strcmp(p, "=")) { |
} else if ( ! strcmp(p, "=")) { |
|
sp = newspan(tbl, ln, rp); |
sp->pos = TBL_SPAN_DHORIZ; |
sp->pos = TBL_SPAN_DHORIZ; |
return; |
return; |
} |
} |
sp->pos = TBL_SPAN_DATA; |
|
|
|
while (p[pos] != '\0') |
|
getdata(tbl, sp, ln, p, &pos); |
|
|
|
/* |
/* |
* If this span contains some data, |
* If the layout row contains nothing but horizontal lines, |
* make sure at least part of it gets printed. |
* allocate an empty span for it and assign the current span |
|
* to the next layout row accepting data. |
*/ |
*/ |
|
|
have_data = 0; |
while (rp->next != NULL) { |
cp = rp->first; |
if (rp->last->col + 1 < tbl->opts.cols) |
for (dp = sp->first; dp != NULL; dp = dp->next) { |
break; |
if (dp->pos == TBL_DATA_DATA && *dp->string != '\0') { |
for (cp = rp->first; cp != NULL; cp = cp->next) |
if (cp == NULL || |
if (cp->pos != TBL_CELL_HORIZ && |
(cp->pos != TBL_CELL_HORIZ && |
cp->pos != TBL_CELL_DHORIZ) |
cp->pos != TBL_CELL_DHORIZ)) |
break; |
return; |
if (cp != NULL) |
have_data = 1; |
break; |
} |
sp = newspan(tbl, ln, rp); |
spans = dp->spans; |
sp->pos = TBL_SPAN_DATA; |
while (spans-- >= 0) { |
rp = rp->next; |
if (cp != NULL) |
|
cp = cp->next; |
|
} |
|
} |
} |
if (have_data == 0 || rp->next == NULL) |
|
return; |
|
|
|
/* |
/* Process a real data row. */ |
* There is some data, but it would all get lost |
|
* due to horizontal lines in the layout. |
|
* Insert an empty span to consume the layout row. |
|
*/ |
|
|
|
tbl->last_span = sp->prev; |
sp = newspan(tbl, ln, rp); |
spi = newspan(tbl, ln, rp); |
sp->pos = TBL_SPAN_DATA; |
spi->pos = TBL_SPAN_DATA; |
while (p[pos] != '\0') |
spi->next = sp; |
getdata(tbl, sp, ln, p, &pos); |
tbl->last_span = sp; |
|
sp->prev = spi; |
|
sp->layout = rp->next; |
|
cp = sp->layout->first; |
|
for (dp = sp->first; dp != NULL; dp = dp->next) { |
|
dp->layout = cp; |
|
dp->spans = 0; |
|
if (cp != NULL) |
|
cp = cp->next; |
|
while (cp != NULL && cp->pos == TBL_CELL_SPAN) { |
|
dp->spans++; |
|
cp = cp->next; |
|
} |
|
} |
|
} |
} |