version 1.21, 2011/01/25 12:24:27 |
version 1.26, 2013/05/31 21:37:17 |
|
|
#include "libmandoc.h" |
#include "libmandoc.h" |
#include "libroff.h" |
#include "libroff.h" |
|
|
static int data(struct tbl_node *, struct tbl_span *, |
static int data(struct tbl_node *, struct tbl_span *, |
int, const char *, int *); |
int, const char *, int *); |
static struct tbl_span *newspan(struct tbl_node *, struct tbl_row *); |
static struct tbl_span *newspan(struct tbl_node *, int, |
|
struct tbl_row *); |
|
|
|
|
static int |
static int |
data(struct tbl_node *tbl, struct tbl_span *dp, |
data(struct tbl_node *tbl, struct tbl_span *dp, |
int ln, const char *p, int *pos) |
int ln, const char *p, int *pos) |
Line 49 data(struct tbl_node *tbl, struct tbl_span *dp, |
|
Line 49 data(struct tbl_node *tbl, struct tbl_span *dp, |
|
cp = dp->layout->first; |
cp = dp->layout->first; |
|
|
/* |
/* |
* Skip over spanners and vertical lines to data formats, since |
* Skip over spanners, since |
* we want to match data with data layout cells in the header. |
* we want to match data with data layout cells in the header. |
*/ |
*/ |
|
|
while (cp && (TBL_CELL_VERT == cp->pos || |
while (cp && TBL_CELL_SPAN == cp->pos) |
TBL_CELL_DVERT == cp->pos || |
|
TBL_CELL_SPAN == cp->pos)) |
|
cp = cp->next; |
cp = cp->next; |
|
|
/* |
/* |
Line 64 data(struct tbl_node *tbl, struct tbl_span *dp, |
|
Line 62 data(struct tbl_node *tbl, struct tbl_span *dp, |
|
*/ |
*/ |
|
|
if (NULL == cp) { |
if (NULL == cp) { |
TBL_MSG(tbl, MANDOCERR_TBLEXTRADAT, ln, *pos); |
mandoc_msg(MANDOCERR_TBLEXTRADAT, |
|
tbl->parse, ln, *pos, NULL); |
/* Skip to the end... */ |
/* Skip to the end... */ |
while (p[*pos]) |
while (p[*pos]) |
(*pos)++; |
(*pos)++; |
Line 106 data(struct tbl_node *tbl, struct tbl_span *dp, |
|
Line 105 data(struct tbl_node *tbl, struct tbl_span *dp, |
|
return(0); |
return(0); |
} |
} |
|
|
dat->string = mandoc_malloc(*pos - sv + 1); |
assert(*pos - sv >= 0); |
memcpy(dat->string, &p[sv], *pos - sv); |
|
|
dat->string = mandoc_malloc((size_t)(*pos - sv + 1)); |
|
memcpy(dat->string, &p[sv], (size_t)(*pos - sv)); |
dat->string[*pos - sv] = '\0'; |
dat->string[*pos - sv] = '\0'; |
|
|
if (p[*pos]) |
if (p[*pos]) |
Line 128 data(struct tbl_node *tbl, struct tbl_span *dp, |
|
Line 129 data(struct tbl_node *tbl, struct tbl_span *dp, |
|
TBL_CELL_DHORIZ == dat->layout->pos || |
TBL_CELL_DHORIZ == dat->layout->pos || |
TBL_CELL_DOWN == dat->layout->pos) |
TBL_CELL_DOWN == dat->layout->pos) |
if (TBL_DATA_DATA == dat->pos && '\0' != *dat->string) |
if (TBL_DATA_DATA == dat->pos && '\0' != *dat->string) |
TBL_MSG(tbl, MANDOCERR_TBLIGNDATA, ln, sv); |
mandoc_msg(MANDOCERR_TBLIGNDATA, |
|
tbl->parse, ln, sv, NULL); |
|
|
return(1); |
return(1); |
} |
} |
Line 170 tbl_cdata(struct tbl_node *tbl, int ln, const char *p) |
|
Line 172 tbl_cdata(struct tbl_node *tbl, int ln, const char *p) |
|
dat->string = mandoc_strdup(p); |
dat->string = mandoc_strdup(p); |
|
|
if (TBL_CELL_DOWN == dat->layout->pos) |
if (TBL_CELL_DOWN == dat->layout->pos) |
TBL_MSG(tbl, MANDOCERR_TBLIGNDATA, ln, pos); |
mandoc_msg(MANDOCERR_TBLIGNDATA, |
|
tbl->parse, ln, pos, NULL); |
|
|
return(0); |
return(0); |
} |
} |
|
|
static struct tbl_span * |
static struct tbl_span * |
newspan(struct tbl_node *tbl, struct tbl_row *rp) |
newspan(struct tbl_node *tbl, int line, struct tbl_row *rp) |
{ |
{ |
struct tbl_span *dp; |
struct tbl_span *dp; |
|
|
dp = mandoc_calloc(1, sizeof(struct tbl_span)); |
dp = mandoc_calloc(1, sizeof(struct tbl_span)); |
dp->tbl = &tbl->opts; |
dp->line = line; |
|
dp->opts = &tbl->opts; |
dp->layout = rp; |
dp->layout = rp; |
dp->head = tbl->first_head; |
dp->head = tbl->first_head; |
|
|
Line 207 tbl_data(struct tbl_node *tbl, int ln, const char *p) |
|
Line 211 tbl_data(struct tbl_node *tbl, int ln, const char *p) |
|
pos = 0; |
pos = 0; |
|
|
if ('\0' == p[pos]) { |
if ('\0' == p[pos]) { |
TBL_MSG(tbl, MANDOCERR_TBL, ln, pos); |
mandoc_msg(MANDOCERR_TBL, tbl->parse, ln, pos, NULL); |
return(0); |
return(0); |
} |
} |
|
|
Line 226 tbl_data(struct tbl_node *tbl, int ln, const char *p) |
|
Line 230 tbl_data(struct tbl_node *tbl, int ln, const char *p) |
|
rp && rp->first; rp = rp->next) { |
rp && rp->first; rp = rp->next) { |
switch (rp->first->pos) { |
switch (rp->first->pos) { |
case (TBL_CELL_HORIZ): |
case (TBL_CELL_HORIZ): |
dp = newspan(tbl, rp); |
dp = newspan(tbl, ln, rp); |
dp->pos = TBL_SPAN_HORIZ; |
dp->pos = TBL_SPAN_HORIZ; |
continue; |
continue; |
case (TBL_CELL_DHORIZ): |
case (TBL_CELL_DHORIZ): |
dp = newspan(tbl, rp); |
dp = newspan(tbl, ln, rp); |
dp->pos = TBL_SPAN_DHORIZ; |
dp->pos = TBL_SPAN_DHORIZ; |
continue; |
continue; |
default: |
default: |
Line 248 tbl_data(struct tbl_node *tbl, int ln, const char *p) |
|
Line 252 tbl_data(struct tbl_node *tbl, int ln, const char *p) |
|
|
|
assert(rp); |
assert(rp); |
|
|
dp = newspan(tbl, rp); |
dp = newspan(tbl, ln, rp); |
|
|
if ( ! strcmp(p, "_")) { |
if ( ! strcmp(p, "_")) { |
dp->pos = TBL_SPAN_HORIZ; |
dp->pos = TBL_SPAN_HORIZ; |