]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_argv.c
Smarten BADCHAR check to allow ASCII_HYPH.
[mandoc.git] / mdoc_argv.c
index 96ccef17d884c6d6b72023784574ce9e12e586b4..c7ca2e64b9773d05a38fe167ec8db0fb091fe6e6 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_argv.c,v 1.45 2010/05/09 21:06:50 kristaps Exp $ */
+/*     $Id: mdoc_argv.c,v 1.49 2010/05/17 22:11:42 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -26,6 +26,7 @@
 #include <stdio.h>
 #include <string.h>
 
 #include <stdio.h>
 #include <string.h>
 
+#include "mandoc.h"
 #include "libmdoc.h"
 #include "libmandoc.h"
 
 #include "libmdoc.h"
 #include "libmandoc.h"
 
@@ -398,8 +399,21 @@ args(struct mdoc *m, int line, int *pos,
        assert(*pos);
        assert(' ' != buf[*pos]);
 
        assert(*pos);
        assert(' ' != buf[*pos]);
 
-       if ('\0' == buf[*pos])
+       if ('\0' == buf[*pos]) {
+               if (MDOC_PPHRASE & m->flags)
+                       return(ARGS_EOLN);
+               /*
+                * If we're not in a partial phrase and the flag for
+                * being a phrase literal is still set, the punctuation
+                * is unterminated.
+                */
+               if (MDOC_PHRASELIT & m->flags)
+                       if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_BADQUOTE))
+                               return(ARGS_ERROR);
+
+               m->flags &= ~MDOC_PHRASELIT;
                return(ARGS_EOLN);
                return(ARGS_EOLN);
+       }
 
        /* 
         * If the first character is a closing delimiter and we're to
 
        /* 
         * If the first character is a closing delimiter and we're to
@@ -408,9 +422,10 @@ args(struct mdoc *m, int line, int *pos,
         * we ONLY care about closing delimiters.
         */
 
         * we ONLY care about closing delimiters.
         */
 
-       if ((fl & ARGS_DELIM) && mdoc_iscdelim(buf[*pos]) > 1) {
+       if ((fl & ARGS_DELIM) && DELIM_CLOSE == mdoc_iscdelim(buf[*pos])) {
                for (i = *pos; buf[i]; ) {
                for (i = *pos; buf[i]; ) {
-                       if ( mdoc_iscdelim(buf[i]) < 2)
+                       enum mdelim d = mdoc_iscdelim(buf[i]);
+                       if (DELIM_NONE == d || DELIM_OPEN == d)
                                break;
                        i++;
                        if ('\0' == buf[i] || ' ' != buf[i])
                                break;
                        i++;
                        if ('\0' == buf[i] || ' ' != buf[i])
@@ -426,7 +441,7 @@ args(struct mdoc *m, int line, int *pos,
                                return(ARGS_PUNCT);
                        if (ARGS_NOWARN & fl)
                                return(ARGS_PUNCT);
                                return(ARGS_PUNCT);
                        if (ARGS_NOWARN & fl)
                                return(ARGS_PUNCT);
-                       if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))
+                       if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE))
                                return(ARGS_ERROR);
                        return(ARGS_PUNCT);
                }
                                return(ARGS_ERROR);
                        return(ARGS_PUNCT);
                }
@@ -444,16 +459,18 @@ args(struct mdoc *m, int line, int *pos,
        if (ARGS_TABSEP & fl) {
                /* Scan ahead to tab (can't be escaped). */
                p = strchr(*v, '\t');
        if (ARGS_TABSEP & fl) {
                /* Scan ahead to tab (can't be escaped). */
                p = strchr(*v, '\t');
+               pp = NULL;
 
                /* Scan ahead to unescaped `Ta'. */
 
                /* Scan ahead to unescaped `Ta'. */
-               for (pp = *v; ; pp++) {
-                       if (NULL == (pp = strstr(pp, "Ta")))
-                               break;
-                       if (pp > *v && ' ' != *(pp - 1))
-                               continue;
-                       if (' ' == *(pp + 2) || 0 == *(pp + 2))
-                               break;
-               }
+               if ( ! (MDOC_PHRASELIT & m->flags)) 
+                       for (pp = *v; ; pp++) {
+                               if (NULL == (pp = strstr(pp, "Ta")))
+                                       break;
+                               if (pp > *v && ' ' != *(pp - 1))
+                                       continue;
+                               if (' ' == *(pp + 2) || 0 == *(pp + 2))
+                                       break;
+                       }
 
                /* By default, assume a phrase. */
                rc = ARGS_PHRASE;
 
                /* By default, assume a phrase. */
                rc = ARGS_PHRASE;
@@ -479,7 +496,7 @@ args(struct mdoc *m, int line, int *pos,
 
                /* Whitespace check for eoln case... */
                if (0 == *p && ' ' == *(p - 1) && ! (ARGS_NOWARN & fl))
 
                /* Whitespace check for eoln case... */
                if (0 == *p && ' ' == *(p - 1) && ! (ARGS_NOWARN & fl))
-                       if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))
+                       if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE))
                                return(ARGS_ERROR);
 
                *pos += (int)(p - *v);
                                return(ARGS_ERROR);
 
                *pos += (int)(p - *v);
