]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandoc.c
improve documentation of .Fa, .Va, and .Vt;
[mandoc.git] / mandoc.c
index 794af306159551beb2707ec9fb8362f8f903c58d..e82093b935dbbe55c524f31ff1b29d61183a2671 100644 (file)
--- a/mandoc.c
+++ b/mandoc.c
@@ -1,4 +1,4 @@
-/*     $Id: mandoc.c,v 1.81 2014/07/01 22:37:15 schwarze Exp $ */
+/*     $Id: mandoc.c,v 1.87 2014/10/13 17:17:45 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -15,9 +15,7 @@
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
 #include <sys/types.h>
 
@@ -81,24 +79,13 @@ mandoc_escape(const char **end, const char **start, int *sz)
                break;
        case '[':
                gly = ESCAPE_SPECIAL;
-               /*
-                * Unicode escapes are defined in groff as \[uXXXX] to
-                * \[u10FFFF], where the contained value must be a valid
-                * Unicode codepoint.  Here, however, only check whether
-                * it's not a zero-width escape.
-                */
-               if ('u' == (*start)[0] && ']' != (*start)[1])
-                       gly = ESCAPE_UNICODE;
                term = ']';
                break;
        case 'C':
                if ('\'' != **start)
                        return(ESCAPE_ERROR);
                *start = ++*end;
-               if ('u' == (*start)[0] && '\'' != (*start)[1])
-                       gly = ESCAPE_UNICODE;
-               else
-                       gly = ESCAPE_SPECIAL;
+               gly = ESCAPE_SPECIAL;
                term = '\'';
                break;
 
@@ -200,8 +187,11 @@ mandoc_escape(const char **end, const char **start, int *sz)
        case 'v':
                /* FALLTHROUGH */
        case 'x':
-               if (strchr("\0 %&()*+-./0123456789:<=>", **start))
+               if (strchr(" %&()*+-./0123456789:<=>", **start)) {
+                       if ('\0' != **start)
+                               ++*end;
                        return(ESCAPE_ERROR);
+               }
                gly = ESCAPE_IGNORE;
                term = **start;
                *start = ++*end;
@@ -343,6 +333,16 @@ mandoc_escape(const char **end, const char **start, int *sz)
        case ESCAPE_SPECIAL:
                if (1 == *sz && 'c' == **start)
                        gly = ESCAPE_NOSPACE;
+               /*
+                * Unicode escapes are defined in groff as \[uXXXX]
+                * to \[u10FFFF], where the contained value must be
+                * a valid Unicode codepoint.  Here, however, only
+                * check the length and the validity of all digits.
+                */
+               else if (*sz > 4 && *sz < 8 && **start == 'u' &&
+                   (int)strspn(*start + 1, "0123456789ABCDEFabcdef")
+                   + 1 == *sz)
+                       gly = ESCAPE_UNICODE;
                break;
        default:
                break;
@@ -427,7 +427,7 @@ mandoc_getarg(struct mparse *parse, char **cpp, int ln, int *pos)
 
        /* Quoted argument without a closing quote. */
        if (1 == quoted)
-               mandoc_msg(MANDOCERR_BADQUOTE, parse, ln, *pos, NULL);
+               mandoc_msg(MANDOCERR_ARG_QUOTE, parse, ln, *pos, NULL);
 
        /* NUL-terminate this argument and move to the next one. */
        if (pairs)
@@ -441,7 +441,7 @@ mandoc_getarg(struct mparse *parse, char **cpp, int ln, int *pos)
        *cpp = cp;
 
        if ('\0' == *cp && (white || ' ' == cp[-1]))
-               mandoc_msg(MANDOCERR_EOLNSPACE, parse, ln, *pos, NULL);
+               mandoc_msg(MANDOCERR_SPACE_EOL, parse, ln, *pos, NULL);
 
        return(start);
 }
@@ -455,7 +455,7 @@ a2time(time_t *t, const char *fmt, const char *p)
        memset(&tm, 0, sizeof(struct tm));
 
        pp = NULL;
-#ifdef HAVE_STRPTIME
+#if HAVE_STRPTIME
        pp = strptime(p, fmt, &tm);
 #endif
        if (NULL != pp && '\0' == *pp) {