]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandoc.c
Fixed `Bf Li' default style (monospace).
[mandoc.git] / mandoc.c
index 068b365db9e7404b60dd5a5067225e4f9695637a..8260a69cede688f9dd0ac3d63f1a06c16dc3b73a 100644 (file)
--- a/mandoc.c
+++ b/mandoc.c
@@ -1,4 +1,4 @@
-/*     $Id: mandoc.c,v 1.5 2009/10/30 05:58:38 kristaps Exp $ */
+/*     $Id: mandoc.c,v 1.7 2009/11/02 06:22:45 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
  * 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() */
+#endif
+
 #include <sys/types.h>
 
 #include <assert.h>
 #include <sys/types.h>
 
 #include <assert.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <time.h>
 
 #include "libmandoc.h"
 
 
 #include "libmandoc.h"
 
+static int      a2time(time_t *, const char *, const char *);
+
+
 int
 mandoc_special(const char *p)
 {
 int
 mandoc_special(const char *p)
 {
@@ -113,7 +121,7 @@ mandoc_calloc(size_t num, size_t size)
 
        ptr = calloc(num, size);
        if (NULL == ptr) {
 
        ptr = calloc(num, size);
        if (NULL == ptr) {
-               fprintf(stderr, "memory exhausted\n");
+               perror(NULL);
                exit(EXIT_FAILURE);
        }
 
                exit(EXIT_FAILURE);
        }
 
@@ -128,7 +136,7 @@ mandoc_malloc(size_t size)
 
        ptr = malloc(size);
        if (NULL == ptr) {
 
        ptr = malloc(size);
        if (NULL == ptr) {
-               fprintf(stderr, "memory exhausted\n");
+               perror(NULL);
                exit(EXIT_FAILURE);
        }
 
                exit(EXIT_FAILURE);
        }
 
@@ -142,7 +150,7 @@ mandoc_realloc(void *ptr, size_t size)
 
        ptr = realloc(ptr, size);
        if (NULL == ptr) {
 
        ptr = realloc(ptr, size);
        if (NULL == ptr) {
-               fprintf(stderr, "memory exhausted\n");
+               perror(NULL);
                exit(EXIT_FAILURE);
        }
 
                exit(EXIT_FAILURE);
        }
 
@@ -157,9 +165,63 @@ mandoc_strdup(const char *ptr)
 
        p = strdup(ptr);
        if (NULL == p) {
 
        p = strdup(ptr);
        if (NULL == p) {
-               fprintf(stderr, "memory exhausted\n");
+               perror(NULL);
                exit(EXIT_FAILURE);
        }
 
        return(p);
 }
                exit(EXIT_FAILURE);
        }
 
        return(p);
 }
+
+
+static int
+a2time(time_t *t, const char *fmt, const char *p)
+{
+       struct tm        tm;
+       char            *pp;
+
+       memset(&tm, 0, sizeof(struct tm));
+
+       pp = strptime(p, fmt, &tm);
+       if (NULL != pp && '\0' == *pp) {
+               *t = mktime(&tm);
+               return(1);
+       }
+
+       return(0);
+}
+
+
+/*
+ * Convert from a manual date string (see mdoc(7) and man(7)) into a
+ * date according to the stipulated date type.
+ */
+time_t
+mandoc_a2time(int flags, const char *p)
+{
+       time_t           t;
+
+       if (MTIME_MDOCDATE & flags) {
+               if (0 == strcmp(p, "$" "Mdocdate$"))
+                       return(time(NULL));
+               if (a2time(&t, "$" "Mdocdate: %b %d %Y $", p))
+                       return(t);
+       }
+
+       if (MTIME_CANONICAL & flags || MTIME_REDUCED & flags) 
+               if (a2time(&t, "%b %d, %Y", p))
+                       return(t);
+
+       if (MTIME_ISO_8601 & flags) 
+               if (a2time(&t, "%Y-%m-%d", p))
+                       return(t);
+
+       if (MTIME_REDUCED & flags) {
+               if (a2time(&t, "%d, %Y", p))
+                       return(t);
+               if (a2time(&t, "%Y", p))
+                       return(t);
+       }
+
+       return(0);
+}
+