]> git.cameronkatri.com Git - mandoc.git/commitdiff
Added mandoc_a2time() for proper date conversion.
authorKristaps Dzonsons <kristaps@bsd.lv>
Mon, 2 Nov 2009 06:22:44 +0000 (06:22 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Mon, 2 Nov 2009 06:22:44 +0000 (06:22 +0000)
Fitted TH and Dd handlers to use mandoc_a2time().
Documented date syntax for -man, fixed documentation for -mdoc.

html.c
libmandoc.h
man.7
man_action.c
man_validate.c
mandoc.c
mdoc.7
mdoc_action.c
mdoc_strings.c
mdoc_validate.c

diff --git a/html.c b/html.c
index 7433479f1b6f23a505259a5c19d1855d91cd264c..5f921ad7c101e4fbd9d303bdb21ca545dc9cccd7 100644 (file)
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/*     $Id: html.c,v 1.79 2009/11/01 15:34:44 kristaps Exp $ */
+/*     $Id: html.c,v 1.80 2009/11/02 06:22:44 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -322,7 +322,8 @@ print_encode(struct html *h, const char *p)
                sz = strcspn(p, "\\<>&");
 
                fwrite(p, 1, sz, stdout);
-               p += (int)sz;
+               p += /* LINTED */
+                       sz;
 
                if ('\\' == *p) {
                        print_escape(h, &p);
index 696c923f3cae53be1388a4e481a074c771a23fd6..a6554cd0c8fa1757fe533669130e4bdf47e775e4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: libmandoc.h,v 1.3 2009/10/30 05:58:37 kristaps Exp $ */
+/*     $Id: libmandoc.h,v 1.4 2009/11/02 06:22:45 kristaps Exp $ */
 /*
  * Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -24,6 +24,11 @@ void         *mandoc_calloc(size_t, size_t);
 char           *mandoc_strdup(const char *);
 void           *mandoc_malloc(size_t);
 void           *mandoc_realloc(void *, size_t);
+time_t          mandoc_a2time(int, const char *);
+#define                 MTIME_CANONICAL        (1 << 0)
+#define                 MTIME_REDUCED          (1 << 1)
+#define                 MTIME_MDOCDATE         (1 << 2)
+#define                 MTIME_ISO_8601         (1 << 3)
 
 __END_DECLS
 
diff --git a/man.7 b/man.7
index d94497dc05b6bd1792716b1aa41df8f065d382bc..c3b313a9b7297800ceca96ac7579f846ac4925f3 100644 (file)
--- a/man.7
+++ b/man.7
@@ -1,4 +1,4 @@
-.\"    $Id: man.7,v 1.42 2009/10/31 08:37:26 kristaps Exp $
+.\"    $Id: man.7,v 1.43 2009/11/02 06:22:45 kristaps Exp $
 .\"
 .\" Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
 .\"
@@ -14,7 +14,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: October 31 2009 $
+.Dd $Mdocdate: November 2 2009 $
 .Dt MAN 7
 .Os
 .
@@ -119,6 +119,23 @@ from input.  These are later re-added, if applicable, by a front-end
 utility such as
 .Xr mandoc 1 .
 .
+.Ss Dates
+The
+.Sx \&TH
+macro is the only
+.Nm
+macro that requires a date.  The form for this date is the ISO-8601
+standard
+.Cm YYYY-MM-DD .
+.
+.Ss Scaling Widths
+Many macros support scaled widths for their arguments, such as
+stipulating a two-inch list indentation with the following:
+.Bd -literal -offset indent
+\&.Bl -tag -width 2i
+.Ed
+.
+.
 .Ss Scaling Widths
 Many macros support scaled widths for their arguments, such as
 stipulating a two-inch paragraph indentation with the following:
@@ -202,7 +219,7 @@ Beyond
 at least one macro or text node must appear in the document.  Documents
 are generally structured as follows:
 .Bd -literal -offset indent
-\&.TH FOO 1 "13 Aug 2009"
+\&.TH FOO 1 2009-10-10
 \&.
 \&.SH NAME
 \efBfoo\efR \e(en a description goes here
@@ -614,26 +631,29 @@ subsequent sub-section, section, or end of file.  The paragraph
 left-margin width is re-set to the default.
 .Ss \&TH
 Sets the title of the manual page with the following syntax:
-.Bd -literal -offset indent
-\&.TH title section [date [source [volume]]]
-.Ed
-.
 .Pp
-At least the 
-.Va title
-and
-.Va section
+.D1 \. Ns Sx \&TH No Cm title msec Op Cm date Op Cm src Op Cm vol
+.Pp
+At least the upper-case document title
+.Cm title
+and numeric manual section
+.Cm msec
 arguments must be provided.  The
-.Va date
-argument should be formatted as
-.Qq %b [%d] %Y
-format, described in
-.Xr strptime 3 .
-The
-.Va source
+.Cm date
+argument should be formatted as described in
+.Sx Dates :
+if it does not conform, the current date is used instead.  The
+.Cm src
 string specifies the organisation providing the utility.  The
-.Va volume
-replaces the default rendered volume as dictated by the manual section.
+.Cm vol
+string replaces the default rendered volume, which is dictated by the
+manual section.
+.Pp
+Examples:
+.Bd -literal -offset indent
+\&.TH CVS 5 "1992-02-12" GNU
+.Ed
+.
 .Ss \&TP
 Begin a paragraph where the head, if exceeding the indentation width, is
 followed by a newline; if not, the body follows on the same line after a
index a39f05fb316c7edbf993f66fd940bf5524f6b5f5..5a660715584159fc8911430c1631cc4415c5dd6e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_action.c,v 1.23 2009/10/31 06:10:58 kristaps Exp $ */
+/*     $Id: man_action.c,v 1.24 2009/11/02 06:22:45 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -66,11 +66,6 @@ const        struct actions man_actions[MAN_MAX] = {
        { NULL }, /* PD */
 };
 
-static time_t    man_atotime(const char *);
-#ifdef __linux__
-extern char     *strptime(const char *, const char *, struct tm *);
-#endif
-
 
 int
 man_action_post(struct man *m)
@@ -156,13 +151,18 @@ post_TH(struct man *m)
 
        /* TITLE MSEC ->DATE<- SOURCE VOL */
 
-       if (NULL == (n = n->next))
-               m->meta.date = time(NULL);
-       else if (0 == (m->meta.date = man_atotime(n->string))) {
-               if ( ! man_nwarn(m, n, WDATE))
-                       return(0);
+       n = n->next;
+       if (n) {
+               m->meta.date = mandoc_a2time
+                       (MTIME_ISO_8601, n->string);
+
+               if (0 == m->meta.date) {
+                       if ( ! man_nwarn(m, n, WDATE))
+                               return(0);
+                       m->meta.date = time(NULL);
+               }
+       } else
                m->meta.date = time(NULL);
-       }
 
        /* TITLE MSEC DATE ->SOURCE<- VOL */
 
@@ -195,24 +195,3 @@ post_TH(struct man *m)
        man_node_freelist(n);
        return(1);
 }
