diff options
-rw-r--r-- | Makefile | 6 | ||||
-rw-r--r-- | libroff.h | 19 | ||||
-rw-r--r-- | tbl.c | 15 | ||||
-rw-r--r-- | tbl_data.c | 96 |
4 files changed, 132 insertions, 4 deletions
@@ -31,11 +31,11 @@ CFLAGS += -g $(WFLAGS) $(VFLAGS) -DHAVE_CONFIG_H LINTFLAGS += $(VFLAGS) -ROFFLNS = roff.ln tbl.ln tbl_opts.ln tbl_layout.ln +ROFFLNS = roff.ln tbl.ln tbl_opts.ln tbl_layout.ln tbl_data.ln -ROFFSRCS = roff.c tbl.c tbl_opts.c tbl_layout.c +ROFFSRCS = roff.c tbl.c tbl_opts.c tbl_layout.c tbl_data.c -ROFFOBJS = roff.o tbl.o tbl_opts.o tbl_layout.o +ROFFOBJS = roff.o tbl.o tbl_opts.o tbl_layout.o tbl_data.o MANDOCLNS = mandoc.ln @@ -60,6 +60,24 @@ struct tbl_row { struct tbl_cell *last; }; +struct tbl_dat { + struct tbl_dat *next; + char *string; + int flags; +#define TBL_DATA_HORIZ (1 << 0) +#define TBL_DATA_DHORIZ (1 << 1) +#define TBL_DATA_NHORIZ (1 << 2) +#define TBL_DATA_NDHORIZ (1 << 3) +}; + +struct tbl_span { + struct tbl_dat *first; + struct tbl_dat *last; + int flags; +#define TBL_SPAN_HORIZ (1 << 0) +#define TBL_SPAN_DHORIZ (1 << 1) +}; + struct tbl { mandocmsg msg; /* status messages */ void *data; /* privdata for messages */ @@ -90,6 +108,7 @@ void tbl_reset(struct tbl *); enum rofferr tbl_read(struct tbl *, int, const char *, int); int tbl_option(struct tbl *, int, const char *); int tbl_layout(struct tbl *, int, const char *); +struct tbl_span *tbl_data(struct tbl *, int, const char *); __END_DECLS @@ -63,6 +63,8 @@ tbl_read(struct tbl *tbl, int ln, const char *p, int offs) { int len; const char *cp; + struct tbl_dat *dp; + struct tbl_span *sp; cp = &p[offs]; len = (int)strlen(cp); @@ -85,9 +87,20 @@ tbl_read(struct tbl *tbl, int ln, const char *p, int offs) return(tbl_option(tbl, ln, p) ? ROFF_IGN : ROFF_ERR); case (TBL_PART_LAYOUT): return(tbl_layout(tbl, ln, p) ? ROFF_IGN : ROFF_ERR); - default: + case (TBL_PART_DATA): break; } + + /* XXX: throw away data for now. */ + if (NULL != (sp = tbl_data(tbl, ln, p))) { + while (NULL != (dp = sp->first)) { + sp->first = sp->first->next; + if (dp->string) + free(dp->string); + free(dp); + } + free(sp); + } return(ROFF_CONT); } diff --git a/tbl_data.c b/tbl_data.c new file mode 100644 index 00000000..b50ce7f6 --- /dev/null +++ b/tbl_data.c @@ -0,0 +1,96 @@ +/* $Id$ */ +/* + * Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +#include <assert.h> +#include <ctype.h> +#include <stdlib.h> +#include <string.h> + +#include "mandoc.h" +#include "libmandoc.h" +#include "libroff.h" + +static void data(struct tbl *, struct tbl_span *, + int, const char *, int *); + +void +data(struct tbl *tbl, struct tbl_span *dp, + int ln, const char *p, int *pos) +{ + struct tbl_dat *dat; + int sv; + + /* FIXME: warn about losing data contents if cell is HORIZ. */ + + dat = mandoc_calloc(1, sizeof(struct tbl_dat)); + + if (dp->last) { + dp->last->next = dat; + dp->last = dat; + } else + dp->last = dp->first = dat; + + sv = *pos; + while (p[*pos] && p[*pos] != tbl->tab) + (*pos)++; + + dat->string = mandoc_malloc(*pos - sv + 1); + memcpy(dat->string, &p[sv], *pos - sv); + dat->string[*pos - sv] = '\0'; + + if (p[*pos]) + (*pos)++; + + /* XXX: do the strcmps, then malloc(). */ + + if ( ! strcmp(dat->string, "_")) + dat->flags |= TBL_DATA_HORIZ; + else if ( ! strcmp(dat->string, "=")) + dat->flags |= TBL_DATA_DHORIZ; + else if ( ! strcmp(dat->string, "\\_")) + dat->flags |= TBL_DATA_NHORIZ; + else if ( ! strcmp(dat->string, "\\=")) + dat->flags |= TBL_DATA_NDHORIZ; +} + +struct tbl_span * +tbl_data(struct tbl *tbl, int ln, const char *p) +{ + struct tbl_span *dp; + int pos; + + pos = 0; + + if ('\0' == p[pos]) { + TBL_MSG(tbl, MANDOCERR_TBL, ln, pos); + return(NULL); + } + + dp = mandoc_calloc(1, sizeof(struct tbl_span)); + + if ( ! strcmp(p, "_")) { + dp->flags |= TBL_SPAN_HORIZ; + return(dp); + } else if ( ! strcmp(p, "=")) { + dp->flags |= TBL_SPAN_DHORIZ; + return(dp); + } + + while ('\0' != p[pos]) + data(tbl, dp, ln, p, &pos); + + return(dp); +} |