version 1.9, 2011/01/02 12:04:23 |
version 1.13, 2011/01/07 13:20:58 |
|
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
*/ |
*/ |
|
#ifdef HAVE_CONFIG_H |
|
#include "config.h" |
|
#endif |
|
|
#include <assert.h> |
#include <assert.h> |
#include <ctype.h> |
#include <ctype.h> |
#include <stdlib.h> |
#include <stdlib.h> |
|
|
#include "libmandoc.h" |
#include "libmandoc.h" |
#include "libroff.h" |
#include "libroff.h" |
|
|
static void data(struct tbl_node *, struct tbl_span *, |
static int data(struct tbl_node *, struct tbl_span *, |
int, const char *, int *); |
int, const char *, int *); |
|
|
void |
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 41 data(struct tbl_node *tbl, struct tbl_span *dp, |
|
Line 45 data(struct tbl_node *tbl, struct tbl_span *dp, |
|
else if (NULL == dp->last) |
else if (NULL == dp->last) |
cp = dp->layout->first; |
cp = dp->layout->first; |
|
|
/* Skip over spanners to data formats. */ |
/* |
|
* Skip over spanners and vertical lines to data formats, since |
|
* we want to match data with data layout cells in the header. |
|
*/ |
|
|
while (cp && (TBL_CELL_VERT == cp->pos || |
while (cp && (TBL_CELL_VERT == cp->pos || |
TBL_CELL_DVERT == cp->pos)) |
TBL_CELL_DVERT == cp->pos || |
|
TBL_CELL_SPAN == cp->pos)) |
cp = cp->next; |
cp = cp->next; |
|
|
/* FIXME: warn about losing data contents if cell is HORIZ. */ |
|
|
|
dat = mandoc_calloc(1, sizeof(struct tbl_dat)); |
dat = mandoc_calloc(1, sizeof(struct tbl_dat)); |
dat->layout = cp; |
dat->layout = cp; |
|
dat->pos = TBL_DATA_NONE; |
|
|
if (NULL == dat->layout) |
if (NULL == dat->layout) |
TBL_MSG(tbl, MANDOCERR_TBLEXTRADAT, ln, *pos); |
TBL_MSG(tbl, MANDOCERR_TBLEXTRADAT, ln, *pos); |
Line 65 data(struct tbl_node *tbl, struct tbl_span *dp, |
|
Line 72 data(struct tbl_node *tbl, struct tbl_span *dp, |
|
while (p[*pos] && p[*pos] != tbl->opts.tab) |
while (p[*pos] && p[*pos] != tbl->opts.tab) |
(*pos)++; |
(*pos)++; |
|
|
|
/* |
|
* Check for a continued-data scope opening. This consists of a |
|
* trailing `T{' at the end of the line. Subsequent lines, |
|
* until a standalone `T}', are included in our cell. |
|
*/ |
|
|
|
if (*pos - sv == 2 && 'T' == p[sv] && '{' == p[sv + 1]) { |
|
tbl->part = TBL_PART_CDATA; |
|
return(0); |
|
} |
|
|
dat->string = mandoc_malloc(*pos - sv + 1); |
dat->string = mandoc_malloc(*pos - sv + 1); |
memcpy(dat->string, &p[sv], *pos - sv); |
memcpy(dat->string, &p[sv], *pos - sv); |
dat->string[*pos - sv] = '\0'; |
dat->string[*pos - sv] = '\0'; |
Line 82 data(struct tbl_node *tbl, struct tbl_span *dp, |
|
Line 100 data(struct tbl_node *tbl, struct tbl_span *dp, |
|
dat->pos = TBL_DATA_NDHORIZ; |
dat->pos = TBL_DATA_NDHORIZ; |
else |
else |
dat->pos = TBL_DATA_DATA; |
dat->pos = TBL_DATA_DATA; |
|
|
|
if (NULL == dat->layout) |
|
return(1); |
|
|
|
if (TBL_CELL_HORIZ == dat->layout->pos || |
|
TBL_CELL_DHORIZ == dat->layout->pos) |
|
if (TBL_DATA_DATA == dat->pos && '\0' != *dat->string) |
|
TBL_MSG(tbl, MANDOCERR_TBLIGNDATA, ln, sv); |
|
|
|
return(1); |
} |
} |
|
|
|
/* ARGSUSED */ |
int |
int |
|
tbl_cdata(struct tbl_node *tbl, int ln, const char *p) |
|
{ |
|
struct tbl_dat *dat; |
|
size_t sz; |
|
|
|
if (0 == strcmp(p, "T}")) { |
|
tbl->part = TBL_PART_DATA; |
|
return(1); |
|
} |
|
|
|
dat = tbl->last_span->last; |
|
dat->pos = TBL_DATA_DATA; |
|
|
|
if (dat->string) { |
|
sz = strlen(p) + strlen(dat->string) + 2; |
|
dat->string = mandoc_realloc(dat->string, sz); |
|
strlcat(dat->string, " ", sz); |
|
strlcat(dat->string, p, sz); |
|
} else |
|
dat->string = mandoc_strdup(p); |
|
|
|
return(0); |
|
} |
|
|
|
int |
tbl_data(struct tbl_node *tbl, int ln, const char *p) |
tbl_data(struct tbl_node *tbl, int ln, const char *p) |
{ |
{ |
struct tbl_span *dp; |
struct tbl_span *dp; |
Line 136 tbl_data(struct tbl_node *tbl, int ln, const char *p) |
|
Line 190 tbl_data(struct tbl_node *tbl, int ln, const char *p) |
|
|
|
dp->pos = TBL_SPAN_DATA; |
dp->pos = TBL_SPAN_DATA; |
|
|
|
/* This returns 0 when TBL_PART_CDATA is entered. */ |
|
|
while ('\0' != p[pos]) |
while ('\0' != p[pos]) |
data(tbl, dp, ln, p, &pos); |
if ( ! data(tbl, dp, ln, p, &pos)) |
|
return(0); |
|
|
return(1); |
return(1); |
} |
} |