-
-
-static time_t
-man_atotime(const char *p)
-{
-       struct tm        tm;
-       char            *pp;
-
-       memset(&tm, 0, sizeof(struct tm));
-
-       if ((pp = strptime(p, "%b %d %Y", &tm)) && 0 == *pp)
-               return(mktime(&tm));
-       if ((pp = strptime(p, "%d %b %Y", &tm)) && 0 == *pp)
-               return(mktime(&tm));
-       if ((pp = strptime(p, "%b %d, %Y", &tm)) && 0 == *pp)
-               return(mktime(&tm));
-       if ((pp = strptime(p, "%b %Y", &tm)) && 0 == *pp)
-               return(mktime(&tm));
-
-       return(0);
-}
index ae15109a44a3711611712ccce2e8607e5017b086..ed90d873d601992c0d96d0995a890e6949e6c0e7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_validate.c,v 1.26 2009/10/24 05:45:05 kristaps Exp $ */
+/*     $Id: man_validate.c,v 1.27 2009/11/02 06:22:45 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -56,7 +56,7 @@ static        v_check   pres_bline[] = { check_bline, NULL };
 
 static const struct man_valid man_valids[MAN_MAX] = {
        { pres_bline, posts_eq0 }, /* br */
-       { pres_bline, posts_ge2_le5 }, /* TH */
+       { pres_bline, posts_ge2_le5 }, /* TH */ /* FIXME: make sure capitalised. */
        { pres_bline, posts_sec }, /* SH */
        { pres_bline, posts_sec }, /* SS */
        { pres_bline, posts_par }, /* TP */
