]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
Include strftime.h, timespec.h.
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 19 Mar 2005 06:18:19 +0000 (06:18 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 19 Mar 2005 06:18:19 +0000 (06:18 +0000)
(init_header): Obtain and format nanosecond part of time stamp.

src/pr.c

index a5882aa41be221a6a98e870c23a0b43d3f74a4b7..8a84ac841634eb3f8fb995f6d6fad89f90412e3b 100644 (file)
--- a/src/pr.c
+++ b/src/pr.c
 #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 (&timespec);
+      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)