summaryrefslogtreecommitdiffstats
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
commit715dac62c941f1757a389d2c3dca9aade6b742ea (patch)
treefb3256c0ddfeac539bc450ffaaceb79c72f69c1c /tbl.c
parentb7a413d6e95970beaca4b47cedb9aa482b3b9e2a (diff)
downloadmandoc-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.c69
1 files changed, 60 insertions, 9 deletions
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 <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);
+}
+
+