Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: [PATCH] ztrftime(): Fix truncation for %.



On 24 Dec 2018, at 11:31, dana <dana@xxxxxxx> wrote:
>Think i'll revisit it after Christmas :/

Maybe this is more reasonable...?

dana


diff --git a/Src/utils.c b/Src/utils.c
index e43a3cdb4..6e70def81 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -3334,19 +3334,27 @@ morefmt:
 #endif
 	    switch (*fmt++) {
 	    case '.':
-		if (ztrftimebuf(&bufsize, digs))
-		    return -1;
+	    {
 		if (digs > 9)
 		    digs = 9;
+		if (ztrftimebuf(&bufsize, digs))
+		    return -1;
+		long fnsec = nsec;
 		if (digs < 9) {
-		    int trunc;
+		    int trunc, max = 10;
+		    for (trunc = 1; trunc < digs; trunc++)
+			max *= 10;
+		    max -= 1;
 		    for (trunc = 8 - digs; trunc; trunc--)
-			nsec /= 10;
-		    nsec = (nsec + 8) / 10;
+			fnsec /= 10;
+		    fnsec = (fnsec + 5) / 10;
+		    if (fnsec > max)
+			fnsec = max;
 		}
-		sprintf(buf, "%0*ld", digs, nsec);
+		sprintf(buf, "%0*ld", digs, fnsec);
 		buf += digs;
 		break;
+	    }
 	    case '\0':
 		/* Guard against premature end of string */
 		*buf++ = '%';
diff --git a/Test/V09datetime.ztst b/Test/V09datetime.ztst
index 2041d9b40..3fee49e1d 100644
--- a/Test/V09datetime.ztst
+++ b/Test/V09datetime.ztst
@@ -114,3 +114,17 @@
 
   strftime -r '%Y' 2> /dev/null
 1:-r timestring not optional
+
+  strftime '%Y-%m-%d %H:%M:%S.%3.' 1012615322 $(( 999_999 ))
+  for 1 in %. %1. %3. %6. %9. %12.; do
+    print -rn - "$1 "
+    strftime "%Y-%m-%d %H:%M:%S.$1" 1012615322 $(( 999_999_999 ))
+  done
+0:%. truncation
+>2002-02-02 02:02:02.001
+>%. 2002-02-02 02:02:02.999
+>%1. 2002-02-02 02:02:02.9
+>%3. 2002-02-02 02:02:02.999
+>%6. 2002-02-02 02:02:02.999999
+>%9. 2002-02-02 02:02:02.999999999
+>%12. 2002-02-02 02:02:02.999999999



Messages sorted by: Reverse Date, Date, Thread, Author