]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_argv.c
`RS' warns if empty body.
[mandoc.git] / mdoc_argv.c
index 5e6865fcb638f29ae4f63dff4dedd02d63dbe82e..7d36784d7fe1da1bf960cf72b2091814b94a9736 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_argv.c,v 1.20 2009/07/20 14:09:38 kristaps Exp $ */
+/*     $Id: mdoc_argv.c,v 1.25 2009/08/20 13:22:48 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
  * There's no limit to the number or arguments that may be allocated.
  */
 
-/* FIXME .Bf Li raises "macro-like parameter". */
-
-#define        ARGS_DELIM      (1 << 1)
-#define        ARGS_TABSEP     (1 << 2)
-
 #define        ARGV_NONE       (1 << 0)
 #define        ARGV_SINGLE     (1 << 1)
 #define        ARGV_MULTI      (1 << 2)
@@ -79,7 +74,7 @@ static        int mdoc_argvflags[MDOC_ARG_MAX] = {
        ARGV_MULTI,     /* MDOC_Column */
        ARGV_SINGLE,    /* MDOC_Width */
        ARGV_NONE,      /* MDOC_Compact */
-       ARGV_OPT_SINGLE, /* MDOC_Std */
+       ARGV_NONE,      /* MDOC_Std */
        ARGV_NONE,      /* MDOC_Filled */
        ARGV_NONE,      /* MDOC_Words */
        ARGV_NONE,      /* MDOC_Emphasis */
@@ -327,10 +322,11 @@ mdoc_argv_free(struct mdoc_arg *p)
 
 
 int
-mdoc_zargs(struct mdoc *m, int line, int *pos, char *buf, char **v)
+mdoc_zargs(struct mdoc *m, int line, int *pos, 
+               char *buf, int flags, char **v)
 {
 
-       return(args(m, line, pos, buf, 0, v));
+       return(args(m, line, pos, buf, flags, v));
 }
 
 
@@ -376,9 +372,24 @@ static int
 args(struct mdoc *m, int line, int *pos, 
                char *buf, int fl, char **v)
 {
-       int               i, psv;
+       int               i;
        char             *p, *pp;
 
+       /*
+        * Parse out the terms (like `val' in `.Xx -arg val' or simply
+        * `.Xx val'), which can have all sorts of properties:
+        *
+        *   ARGS_DELIM: use special handling if encountering trailing
+        *   delimiters in the form of [[::delim::][ ]+]+.
+        *
+        *   ARGS_NOWARN: don't post warnings.  This is only used when
+        *   re-parsing delimiters, as the warnings have already been
+        *   posted.
+        *
+        *   ARGS_TABSEP: use special handling for tab/`Ta' separated
+        *   phrases like in `Bl -column'.
+        */
+
        assert(*pos);
        assert(' ' != buf[*pos]);
 
@@ -403,10 +414,14 @@ args(struct mdoc *m, int line, int *pos,
                                i++;
                }
 
-               /* FIXME: warn about trailing whitespace. */
-
                if (0 == buf[i]) {
                        *v = &buf[*pos];
+                       if (' ' != buf[i - 1])
+                               return(ARGS_PUNCT);
+                       if (ARGS_NOWARN & fl)
+                               return(ARGS_PUNCT);
+                       if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))
+                               return(ARGS_ERROR);
                        return(ARGS_PUNCT);
                }
        }
@@ -421,8 +436,6 @@ args(struct mdoc *m, int line, int *pos,
         */
 
        if (ARGS_TABSEP & fl) {
-               psv = *pos;
-
                /* Scan ahead to tab (can't be escaped). */
                p = strchr(*v, '\t');
 
@@ -436,6 +449,10 @@ args(struct mdoc *m, int line, int *pos,
                                break;
                }
 
+               /* 
+                * Adjust new-buffer position to be beyond delimiter
+                * mark (e.g., Ta -> end + 2).
+                */
                if (p && pp) {
                        *pos += pp < p ? 2 : 1;
                        p = pp < p ? pp : p;
@@ -447,15 +464,14 @@ args(struct mdoc *m, int line, int *pos,
                } else
                        p = strchr(*v, 0);
 
-               if (0 == *p && ' ' == *(p - 1))
+               /* Whitespace check for eoln case... */
+               if (0 == *p && ' ' == *(p - 1) && ! (ARGS_NOWARN & fl))
                        if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))
                                return(ARGS_ERROR);
 
-               *p = 0;
                *pos += (int)(p - *v);
 
                /* Strip delimiter's preceding whitespace. */
-
                pp = p - 1;
                while (pp > *v && ' ' == *pp) {
                        if (pp > *v && '\\' == *(pp - 1))
@@ -465,7 +481,6 @@ args(struct mdoc *m, int line, int *pos,
                *(pp + 1) = 0;
 
                /* Strip delimiter's proceeding whitespace. */
-
                for (pp = &buf[*pos]; ' ' == *pp; pp++, (*pos)++)
                        /* Skip ahead. */ ;
 
@@ -490,6 +505,8 @@ args(struct mdoc *m, int line, int *pos,
                }
 
                if (0 == buf[*pos]) {
+                       if (ARGS_NOWARN & fl)
+                               return(ARGS_QWORD);
                        if ( ! mdoc_pwarn(m, line, *pos, EQUOTTERM))
                                return(ARGS_ERROR);
                        return(ARGS_QWORD);
@@ -503,7 +520,7 @@ args(struct mdoc *m, int line, int *pos,
                while (' ' == buf[*pos])
                        (*pos)++;
 
-               if (0 == buf[*pos])
+               if (0 == buf[*pos] && ! (ARGS_NOWARN & fl))
                        if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))
                                return(ARGS_ERROR);
 
@@ -527,7 +544,7 @@ args(struct mdoc *m, int line, int *pos,
        while (' ' == buf[*pos])
                (*pos)++;
 
-       if (0 == buf[*pos])
+       if (0 == buf[*pos] && ! (ARGS_NOWARN & fl))
                if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))
                        return(ARGS_ERROR);