From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/10737 Path: news.gmane.org!.POSTED!not-for-mail From: =?UTF-8?q?Timo=20Ter=C3=A4s?= Newsgroups: gmane.linux.lib.musl.general Subject: [PATCH] implement strftime GNU extension padding specifiers '_', '-' and '0' Date: Tue, 22 Nov 2016 10:29:08 +0200 Message-ID: <20161122082908.11584-1-timo.teras@iki.fi> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: blaine.gmane.org X-Trace: blaine.gmane.org 1479803376 16305 195.159.176.226 (22 Nov 2016 08:29:36 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Tue, 22 Nov 2016 08:29:36 +0000 (UTC) Cc: =?UTF-8?q?Timo=20Ter=C3=A4s?= To: musl@lists.openwall.com Original-X-From: musl-return-10750-gllmg-musl=m.gmane.org@lists.openwall.com Tue Nov 22 09:29:29 2016 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by blaine.gmane.org with smtp (Exim 4.84_2) (envelope-from ) id 1c96SG-0002rC-J4 for gllmg-musl@m.gmane.org; Tue, 22 Nov 2016 09:29:28 +0100 Original-Received: (qmail 7371 invoked by uid 550); 22 Nov 2016 08:29:29 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Original-Received: (qmail 7342 invoked from network); 22 Nov 2016 08:29:27 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id; bh=CCYDWF0wJ7HuL3t4P8i1YdaWjCTVm4Xi6p06o+C2VyU=; b=wp7EDQfMnuX9w7r0V/xcqz3FRFM20LYJ3aFA78oKnLBqxlvNxx5KsMUqBHaEDtUvZW +2iG58My/L58YAtugbh+ESMN7VwekJnHVFs4D455RrMeU/ZDO1cVL1D5Py3JGalzVhM5 ouRzlw4V4+Ps6aCEq7LhKNqLWXxFh3sExul+bCSVgMY5M+iuXnJBBw8BkBgrfMzi2v04 Tj8hVRV8A8eYS0sWIQernQQUf2AgccUmSTkgRsZzJRlXoLgU3wSsBiVH9NWROQ4ZnDHn lHRApBhA2DTnoG/HmxJJUvaCX4C+kZuFWCJFxk8GhxQzvsg2orUJmcMn7bLxe3q2gowf 3jxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=CCYDWF0wJ7HuL3t4P8i1YdaWjCTVm4Xi6p06o+C2VyU=; b=Fs146sdh8BZqozhQANvseJTxf85QtuCoZUEuyxnxsxYckUTUZi/DHRIGYQ3rYBlESC 6cO7rIgl67gXQAGg/Edtfn5rGucCTA/DBCe+TXlhGa4cGSCRKVj35v2SLjjRxMloc0tN GrUqIFFHxJSHnx09RJdaQd+0OQJEnRibgsLEDeYkI7YByBuphR0pH4h6ubW2J1pw3H8s 269lnt2rhF/t+7Z04ExX0g8ljOPnSJkTcrHt8YimxdY7dIDdeMZETWIhY/D9MZmYhx2w havzBtEzV6LVEMTnOwXc/vu5X83C4KalLU1N2IIJ1clFg5Ck0dxIdRnJVfIPCvI0gcDc lslw== X-Gm-Message-State: AKaTC03IVhitZlS8YEZjhiB9IoKbLp9vcqcVPmqIW4uxj7CNaeW5RSIk0sEG8hnqU8THAg== X-Received: by 10.46.0.4 with SMTP id 4mr10623005lja.35.1479803355276; Tue, 22 Nov 2016 00:29:15 -0800 (PST) Original-Sender: =?UTF-8?Q?Timo_Ter=C3=A4s?= X-Mailer: git-send-email 2.10.2 Xref: news.gmane.org gmane.linux.lib.musl.general:10737 Archived-At: --- For review. GNU and most BSDs seem to implement these extensions. This applies them to numbers only. There might be few cases where this could be applied more, but I think covers most of the uses. Is there any test suite I could verify this against? src/time/strftime.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/time/strftime.c b/src/time/strftime.c index e103e02..14fe6f5 100644 --- a/src/time/strftime.c +++ b/src/time/strftime.c @@ -48,12 +48,12 @@ static int week_num(const struct tm *tm) const char *__tm_to_tzname(const struct tm *); size_t __strftime_l(char *restrict, size_t, const char *restrict, const struct tm *restrict, locale_t); -const char *__strftime_fmt_1(char (*s)[100], size_t *l, int f, const struct tm *tm, locale_t loc) +const char *__strftime_fmt_1(char (*s)[100], size_t *l, int f, const struct tm *tm, locale_t loc, int pad) { nl_item item; long long val; const char *fmt = "-"; - int width = 2; + int width = 2, def_pad = '0'; switch (f) { case 'a': @@ -79,15 +79,14 @@ const char *__strftime_fmt_1(char (*s)[100], size_t *l, int f, const struct tm * case 'C': val = (1900LL+tm->tm_year) / 100; goto number; + case 'e': + def_pad = '_'; case 'd': val = tm->tm_mday; goto number; case 'D': fmt = "%m/%d/%y"; goto recu_strftime; - case 'e': - *l = snprintf(*s, sizeof *s, "%2d", tm->tm_mday); - return *s; case 'F': fmt = "%Y-%m-%d"; goto recu_strftime; @@ -200,7 +199,12 @@ const char *__strftime_fmt_1(char (*s)[100], size_t *l, int f, const struct tm * return 0; } number: - *l = snprintf(*s, sizeof *s, "%0*lld", width, val); + switch (pad ? pad : def_pad) { + case '-': *l = snprintf(*s, sizeof *s, "%lld", val); break; + case '_': *l = snprintf(*s, sizeof *s, "%*lld", width, val); break; + case '0': + default: *l = snprintf(*s, sizeof *s, "%0*lld", width, val); break; + } return *s; nl_strcat: fmt = __nl_langinfo_l(item, loc); @@ -221,7 +225,7 @@ size_t __strftime_l(char *restrict s, size_t n, const char *restrict f, const st char buf[100]; char *p; const char *t; - int plus; + int pad, plus; unsigned long width; for (l=0; l