]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandoc.c
Support -Ios='OpenBSD 5.1' to override uname(3) as the source of the
[mandoc.git] / mandoc.c
index 8c470f9cf9b5a3db9ac88f232025fbb25fb8b9b2..604bb67e6ae480b8c736a3658fd667207b0c4b9b 100644 (file)
--- a/mandoc.c
+++ b/mandoc.c
@@ -1,6 +1,6 @@
-/*     $Id: mandoc.c,v 1.57 2011/07/27 07:06:29 kristaps Exp $ */
+/*     $Id: mandoc.c,v 1.62 2011/12/03 16:08:51 schwarze Exp $ */
 /*
- * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -161,8 +161,7 @@ mandoc_escape(const char **end, const char **start, int *sz)
        case ('V'):
                /* FALLTHROUGH */
        case ('Y'):
-               if (ESCAPE_ERROR == gly)
-                       gly = ESCAPE_IGNORE;
+               gly = ESCAPE_IGNORE;
                /* FALLTHROUGH */
        case ('f'):
                if (ESCAPE_ERROR == gly)
@@ -222,10 +221,7 @@ mandoc_escape(const char **end, const char **start, int *sz)
        case ('L'):
                /* FALLTHROUGH */
        case ('l'):
-               /* FALLTHROUGH */
-       case ('N'):
-               if (ESCAPE_ERROR == gly)
-                       gly = ESCAPE_NUMBERED;
+               gly = ESCAPE_NUMBERED;
                /* FALLTHROUGH */
        case ('S'):
                /* FALLTHROUGH */
@@ -241,6 +237,26 @@ mandoc_escape(const char **end, const char **start, int *sz)
                term = numeric = '\'';
                break;
 
+       /*
+        * Special handling for the numbered character escape.
+        * XXX Do any other escapes need similar handling?
+        */
+       case ('N'):
+               if ('\0' == cp[i])
+                       return(ESCAPE_ERROR);
+               *end = &cp[++i];
+               if (isdigit((unsigned char)cp[i-1]))
+                       return(ESCAPE_IGNORE);
+               while (isdigit((unsigned char)**end))
+                       (*end)++;
+               if (start)
+                       *start = &cp[i];
+               if (sz)
+                       *sz = *end - &cp[i];
+               if ('\0' != **end)
+                       (*end)++;
+               return(ESCAPE_NUMBERED);
+
        /* 
         * Sizes get a special category of their own.
         */
@@ -353,8 +369,15 @@ out:
 
        switch (gly) {
        case (ESCAPE_FONT):
-               if (1 != rlim)
+               /*
+                * Pretend that the constant-width font modes are the
+                * same as the regular font modes.
+                */
+               if (2 == rlim && 'C' == *rstart)
+                       rstart++;
+               else if (1 != rlim)
                        break;
+
                switch (*rstart) {
                case ('3'):
                        /* FALLTHROUGH */
@@ -600,9 +623,10 @@ mandoc_normdate(struct mparse *parse, char *in, int ln, int pos)
                mandoc_msg(MANDOCERR_NODATE, parse, ln, pos, NULL);
                time(&t);
        }
+       else if (a2time(&t, "%Y-%m-%d", in))
+               t = 0;
        else if (!a2time(&t, "$" "Mdocdate: %b %d %Y $", in) &&
-           !a2time(&t, "%b %d, %Y", in) &&
-           !a2time(&t, "%Y-%m-%d", in)) {
+           !a2time(&t, "%b %d, %Y", in)) {
                mandoc_msg(MANDOCERR_BADDATE, parse, ln, pos, NULL);
                t = 0;
        }
@@ -653,44 +677,6 @@ mandoc_eos(const char *p, size_t sz, int enclosed)
        return(found && !enclosed);
 }
 
-/*
- * Choose whether to break at a hyphenated character (identified by the
- * ASCII_HYPH value in the input string).
- */
-int
-mandoc_hyph(const char *start, const char *c)
-{
-       char            l, r;
-
-       l = *(c - 1);
-       r = *(c + 1);
-
-       /* Skip first/last character of buffer. */
-       if (c == start || '\0' == r)
-               return(0);
-
-       /* Skip a number on either side of the hyphen. */
-       if (isdigit((unsigned char)r) || isdigit((unsigned char)l))
-               return(0);
-
-       /* Skip first/last character of word. */
-       if ('\t' == r || '\t' == l)
-               return(0);
-
-       if (' ' == r || ' ' == l)
-               return(0);
-
-       /* Skip double invocations. */
-       if ('-' == r || '-' == l)
-               return(0);
-
-       /* Skip escapes. */
-       if ('\\' == l)
-               return(0);
-
-       return(1);
-}
-
 /*
  * Find out whether a line is a macro line or not.  If it is, adjust the
  * current position and return one; if it isn't, return zero and don't