]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandoc.c
Back out OpenBSD special case (ok Ingo Schwarze).
[mandoc.git] / mandoc.c
index 8260a69cede688f9dd0ac3d63f1a06c16dc3b73a..17d6d1037489f20f319242e2d3f14929a17d3e29 100644 (file)
--- a/mandoc.c
+++ b/mandoc.c
@@ -1,4 +1,4 @@
-/*     $Id: mandoc.c,v 1.7 2009/11/02 06:22:45 kristaps Exp $ */
+/*     $Id: mandoc.c,v 1.11 2010/04/07 11:25:38 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -14,8 +14,8 @@
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
-#if defined(__linux__) || defined(__MINT__)
-# define _GNU_SOURCE /* strptime() */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
 #endif
 
 #include <sys/types.h>
@@ -35,14 +35,14 @@ static int   a2time(time_t *, const char *, const char *);
 int
 mandoc_special(const char *p)
 {
-       int              c;
+       int              terminator;    /* Terminator for \s. */
+       int              lim;           /* Limit for N in \s. */
+       int              c, i;
        
        if ('\\' != *p++)
                return(0);
 
        switch (*p) {
-       case ('\\'):
-               /* FALLTHROUGH */
        case ('\''):
                /* FALLTHROUGH */
        case ('`'):
@@ -73,10 +73,85 @@ mandoc_special(const char *p)
                return(2);
        case ('e'):
                return(2);
-       case ('f'):
-               if (0 == *++p || ! isgraph((u_char)*p))
+       case ('s'):
+               if ('\0' == *++p)
+                       return(2);
+
+               c = 2;
+               terminator = 0;
+               lim = 1;
+
+               if (*p == '\'') {
+                       lim = 0;
+                       terminator = 1;
+                       ++p;
+                       ++c;
+               } else if (*p == '[') {
+                       lim = 0;
+                       terminator = 2;
+                       ++p;
+                       ++c;
+               } else if (*p == '(') {
+                       lim = 2;
+                       terminator = 3;
+                       ++p;
+                       ++c;
+               }
+
+               if (*p == '+' || *p == '-') {
+                       ++p;
+                       ++c;
+               }
+
+               if (*p == '\'') {
+                       if (terminator)
+                               return(0);
+                       lim = 0;
+                       terminator = 1;
+                       ++p;
+                       ++c;
+               } else if (*p == '[') {
+                       if (terminator)
+                               return(0);
+                       lim = 0;
+                       terminator = 2;
+                       ++p;
+                       ++c;
+               } else if (*p == '(') {
+                       if (terminator)
+                               return(0);
+                       lim = 2;
+                       terminator = 3;
+                       ++p;
+                       ++c;
+               }
+
+               /* TODO: needs to handle floating point. */
+
+               if ( ! isdigit((u_char)*p))
                        return(0);
-               return(3);
+
+               for (i = 0; isdigit((u_char)*p); i++) {
+                       if (lim && i >= lim)
+                               break;
+                       ++p;
+                       ++c;
+               }
+
+               if (terminator && terminator < 3) {
+                       if (1 == terminator && *p != '\'')
+                               return(0);
+                       if (2 == terminator && *p != ']')
+                               return(0);
+                       ++p;
+                       ++c;
+               }
+
+               return(c);
+       case ('f'):
+               /* FALLTHROUGH */
+       case ('F'):
+               /* FALLTHROUGH */
        case ('*'):
                if (0 == *++p || ! isgraph((u_char)*p))
                        return(0);