From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,T_DKIMWL_WL_MED autolearn=ham autolearn_force=no version=3.4.2 Received: from primenet.com.au (ns1.primenet.com.au [203.24.36.2]) by inbox.vuxu.org (OpenSMTPD) with ESMTP id bf3e55ea for ; Sat, 29 Dec 2018 11:00:06 +0000 (UTC) Received: (qmail 19190 invoked by alias); 29 Dec 2018 10:59:52 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: List-Unsubscribe: X-Seq: 43953 Received: (qmail 6028 invoked by uid 1010); 29 Dec 2018 10:59:52 -0000 X-Qmail-Scanner-Diagnostics: from mail-it1-f196.google.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.100.2/25112. spamassassin: 3.4.2. Clear:RC:0(209.85.166.196):SA:0(-1.9/5.0):. Processed in 3.149068 secs); 29 Dec 2018 10:59:52 -0000 X-Envelope-From: dana@dana.is X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dana-is.20150623.gappssmtp.com; s=20150623; h=mime-version:subject:from:in-reply-to:date:cc :content-transfer-encoding:message-id:references:to; bh=syx6oGseOXxb0mvXibQrYbNGhAjFdktH2sg62+isZzw=; b=o94E55659KVl22CUUp6HsKZr3feEhKHAdgUrH6CeM1r12zAVFV4Fx+Sx/nJDkdbUiw xC1ARBBrZJaWfWc2FtHNR6O6BMXcXt2VRM5xMUHEnBMs20LPcd1djbS/V7hsMm7Dc7cN jtJ2TSJQHAvkmNzKHI9cEyjVAwSgG0MN2sAkC7UurQ6rV5Nu/Oqze57PhLtbjiZi8oPs fLqg0pXtcG/G3ZhCpBKFggu1khy2U3eJ8/cIgmxWYy8ed5N0P2ySw7XQxbSJeWWa51ey THTKhVfqDifBR8V+DFF1V3lAnBrFzFlOX+whyHe9FrysX0HHsSkyaHBzToo+g+nSRzu3 NSbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:subject:from:in-reply-to:date:cc :content-transfer-encoding:message-id:references:to; bh=syx6oGseOXxb0mvXibQrYbNGhAjFdktH2sg62+isZzw=; b=ZA9fV3fyP5e5OkRCzyG72AEzeEOtpETup+9K0g9nSXz6yjrerH8OJghKvg/G6xhrsI 0NrBLgZ/mp3kwuZPbnVFDYOHwEv4Kd3BkA3uVWau0NQOrN9bxhrt9TzDKjV9qD4U289O kpskTBUhm+9sFaMeN8qNlPrP+GWpsVlN8JtZPXsm3ZjWE5oQT/LIfoVgNnGyxRadGEqE ERXf1OTA/S3pEqFtQRwX1CHF1JGz0H6ZDt5etZIlo+pukxFTnEzkR9LVC6QKHmDh6kEI SJgJqrKZ521B7F983Lmt7KRWW/mRWXcKphXYOVd+pbIsehvEMS2tJJ7x6+a63eruhKAo hK1g== X-Gm-Message-State: AA+aEWbdCuVAx61MVwg1rc72YIz62DCVnY8fN0FK/CLKOjBfj4s0C9oa e2L64R5LtJIEnvaA0s8IokJND7Nh9yuguw== X-Google-Smtp-Source: AFSGD/UJwjOPos4CBhgbIG2T6n/Z522dzJYH0e2xmIn2QTvFRP+8Hr9bWQNDe/NT8wwM8UXgQ1i2ug== X-Received: by 2002:a02:4511:: with SMTP id y17mr19607434jaa.56.1546081186362; Sat, 29 Dec 2018 02:59:46 -0800 (PST) Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (Mac OS X Mail 12.0 \(3445.100.39\)) Subject: Re: [PATCH] ztrftime(): Fix truncation for %. From: dana In-Reply-To: <1546079223.4133547.1620554712.04F681FA@webmail.messagingengine.com> Date: Sat, 29 Dec 2018 05:02:09 -0600 Cc: zsh-workers@zsh.org Content-Transfer-Encoding: 7bit Message-Id: References: <20181224054021.GK1941@sym.noone.org> <20181224071421.GL1941@sym.noone.org> <1545655545.1499531.1617344072.151563DD@webmail.messagingengine.com> <4E316F0B-5606-4E93-8988-28A5444612E6@dana.is> <20181224170601.i7fiz4zv5fboqtrw@tarpaulin.shahaf.local2> <20181229095516.npdfdskue6yhnrtr@tarpaulin.shahaf.local2> <1546079223.4133547.1620554712.04F681FA@webmail.messagingengine.com> To: Daniel Shahaf X-Mailer: Apple Mail (2.3445.100.39) On 29 Dec 2018, at 04:27, Daniel Shahaf wrote: >That's patently untrue. Thanks dana for catching that. I was pretty worried for a minute :| OK, that aside, i think i did address all of your feedback. Hopefully this is the final chapter in the saga of me adding a ceiling on a number dana diff --git a/Src/utils.c b/Src/utils.c index e43a3cdb4..42a860b1d 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -3334,19 +3334,28 @@ 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; - for (trunc = 8 - digs; trunc; trunc--) - nsec /= 10; - nsec = (nsec + 8) / 10; + long max = 100000000; + for (trunc = 8 - digs; trunc; trunc--) { + max /= 10; + fnsec /= 10; + } + max -= 1; + 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..9f67ecec3 100644 --- a/Test/V09datetime.ztst +++ b/Test/V09datetime.ztst @@ -114,3 +114,19 @@ strftime -r '%Y' 2> /dev/null 1:-r timestring not optional + + # This tests rounding up and the use of repeated %.s + strftime '%Y-%m-%d %H:%M:%S.%3..%3.' 1012615322 $(( 999_999 )) + # These test the ceiling on rounding up + 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.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