This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH v5 3/5] strftime: Pass the additional flags from "%EY" to "%Ey" [BZ #23758]
- From: TAMUKI Shoichi <tamuki at linet dot gr dot jp>
- To: libc-alpha at sourceware dot org
- Date: Sun, 06 Jan 2019 15:34:32 +0900
- Subject: [PATCH v5 3/5] strftime: Pass the additional flags from "%EY" to "%Ey" [BZ #23758]
- References: <201901060628.AA04156@tamuki.linet.gr.jp>
For the output string of the conversion specifier "%EY", an optional
flag is given to the conversion specifier so that it can be also used
the current non-padding format, and the padding format can be
controlled. To achieve this, when an optional flag is given to the
conversion specifier "%EY", the "%Ey" included in the combined
conversion specifier is interpreted as if decorated with the
appropriate flag.
ChangeLog:
[BZ #23758]
* time/strftime_l.c (__strftime_internal): Add argument yr_spec to
override padding for "%Ey".
If an optional flag ('_' or '-') is specified to "%EY", the "%Ey" in
subformat is interpreted as if decorated with the appropriate flag.
---
time/strftime_l.c | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/time/strftime_l.c b/time/strftime_l.c
index cbe08e7afb4..12d7c0e8744 100644
--- a/time/strftime_l.c
+++ b/time/strftime_l.c
@@ -434,7 +434,7 @@ static CHAR_T const month_name[][10] =
#endif
static size_t __strftime_internal (CHAR_T *, size_t, const CHAR_T *,
- const struct tm *, bool *
+ const struct tm *, int *, bool *
ut_argument_spec
LOCALE_PARAM) __THROW;
@@ -456,8 +456,9 @@ my_strftime (CHAR_T *s, size_t maxsize, const CHAR_T *format,
tmcopy = *tp;
tp = &tmcopy;
#endif
+ int yr_spec = 0; /* Override padding for "%Ey". */
bool tzset_called = false;
- return __strftime_internal (s, maxsize, format, tp, &tzset_called
+ return __strftime_internal (s, maxsize, format, tp, &yr_spec, &tzset_called
ut_argument LOCALE_ARG);
}
#ifdef _LIBC
@@ -466,7 +467,7 @@ libc_hidden_def (my_strftime)
static size_t
__strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
- const struct tm *tp, bool *tzset_called
+ const struct tm *tp, int *yr_spec, bool *tzset_called
ut_argument_spec LOCALE_PARAM)
{
#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL
@@ -838,11 +839,12 @@ __strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
{
CHAR_T *old_start = p;
size_t len = __strftime_internal (NULL, (size_t) -1, subfmt,
- tp, tzset_called ut_argument
- LOCALE_ARG);
+ tp, yr_spec, tzset_called
+ ut_argument LOCALE_ARG);
add (len, __strftime_internal (p, maxsize - i, subfmt,
- tp, tzset_called ut_argument
- LOCALE_ARG));
+ tp, yr_spec, tzset_called
+ ut_argument LOCALE_ARG));
+ *yr_spec = 0;
if (to_uppcase)
while (old_start < p)
@@ -1273,6 +1275,8 @@ __strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
# else
subfmt = era->era_format;
# endif
+ if (pad != 0)
+ *yr_spec = pad;
goto subformat;
}
#else
@@ -1294,6 +1298,8 @@ __strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
if (era)
{
int delta = tp->tm_year - era->start_date[0];
+ if (*yr_spec != 0)
+ pad = *yr_spec;
DO_NUMBER (2, (era->offset
+ delta * era->absolute_direction));
}
--
2.12.2