aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tbl.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-12-28 13:46:07 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-12-28 13:46:07 +0000
commit446eaf99d9987df7d312d3315e99646e91ada7fe (patch)
tree694e7d3685c90c2a36012ac85aa7f5b075d4c462 /tbl.c
parentd3bbb7e6cdf2c0b8af5ac3158acec7c2d7ee03bd (diff)
downloadmandoc-446eaf99d9987df7d312d3315e99646e91ada7fe.tar.gz
mandoc-446eaf99d9987df7d312d3315e99646e91ada7fe.tar.zst
mandoc-446eaf99d9987df7d312d3315e99646e91ada7fe.zip
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.c71
1 files changed, 61 insertions, 10 deletions
diff --git a/tbl.c b/tbl.c
index 1f2d6f1a..67d00584 100644
--- a/tbl.c
+++ b/tbl.c
@@ -1,4 +1,4 @@
-/* $Id: tbl.c,v 1.2 2010/12/28 10:55:24 kristaps Exp $ */
+/* $Id: tbl.c,v 1.3 2010/12/28 13:46:07 kristaps Exp $ */
/*
* Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -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);
+}
+
+