]> git.cameronkatri.com Git - mandoc.git/blobdiff - tbl_opts.c
When a man(7) document contains unreasonably large numbers for
[mandoc.git] / tbl_opts.c
index 52a0403c1f3dd504c1b3824c35b079e62e65bcbd..d5ad42f73e5e023042bada3404f66e66cdef5ee2 100644 (file)
@@ -1,6 +1,6 @@
-/*     $Id: tbl_opts.c,v 1.9 2011/03/15 16:23:51 kristaps Exp $ */
+/*     $Id: tbl_opts.c,v 1.15 2014/11/26 17:51:55 schwarze Exp $ */
 /*
- * Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2009, 2010, 2011 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
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
+#include "config.h"
+
+#include <sys/types.h>
+
 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include "mandoc.h"
+#include "libmandoc.h"
 #include "libroff.h"
 
 enum   tbl_ident {
@@ -57,10 +62,10 @@ struct      tbl_phrase {
 static const struct tbl_phrase keys[KEY_MAXKEYS] = {
        { "center",      TBL_OPT_CENTRE,        KEY_CENTRE},
        { "centre",      TBL_OPT_CENTRE,        KEY_CENTRE},
-       { "delim",       0,                     KEY_DELIM},
+       { "delim",       0,                     KEY_DELIM},
        { "expand",      TBL_OPT_EXPAND,        KEY_EXPAND},
-       { "box",         TBL_OPT_BOX,           KEY_BOX},
-       { "doublebox",   TBL_OPT_DBOX,          KEY_DBOX},
+       { "box",         TBL_OPT_BOX,           KEY_BOX},
+       { "doublebox",   TBL_OPT_DBOX,          KEY_DBOX},
        { "allbox",      TBL_OPT_ALLBOX,        KEY_ALLBOX},
        { "frame",       TBL_OPT_BOX,           KEY_FRAME},
        { "doubleframe", TBL_OPT_DBOX,          KEY_DFRAME},
@@ -71,11 +76,12 @@ static      const struct tbl_phrase keys[KEY_MAXKEYS] = {
        { "nospaces",    TBL_OPT_NOSPACE,       KEY_NOSPACE},
 };
 
-static int              arg(struct tbl_node *, int, 
+static int              arg(struct tbl_node *, int,
                                const char *, int *, enum tbl_ident);
-static void             opt(struct tbl_node *, int, 
+static void             opt(struct tbl_node *, int,
                                const char *, int *);
 
+
 static int
 arg(struct tbl_node *tbl, int ln, const char *p, int *pos, enum tbl_ident key)
 {
@@ -88,7 +94,8 @@ arg(struct tbl_node *tbl, int ln, const char *p, int *pos, enum tbl_ident key)
        /* Arguments always begin with a parenthesis. */
 
        if ('(' != p[*pos]) {
-               TBL_MSG(tbl, MANDOCERR_TBL, ln, *pos);
+               mandoc_msg(MANDOCERR_TBL, tbl->parse,
+                   ln, *pos, NULL);
                return(0);
        }
 
@@ -101,24 +108,27 @@ arg(struct tbl_node *tbl, int ln, const char *p, int *pos, enum tbl_ident key)
         */
 
        switch (key) {
-       case (KEY_DELIM):
+       case KEY_DELIM:
                if ('\0' == p[(*pos)++]) {
-                       TBL_MSG(tbl, MANDOCERR_TBL, ln, *pos - 1);
+                       mandoc_msg(MANDOCERR_TBL, tbl->parse,
+                           ln, *pos - 1, NULL);
                        return(0);
-               } 
+               }
 
                if ('\0' == p[(*pos)++]) {
-                       TBL_MSG(tbl, MANDOCERR_TBL, ln, *pos - 1);
+                       mandoc_msg(MANDOCERR_TBL, tbl->parse,
+                           ln, *pos - 1, NULL);
                        return(0);
-               } 
+               }
                break;
