+/* Return a printable representation of T. The result points to
+ static storage that can be reused in the next call to this
+ function, to ctime, or to asctime. */
+char const *
+tartime (time_t t)
+{
+ static char buffer[max (UINTMAX_STRSIZE_BOUND + 1,
+ INT_STRLEN_BOUND (int) + 16)];
+ char *p;
+
+#if USE_OLD_CTIME
+ p = ctime (&t);
+ if (p)
+ {
+ char const *time_stamp = p + 4;
+ for (p += 16; p[3] != '\n'; p++)
+ p[0] = p[3];
+ p[0] = '\0';
+ return time_stamp;
+ }
+#else
+ /* Use ISO 8610 format. See:
+ http://www.cl.cam.ac.uk/~mgk25/iso-time.html */
+ struct tm *tm = localtime (&t);
+ if (tm)
+ {
+ sprintf (buffer, "%04d-%02d-%02d %02d:%02d:%02d",
+ tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
+ tm->tm_hour, tm->tm_min, tm->tm_sec);
+ return buffer;
+ }
+#endif
+
+ /* The time stamp cannot be broken down, most likely because it
+ is out of range. Convert it as an integer,
+ right-adjusted in a field with the same width as the usual
+ 19-byte 4-year ISO time format. */
+ p = stringify_uintmax_t_backwards (t < 0 ? - (uintmax_t) t : (uintmax_t) t,
+ buffer + sizeof buffer);
+ if (t < 0)
+ *--p = '-';
+ while (buffer + sizeof buffer - 19 - 1 < p)
+ *--p = ' ';
+ return p;
+}
+
+/* Actually print it.
+
+ Plain and fancy file header block logging. Non-verbose just prints
+ the name, e.g. for "tar t" or "tar x". This should just contain
+ file names, so it can be fed back into tar with xargs or the "-T"
+ option. The verbose option can give a bunch of info, one line per
+ file. I doubt anybody tries to parse its format, or if they do,
+ they shouldn't. Unix tar is pretty random here anyway. */
+
+
+/* FIXME: Note that print_header uses the globals HEAD, HSTAT, and
+ HEAD_STANDARD, which must be set up in advance. Not very clean... */
+
+/* UGSWIDTH starts with 18, so with user and group names <= 8 chars, the
+ columns never shift during the listing. */
+#define UGSWIDTH 18
+static int ugswidth = UGSWIDTH; /* maximum width encountered so far */
+
+/* DATEWIDTH is the number of columns taken by the date and time fields. */
+#if USE_OLD_CDATE
+# define DATEWIDTH 19
+#else
+# define DATEWIDTH 18
+#endif