diff options
Diffstat (limited to 'mandoc.c')
-rw-r--r-- | mandoc.c | 73 |
1 files changed, 46 insertions, 27 deletions
@@ -31,8 +31,10 @@ #include "mandoc.h" #include "libmandoc.h" -static int a2time(time_t *, const char *, const char *); +#define DATESIZE 32 +static int a2time(time_t *, const char *, const char *); +static char *time2a(time_t); int mandoc_special(char *p) @@ -380,38 +382,55 @@ a2time(time_t *t, const char *fmt, const char *p) } -/* - * 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) +static char * +time2a(time_t t) { - time_t t; + struct tm tm; + char buf[DATESIZE]; + char *p; + size_t nsz, rsz; + int isz; - if (MTIME_MDOCDATE & flags) { - if (0 == strcmp(p, "$" "Mdocdate$")) - return(time(NULL)); - if (a2time(&t, "$" "Mdocdate: %b %d %Y $", p)) - return(t); - } + localtime_r(&t, &tm); - if (MTIME_CANONICAL & flags || MTIME_REDUCED & flags) - if (a2time(&t, "%b %d, %Y", p)) - return(t); + p = buf; + rsz = DATESIZE; - if (MTIME_ISO_8601 & flags) - if (a2time(&t, "%Y-%m-%d", p)) - return(t); + if (0 == (nsz = strftime(p, rsz, "%B ", &tm))) + return(NULL); - if (MTIME_REDUCED & flags) { - if (a2time(&t, "%d, %Y", p)) - return(t); - if (a2time(&t, "%Y", p)) - return(t); - } + p += (int)nsz; + rsz -= nsz; - return(0); + if (-1 == (isz = snprintf(p, rsz, "%d, ", tm.tm_mday))) + return(NULL); + + p += isz; + rsz -= isz; + + return(strftime(p, rsz, "%Y", &tm) ? buf : NULL); +} + + +char * +mandoc_normdate(char *in, mandocmsg msg, void *data, int ln, int pos) +{ + char *out; + time_t t; + + if (NULL == in || '\0' == *in || + 0 == strcmp(in, "$" "Mdocdate$")) { + (*msg)(MANDOCERR_NODATE, data, ln, pos, NULL); + time(&t); + } + else if (!a2time(&t, "$" "Mdocdate: %b %d %Y $", in) && + !a2time(&t, "%b %d, %Y", in) && + !a2time(&t, "%Y-%m-%d", in)) { + (*msg)(MANDOCERR_BADDATE, data, ln, pos, NULL); + t = 0; + } + out = t ? time2a(t) : NULL; + return(mandoc_strdup(out ? out : in)); } |