diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-12-28 13:46:07 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-12-28 13:46:07 +0000 |
commit | 715dac62c941f1757a389d2c3dca9aade6b742ea (patch) | |
tree | fb3256c0ddfeac539bc450ffaaceb79c72f69c1c /tbl.c | |
parent | b7a413d6e95970beaca4b47cedb9aa482b3b9e2a (diff) | |
download | mandoc-715dac62c941f1757a389d2c3dca9aade6b742ea.tar.gz |
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.
Diffstat (limited to 'tbl.c')
-rw-r--r-- | tbl.c | 69 |
1 files changed, 60 insertions, 9 deletions
@@ -15,6 +15,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include <assert.h> +#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> @@ -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); +} + + |