diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2009-10-22 18:55:32 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2009-10-22 18:55:32 +0000 |
commit | f26f75bb32fa1474ee83fcff787b6423c44189cf (patch) | |
tree | 44c7e29c549509bc9e5fd633afed4b360a966dbd /out.c | |
parent | ee228d79036122b2d0284854cd2e94526fd838b9 (diff) | |
download | mandoc-f26f75bb32fa1474ee83fcff787b6423c44189cf.tar.gz |
Fixed maddening mismatch between groff and strftime mismatch of day ("%e"). Noted by Ulrich Sporlein.
Diffstat (limited to 'out.c')
-rw-r--r-- | out.c | 45 |
1 files changed, 45 insertions, 0 deletions
@@ -16,9 +16,11 @@ */ #include <sys/types.h> +#include <assert.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #include "out.h" @@ -117,3 +119,46 @@ a2roffsu(const char *src, struct roffsu *dst, enum roffscale def) return(1); } + + +/* + * Correctly writes the time in nroff form, which differs from standard + * form in that a space isn't printed in lieu of the extra %e field for + * single-digit dates. + */ +void +time2a(time_t t, char *dst, size_t sz) +{ + struct tm tm; + char buf[5]; + char *p; + size_t nsz; + + assert(sz > 1); + localtime_r(&t, &tm); + + p = dst; + nsz = 0; + + dst[0] = '\0'; + + if (0 == (nsz = strftime(p, sz, "%B ", &tm))) + return; + + p += (int)nsz; + sz -= nsz; + + if (0 == strftime(buf, sizeof(buf), "%e, ", &tm)) + return; + + nsz = strlcat(p, buf + (' ' == buf[0] ? 1 : 0), sz); + + if (nsz >= sz) + return; + + p += (int)nsz; + sz -= nsz; + + (void)strftime(p, sz, "%Y", &tm); +} + |