-       case (KEY_TAB):
+       case KEY_TAB:
                if ('\0' != (tbl->opts.tab = p[(*pos)++]))
                        break;
 
-               TBL_MSG(tbl, MANDOCERR_TBL, ln, *pos - 1);
+               mandoc_msg(MANDOCERR_TBL, tbl->parse,
+                   ln, *pos - 1, NULL);
                return(0);
-       case (KEY_LINESIZE):
+       case KEY_LINESIZE:
                for (i = 0; i < KEY_MAXNUMSZ && p[*pos]; i++, (*pos)++) {
                        buf[i] = p[*pos];
                        if ( ! isdigit((unsigned char)buf[i]))
@@ -131,13 +141,14 @@ arg(struct tbl_node *tbl, int ln, const char *p, int *pos, enum tbl_ident key)
                        break;
                }
 
-               (*tbl->msg)(MANDOCERR_TBL, tbl->data, ln, *pos, NULL);
+               mandoc_msg(MANDOCERR_TBL, tbl->parse, ln, *pos, NULL);
                return(0);
-       case (KEY_DPOINT):
+       case KEY_DPOINT:
                if ('\0' != (tbl->opts.decimal = p[(*pos)++]))
                        break;
 
-               TBL_MSG(tbl, MANDOCERR_TBL, ln, *pos - 1);
+               mandoc_msg(MANDOCERR_TBL, tbl->parse,
+                   ln, *pos - 1, NULL);
                return(0);
        default:
                abort();
@@ -149,7 +160,7 @@ arg(struct tbl_node *tbl, int ln, const char *p, int *pos, enum tbl_ident key)
        if (')' == p[(*pos)++])
                return(1);
 
-       TBL_MSG(tbl, MANDOCERR_TBL, ln, *pos - 1);
+       mandoc_msg(MANDOCERR_TBL, tbl->parse, ln, *pos - 1, NULL);
        return(0);
 }
 
@@ -171,8 +182,8 @@ again:      /*
         *
         * options      ::= option_list [:space:]* [;][\n]
         * option_list  ::= option option_tail
-        * option_tail  ::= [:space:]+ option_list |
-        *              ::= epsilon
+        * option_tail  ::= [,:space:]+ option_list |
+        *              ::= epsilon
         * option       ::= [:alpha:]+ args
         * args         ::= [:space:]* [(] [:alpha:]+ [)]
         */
@@ -196,16 +207,16 @@ again:    /*
        /* Exit if buffer is empty (or overrun). */
 
        if (KEY_MAXNAME == i || 0 == i) {
-               TBL_MSG(tbl, MANDOCERR_TBL, ln, *pos);
+               mandoc_msg(MANDOCERR_TBL, tbl->parse, ln, *pos, NULL);
                return;
        }
 
        buf[i] = '\0';
 
-       while (isspace((unsigned char)p[*pos]))
+       while (isspace((unsigned char)p[*pos]) || p[*pos] == ',')
                (*pos)++;
 
-       /* 
+       /*
         * Look through all of the available keys to find one that
         * matches the input.  FIXME: hashtable this.
         */
@@ -221,7 +232,7 @@ again:      /*
                 * of the sequence altogether.
                 */
 
-               if (keys[i].key) 
+               if (keys[i].key)
                        tbl->opts.opts |= keys[i].key;
                else if ( ! arg(tbl, ln, p, pos, keys[i].ident))
                        return;
@@ -229,13 +240,13 @@ again:    /*
                break;
        }
 
-       /* 
+       /*
         * Allow us to recover from bad options by continuing to another
         * parse sequence.
         */
 
        if (KEY_MAXKEYS == i)
-               TBL_MSG(tbl, MANDOCERR_TBLOPT, ln, sv);
+               mandoc_msg(MANDOCERR_TBLOPT, tbl->parse, ln, sv, NULL);
 
        goto again;
        /* NOTREACHED */