@@ -506,8 +523,12 @@ args(struct mdoc *m, int line, int *pos,
         * Whitespace is NOT involved in literal termination.
         */
 
         * Whitespace is NOT involved in literal termination.
         */
 
-       if ('\"' == buf[*pos]) {
-               *v = &buf[++(*pos)];
+       if (MDOC_PHRASELIT & m->flags || '\"' == buf[*pos]) {
+               if ( ! (MDOC_PHRASELIT & m->flags))
+                       *v = &buf[++(*pos)];
+
+               if (MDOC_PPHRASE & m->flags)
+                       m->flags |= MDOC_PHRASELIT;
 
                for ( ; buf[*pos]; (*pos)++) {
                        if ('\"' != buf[*pos])
 
                for ( ; buf[*pos]; (*pos)++) {
                        if ('\"' != buf[*pos])
@@ -517,24 +538,25 @@ args(struct mdoc *m, int line, int *pos,
                        (*pos)++;
                }
 
                        (*pos)++;
                }
 
-               if (0 == buf[*pos]) {
-                       if (ARGS_NOWARN & fl)
+               if ('\0' == buf[*pos]) {
+                       if (ARGS_NOWARN & fl || MDOC_PPHRASE & m->flags)
                                return(ARGS_QWORD);
                                return(ARGS_QWORD);
-                       if ( ! mdoc_pwarn(m, line, *pos, EQUOTTERM))
+                       if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_BADQUOTE))
                                return(ARGS_ERROR);
                        return(ARGS_QWORD);
                }
 
                                return(ARGS_ERROR);
                        return(ARGS_QWORD);
                }
 
-               buf[(*pos)++] = 0;
+               m->flags &= ~MDOC_PHRASELIT;
+               buf[(*pos)++] = '\0';
 
 
-               if (0 == buf[*pos])
+               if ('\0' == buf[*pos])
                        return(ARGS_QWORD);
 
                while (' ' == buf[*pos])
                        (*pos)++;
 
                if (0 == buf[*pos] && ! (ARGS_NOWARN & fl))
                        return(ARGS_QWORD);
 
                while (' ' == buf[*pos])
                        (*pos)++;
 
                if (0 == buf[*pos] && ! (ARGS_NOWARN & fl))
-                       if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))
+                       if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE))
                                return(ARGS_ERROR);
 
                return(ARGS_QWORD);
                                return(ARGS_ERROR);
 
                return(ARGS_QWORD);
@@ -549,16 +571,16 @@ args(struct mdoc *m, int line, int *pos,
                if (' ' == buf[*pos] && '\\' != buf[*pos - 1])
                        break;
 
                if (' ' == buf[*pos] && '\\' != buf[*pos - 1])
                        break;
 
-       if (0 == buf[*pos])
+       if ('\0' == buf[*pos])
                return(ARGS_WORD);
 
                return(ARGS_WORD);
 
-       buf[(*pos)++] = 0;
+       buf[(*pos)++] = '\0';
 
        while (' ' == buf[*pos])
                (*pos)++;
 
 
        while (' ' == buf[*pos])
                (*pos)++;
 
-       if (0 == buf[*pos] && ! (ARGS_NOWARN & fl))
-               if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))
+       if ('\0' == buf[*pos] && ! (ARGS_NOWARN & fl))
+               if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE))
                        return(ARGS_ERROR);
 
        return(ARGS_WORD);
                        return(ARGS_ERROR);
 
        return(ARGS_WORD);
@@ -730,10 +752,11 @@ argv_single(struct mdoc *m, int line,
        ppos = *pos;
 
        ac = args(m, line, pos, buf, 0, &p);
        ppos = *pos;
 
        ac = args(m, line, pos, buf, 0, &p);
-       if (ARGS_ERROR == ac)
+       if (ARGS_EOLN == ac) {
+               mdoc_pmsg(m, line, ppos, MANDOCERR_SYNTARGVCOUNT);
+               return(0);
+       } else if (ARGS_ERROR == ac)
                return(0);
                return(0);
-       if (ARGS_EOLN == ac)
-               return(mdoc_perr(m, line, ppos, EARGVAL));
 
        v->sz = 1;
        v->value = mandoc_malloc(sizeof(char *));
 
        v->sz = 1;
        v->value = mandoc_malloc(sizeof(char *));