On 11/04/10 00:56, Jim Meyering wrote: > However, what about Eric's example? > > $ src/stat-p -c '_%-0 010.4:X_' k # yours > _234 _ > $ src/stat-j -c '_%-0 010.4:X_' k # mine > _0234 _
That's simply an issue of whether the value is considered to be signed or unsigned, and can be fixed by the patch at the end of this message. However, let me take a step back a minute. Do users really want all this functionality? Personally, what I'd like to see is a single format like this: %.3X that prints out the entire seconds since the Epoch, truncated to millseconds. That's simpler than what we require now: %X.%.3:X The changelogs suggest that we used to do things the simpler way, but changed on Oct. 21. I don't recall this being discussed: I assume it was due to floating point rounding issues. Still, I'd prefer the simpler notation, and we should be able to implement it without floating point. Would that be OK? The idea would be to support ".PRECISION" in the formats for W, X, Y, and Z, and to drop support for ':W' and the like. >From 1dc473cc61099d5a1bf6bc26358bafd81cd670bd Mon Sep 17 00:00:00 2001 From: Paul Eggert <[email protected]> Date: Thu, 4 Nov 2010 12:56:17 -0700 Subject: [PATCH] * src/stat.c (out_ns): Treat the ns value as being signed. --- src/stat.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/stat.c b/src/stat.c index c1def13..dd352a4 100644 --- a/src/stat.c +++ b/src/stat.c @@ -481,7 +481,7 @@ out_ns (char *pformat, size_t prefix_len, struct timespec arg) in the modifier, then then treat the modifier as operating on the default representation, i.e., a zero padded number of width 9. */ - unsigned long int ns = arg.tv_nsec; + long int ns = arg.tv_nsec; char *dot = memchr (pformat, '.', prefix_len); if (dot) @@ -504,12 +504,12 @@ out_ns (char *pformat, size_t prefix_len, struct timespec arg) return; for (; precision < 9; precision++) ns /= 10; - strcpy (dot, "lu"); + strcpy (dot, "ld"); } else { - char const *fmt = (prefix_len == 1) ? "09lu" : "lu"; - /* Note that pformat is big enough, as %:X -> %09lu + char const *fmt = (prefix_len == 1) ? "09ld" : "ld"; + /* Note that pformat is big enough, as %:X -> %09ld and two extra bytes are already allocated. */ strcpy (pformat + prefix_len, fmt); } -- 1.7.2