index 7e880d4777f1656a1f0a596620ed8113aef0dfbf..8260a69cede688f9dd0ac3d63f1a06c16dc3b73a 100644 (file)
--- a/mandoc.c
+++ b/mandoc.c
@@ -1,4 +1,4 @@
-/*     $Id: mandoc.c,v 1.6 2009/10/31 06:10:58 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>
  *
  * 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 <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <time.h>
 
 #include "libmandoc.h"
 
+static int      a2time(time_t *, const char *, const char *);
+
+
 int
 mandoc_special(const char *p)
 {
@@ -163,3 +171,57 @@ mandoc_strdup(const char *ptr)
 
        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);
+}
+
diff --git a/mdoc.7 b/mdoc.7
index 53c85dd1c56db9ba76f446bd01acfe802156eacc..6372968ad52aea9602b9c9ff5f903658487672f4 100644 (file)
--- a/mdoc.7
+++ b/mdoc.7
@@ -1,4 +1,4 @@
-.\"    $Id: mdoc.7,v 1.71 2009/10/31 06:50:25 kristaps Exp $
+.\"    $Id: mdoc.7,v 1.72 2009/11/02 06:22:45 kristaps Exp $
 .\"
 .\" Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
 .\"
@@ -14,7 +14,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: October 31 2009 $
+.Dd $Mdocdate: November 2 2009 $
 .Dt MDOC 7
 .Os
 .
@@ -212,9 +212,8 @@ In free-form mode, quotes are regarded as opaque text.
 .Ss Dates
 There are several macros in
 .Nm
-that require a date argument.  The 
-.Em canonical form
-for dates is the American format:
+that require a date argument.  The canonical form for dates is the
+American format:
 .Pp
 .D1 Cm Month Day , Year
 .Pp
@@ -226,26 +225,16 @@ value is the full month name.  The
 .Cm Year
 value is the full four-digit year.
 .Pp
-The
-.Em non-canonical form
-is the same as the canonical form, but without the comma between the
-.Cm Day
-and
-.Cm Year
-field.
+Reduced form dates are broken-down canonical form dates:
 .Pp
-Lastly,
-.Em reduced form
-dates range from only a
-.Cm Year
-to the full canonical or non-canonical form.
+.D1 Cm Month , Year
+.D1 Cm Year
 .Pp
 Some examples of valid dates follow:
 .Pp
 .D1 "May, 2009" Pq reduced form
 .D1 "2009" Pq reduced form
 .D1 "May 20, 2009" Pq canonical form
-.D1 "May 20 2009" Pq non-canonical form
 .
 .Ss Scaling Widths
 Many macros support scaled widths for their arguments, such as
@@ -710,10 +699,9 @@ this macro is not implemented in
 .Ss \&%D
 Publication date of an
 .Sx \&Rs
-block.  This should follow the reduced syntax for 
+block.  This should follow the reduced or canonical form syntax
+described in
 .Sx Dates .
-Canonical or non-canonical form is not necessary since publications are
-often referenced only by year, or month and year.
 .
 .Ss \&%I
 Publisher or issuer name of an
@@ -1152,9 +1140,10 @@ The
 field may be either
 .Ar $\&Mdocdate$ ,
 which signifies the current manual revision date dictated by
-.Xr cvs 1
+.Xr cvs 1 ,
 or instead a valid canonical date as specified by
 .Sx Dates .
+If a date does not conform, the current date is used instead.
 .Pp
 Examples:
 .Bd -literal -offset indent
index 56057e0689b9112a0c69ac683ead713f9258b23c..aed126d9b3428b74539820bcfcf2117e53c28ca4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_action.c,v 1.48 2009/10/31 06:10:58 kristaps Exp $ */
+/*     $Id: mdoc_action.c,v 1.49 2009/11/02 06:22:45 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -818,8 +818,7 @@ post_ar(POST_ARGS)
 
 
 /*
- * Parse the date field in `Dd', primarily through mdoc_atotime().
- * FIXME: push mdoc_atotime() into here.
+ * Parse the date field in `Dd'.
  */
 static int
 post_dd(POST_ARGS)
