+ if (strcmp(nch->string, "$" "Mdocdate$") == 0)
+ return time2a(time(NULL));
+
+ /* Valid mdoc(7) date format. */
+
+ if (a2time(&t, "$" "Mdocdate: %b %d %Y $", nch->string) ||
+ a2time(&t, "%b %d, %Y", nch->string)) {
+ cp = time2a(t);
+ if (t > time(NULL) + 86400)
+ mandoc_msg(MANDOCERR_DATE_FUTURE, nch->line,
+ nch->pos, "%s %s", roff_name[nbl->tok], cp);
+ else if (*nch->string != '$' &&
+ strcmp(nch->string, cp) != 0)
+ mandoc_msg(MANDOCERR_DATE_NORM, nch->line,
+ nch->pos, "%s %s", roff_name[nbl->tok], cp);
+ return cp;
+ }
+
+ /* In man(7), do not warn about the legacy format. */
+
+ if (a2time(&t, "%Y-%m-%d", nch->string) == 0)
+ mandoc_msg(MANDOCERR_DATE_BAD, nch->line, nch->pos,
+ "%s %s", roff_name[nbl->tok], nch->string);
+ else if (t > time(NULL) + 86400)
+ mandoc_msg(MANDOCERR_DATE_FUTURE, nch->line, nch->pos,
+ "%s %s", roff_name[nbl->tok], nch->string);
+ else if (nbl->tok == MDOC_Dd)
+ mandoc_msg(MANDOCERR_DATE_LEGACY, nch->line, nch->pos,
+ "Dd %s", nch->string);
+
+ /* Use any non-mdoc(7) date verbatim. */
+
+ return mandoc_strdup(nch->string);