From 715dac62c941f1757a389d2c3dca9aade6b742ea Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Tue, 28 Dec 2010 13:46:07 +0000 Subject: Adding initial options processing (not hooked into parse yet). This is more or less copied from tbl.bsd.lv and still needs integration with the general mandoc framework, e.g., with error messages. --- tbl.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 9 deletions(-) (limited to 'tbl.c') diff --git a/tbl.c b/tbl.c index 1dc41e93..bd0087a9 100644 --- a/tbl.c +++ b/tbl.c @@ -15,6 +15,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include +#include #include #include #include @@ -24,19 +25,14 @@ #include "libmandoc.h" #include "libroff.h" -enum tbl_part { - TBL_PART_OPTS, /* in options (first line) */ - TBL_PART_LAYOUT, /* describing layout */ - TBL_PART_DATA /* creating data rows */ -}; - - -struct tbl { - enum tbl_part part; +static const char tbl_toks[TBL_TOK__MAX] = { + '(', ')', ',', ';', '.', + ' ', '\t', '\0' }; static void tbl_init(struct tbl *); static void tbl_clear(struct tbl *); +static enum tbl_tok tbl_next_char(char); static void tbl_clear(struct tbl *tbl) @@ -92,3 +88,58 @@ tbl_reset(struct tbl *tbl) tbl_clear(tbl); tbl_init(tbl); } + +static enum tbl_tok +tbl_next_char(char c) +{ + int i; + + /* + * These are delimiting tokens. They separate out words in the + * token stream. + * + * FIXME: make this into a hashtable for faster lookup. + */ + for (i = 0; i < TBL_TOK__MAX; i++) + if (c == tbl_toks[i]) + return((enum tbl_tok)i); + + return(TBL_TOK__MAX); +} + +enum tbl_tok +tbl_next(struct tbl *tbl, const char *p, int *pos) +{ + int i; + enum tbl_tok c; + + tbl->buf[0] = '\0'; + + if (TBL_TOK__MAX != (c = tbl_next_char(p[*pos]))) { + if (TBL_TOK_NIL != c) { + tbl->buf[0] = p[*pos]; + tbl->buf[1] = '\0'; + (*pos)++; + } + return(c); + } + + /* + * Copy words into a nil-terminated buffer. For now, we use a + * static buffer. FIXME: eventually this should be made into a + * dynamic one living in struct tbl. + */ + + for (i = 0; i < BUFSIZ; i++, (*pos)++) + if (TBL_TOK__MAX == tbl_next_char(p[*pos])) + tbl->buf[i] = p[*pos]; + else + break; + + assert(i < BUFSIZ); + tbl->buf[i] = '\0'; + + return(TBL_TOK__MAX); +} + + -- cgit