diff options
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-.patch | 113 |
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 + |