summaryrefslogtreecommitdiffstats
path: root/out.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-10-22 18:55:32 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-10-22 18:55:32 +0000
commitf26f75bb32fa1474ee83fcff787b6423c44189cf (patch)
tree44c7e29c549509bc9e5fd633afed4b360a966dbd /out.c
parentee228d79036122b2d0284854cd2e94526fd838b9 (diff)
downloadmandoc-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.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/out.c b/out.c
index ce09af1c..aac9d78e 100644
--- a/out.c
+++ b/out.c
@@ -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);
+}
+