@@ -829,7 +828,9 @@ post_dd(POST_ARGS)
        if ( ! concat(m, buf, n->child, DATESIZ))
                return(0);
 
-       m->meta.date = mdoc_atotime(buf);
+       m->meta.date = mandoc_a2time
+               (MTIME_MDOCDATE | MTIME_CANONICAL, buf);
+
        if (0 == m->meta.date) {
                if ( ! mdoc_nwarn(m, n, EBADDATE))
                        return(0);
index 0d63dac1d7d982b4c0eeb52a1b8d8a31c92f4547..1d73273440b1eb0fa4b866384be5fcefb60511db 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_strings.c,v 1.12 2009/10/27 08:26:12 kristaps Exp $ */
+/*     $Id: mdoc_strings.c,v 1.13 2009/11/02 06:22:46 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -56,10 +56,6 @@ static       const struct mdoc_secname secnames[SECNAME_MAX] = {
        { "SECURITY CONSIDERATIONS", SEC_SECURITY }
 };
 
-#ifdef __linux__
-extern char            *strptime(const char *, const char *, struct tm *);
-#endif
-
 
 int
 mdoc_iscdelim(char p)
@@ -125,28 +121,6 @@ mdoc_atosec(const char *p)
 }
 
 
-time_t
-mdoc_atotime(const char *p)
-{
-       struct tm        tm;
-       char            *pp;
-
-       memset(&tm, 0, sizeof(struct tm));
-
-       if (0 == strcmp(p, "$" "Mdocdate$"))
-               return(time(NULL));
-       if ((pp = strptime(p, "$" "Mdocdate: %b %d %Y $", &tm)) && 0 == *pp)
-               return(mktime(&tm));
-       /* XXX - this matches "June 1999", which is wrong. */
-       if ((pp = strptime(p, "%b %d %Y", &tm)) && 0 == *pp)
-               return(mktime(&tm));
-       if ((pp = strptime(p, "%b %d, %Y", &tm)) && 0 == *pp)
-               return(mktime(&tm));
-
-       return(0);
-}
-
-
 /* FIXME: move this into an editable .in file. */
 size_t
 mdoc_macro2len(int macro)
index 5811c5192dae102bef1d623f64cc8db34b4ae975..91d9f0324ee15debcfb93c884fbb5f21255ec74e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.53 2009/10/31 08:34:12 kristaps Exp $ */
+/*     $Id: mdoc_validate.c,v 1.54 2009/11/02 06:22:46 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -194,7 +194,7 @@ const       struct valids mdoc_valids[MDOC_MAX] = {
        { NULL, posts_xr },                     /* Xr */ 
        { NULL, posts_text },                   /* %A */
        { NULL, posts_text },                   /* %B */ /* FIXME: can be used outside Rs/Re. */
-       { NULL, posts_text },                   /* %D */
+       { NULL, posts_text },                   /* %D */ /* FIXME: check date with mandoc_a2time(). */
        { NULL, posts_text },                   /* %I */
        { NULL, posts_text },                   /* %J */
        { NULL, posts_text },                   /* %N */
@@ -808,6 +808,8 @@ static int
 pre_dt(PRE_ARGS)
 {
 
+       /* FIXME: make sure is capitalised. */
+
        if (0 == mdoc->meta.date || mdoc->meta.os)
                if ( ! mdoc_nwarn(mdoc, n, EPROLOOO))
                        return(0);