aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/1000-implement-strftime-GNU-extension-padding-specifiers-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/musl/1000-implement-strftime-GNU-extension-padding-specifiers-.patch')
-rw-r--r--main/musl/1000-implement-strftime-GNU-extension-padding-specifiers-.patch113
1 files changed, 113 insertions, 0 deletions
diff --git a/main/musl/1000-implement-strftime-GNU-extension-padding-specifiers-.patch b/main/musl/1000-implement-strftime-GNU-extension-padding-specifiers-.patch
new file mode 100644
index 0000000000..d943d5bef5
--- /dev/null
+++ b/main/musl/1000-implement-strftime-GNU-extension-padding-specifiers-.patch
@@ -0,0 +1,113 @@
+From 07285bbc354fa2882b01b01ccec439f3a986e966 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi>
+Date: Tue, 22 Nov 2016 09:17:46 +0200
+Subject: [PATCH] implement strftime GNU extension padding specifiers '_', '-'
+ and '0'
+
+---
+ src/time/strftime.c | 31 +++++++++++++++++++++----------
+ 1 file changed, 21 insertions(+), 10 deletions(-)
+
+diff --git a/src/time/strftime.c b/src/time/strftime.c
+index a3039204..733e4e28 100644
+--- a/src/time/strftime.c
++++ b/src/time/strftime.c
+@@ -46,9 +46,9 @@ 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);
++static size_t __strftime_impl(char *restrict, size_t, const char *restrict, const struct tm *restrict, locale_t, int);
+
+-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;
+@@ -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':
++ 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) {
++ 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);
+@@ -210,18 +214,18 @@ string:
+ nl_strftime:
+ fmt = __nl_langinfo_l(item, loc);
+ recu_strftime:
+- *l = __strftime_l(*s, sizeof *s, fmt, tm, loc);
++ *l = __strftime_impl(*s, sizeof *s, fmt, tm, loc, pad);
+ if (!*l) return 0;
+ return *s;
+ }
+
+-size_t __strftime_l(char *restrict s, size_t n, const char *restrict f, const struct tm *restrict tm, locale_t loc)
++static size_t __strftime_impl(char *restrict s, size_t n, const char *restrict f, const struct tm *restrict tm, locale_t loc, int def_pad)
+ {
+ size_t l, k;
+ char buf[100];
+ char *p;
+ const char *t;
+- int plus;
++ int plus, pad;
+ unsigned long width;
+ for (l=0; l<n; f++) {
+ if (!*f) {
+@@ -233,6 +237,8 @@ size_t __strftime_l(char *restrict s, size_t n, const char *restrict f, const st
+ continue;
+ }
+ f++;
++ pad = def_pad;
++ if (*f == '-' || *f == '_' || *f == '0') pad = *f++;
+ if ((plus = (*f == '+'))) f++;
+ width = strtoul(f, &p, 10);
+ if (*p == 'C' || *p == 'F' || *p == 'G' || *p == 'Y') {
+@@ -242,7 +248,7 @@ size_t __strftime_l(char *restrict s, size_t n, const char *restrict f, const st
+ }
+ f = p;
+ if (*f == 'E' || *f == 'O') f++;
+- t = __strftime_fmt_1(&buf, &k, *f, tm, loc);
++ t = __strftime_fmt_1(&buf, &k, *f, tm, loc, pad);
+ if (!t) break;
+ if (width) {
+ for (; *t=='+' || *t=='-' || (*t=='0'&&t[1]); t++, k--);
+@@ -267,6 +273,11 @@ size_t __strftime_l(char *restrict s, size_t n, const char *restrict f, const st
+ return 0;
+ }
+
++size_t __strftime_l(char *restrict s, size_t n, const char *restrict f, const struct tm *restrict tm, locale_t loc)
++{
++ return __strftime_impl(s, n, f, tm, loc, '0');
++}
++
+ size_t strftime(char *restrict s, size_t n, const char *restrict f, const struct tm *restrict tm)
+ {
+ return __strftime_l(s, n, f, tm, CURRENT_LOCALE);
+--
+2.13.0
+