From 2bad486665c60ac3ad25466f6fcaed1cb92e9150 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 19 Mar 2005 06:18:19 +0000 Subject: Include strftime.h, timespec.h. (init_header): Obtain and format nanosecond part of time stamp. --- src/pr.c | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) (limited to 'src/pr.c') diff --git a/src/pr.c b/src/pr.c index a5882aa41..8a84ac841 100644 --- a/src/pr.c +++ b/src/pr.c @@ -320,6 +320,8 @@ #include "inttostr.h" #include "mbswidth.h" #include "posixver.h" +#include "strftime.h" +#include "timespec.h" #include "xstrtol.h" #if ! (HAVE_DECL_STRTOUMAX || defined strtoumax) @@ -1665,30 +1667,39 @@ init_header (char *filename, int desc) { char *buf = NULL; struct stat st; + time_t s; + int ns; struct tm *tm; /* If parallel files or standard input, use current date. */ if (STREQ (filename, "-")) desc = -1; - if (desc < 0 || fstat (desc, &st) != 0) - st.st_mtime = time (NULL); + if (0 <= desc && fstat (desc, &st) == 0) + { + s = st.st_mtime; + ns = TIMESPEC_NS (st.st_mtim); + } + else + { + static struct timespec timespec; + if (! timespec.tv_sec) + gettime (×pec); + s = timespec.tv_sec; + ns = timespec.tv_nsec; + } - tm = localtime (&st.st_mtime); + tm = localtime (&s); if (tm == NULL) { - buf = xmalloc (INT_BUFSIZE_BOUND (long int)); - sprintf (buf, "%ld", (long int) st.st_mtime); + buf = xmalloc (INT_BUFSIZE_BOUND (long int) + + MAX (10, INT_BUFSIZE_BOUND (int))); + sprintf (buf, "%ld.9d", (long int) s, ns); } else { - size_t bufsize = 0; - for (;;) - { - buf = x2nrealloc (buf, &bufsize, sizeof *buf); - *buf = '\1'; - if (strftime (buf, bufsize, date_format, tm) || *buf == '\0') - break; - } + size_t bufsize = nstrftime (NULL, SIZE_MAX, date_format, tm, 0, ns) + 1; + buf = xmalloc (bufsize); + nstrftime (buf, bufsize, date_format, tm, 0, ns); } if (date_text) -- cgit v1.2.3-54-g00ecf