# HG changeset patch # User Paul Eggert # Date 1550808441 28800 # Node ID 45dce2bf6e8aeec9f5ee2d3feffac23b27e76a8c # Parent ef116535bf1a3f0053a051063ec7afb7a8487b95 nstrftime: merge glibc strftime changes This incorporates: 2019-02-11 Fix a few whitespace arrangement inconsistencies 2019-01-24 strftime: Pass flags from "%EY" to "%Ey" [BZ #24096] 2019-01-24 Set the default width of "%Ey" to 2 [BZ #23758] 2019-01-11 strftime: use the "L_" macro with character literals * lib/nstrftime.c (__strftime_internal): New arg yr_spec. All callers changed. Default width of %Ey is now 2. This is needed for proper handling of Japanese dates starting on 2019-05-01. diff -r ef116535bf1a -r 45dce2bf6e8a ChangeLog --- a/ChangeLog Wed Feb 20 02:39:52 2019 +0100 +++ b/ChangeLog Thu Feb 21 20:07:21 2019 -0800 @@ -1,3 +1,15 @@ +2019-02-21 Paul Eggert + + nstrftime: merge glibc strftime changes + This incorporates: + 2019-02-11 Fix a few whitespace arrangement inconsistencies + 2019-01-24 strftime: Pass flags from "%EY" to "%Ey" [BZ #24096] + 2019-01-24 Set the default width of "%Ey" to 2 [BZ #23758] + 2019-01-11 strftime: use the "L_" macro with character literals + * lib/nstrftime.c (__strftime_internal): New arg yr_spec. All + callers changed. Default width of %Ey is now 2. This is needed + for proper handling of Japanese dates starting on 2019-05-01. + 2019-02-19 Bruno Haible relocatable-prog: Use $ORIGIN trick on more platforms. diff -r ef116535bf1a -r 45dce2bf6e8a lib/nstrftime.c --- a/lib/nstrftime.c Wed Feb 20 02:39:52 2019 +0100 +++ b/lib/nstrftime.c Thu Feb 21 20:07:21 2019 -0800 @@ -418,7 +418,7 @@ static size_t __strftime_internal (STREAM_OR_CHAR_T *, STRFTIME_ARG (size_t) const CHAR_T *, const struct tm *, - bool, bool * + int, bool, bool * extra_args_spec LOCALE_PARAM); /* Write information from TP into S according to the format @@ -433,7 +433,7 @@ const struct tm *tp extra_args_spec LOCALE_PARAM) { bool tzset_called = false; - return __strftime_internal (s, STRFTIME_ARG (maxsize) format, tp, + return __strftime_internal (s, STRFTIME_ARG (maxsize) format, tp, 0, false, &tzset_called extra_args LOCALE_ARG); } #if defined _LIBC && ! FPRINTFTIME @@ -446,7 +446,8 @@ static size_t __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) const CHAR_T *format, - const struct tm *tp, bool upcase, bool *tzset_called + const struct tm *tp, int yr_spec, + bool upcase, bool *tzset_called extra_args_spec LOCALE_PARAM) { #if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL @@ -850,7 +851,7 @@ if (modifier == L_('O')) goto bad_format; #ifdef _NL_CURRENT - if (! (modifier == 'E' + if (! (modifier == L_('E') && (*(subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_D_T_FMT))) @@ -863,13 +864,13 @@ subformat: { size_t len = __strftime_internal (NULL, STRFTIME_ARG ((size_t) -1) - subfmt, - tp, to_uppcase, tzset_called + subfmt, tp, yr_spec, + to_uppcase, tzset_called extra_args LOCALE_ARG); add (len, __strftime_internal (p, STRFTIME_ARG (maxsize - i) - subfmt, - tp, to_uppcase, tzset_called + subfmt, tp, yr_spec, + to_uppcase, tzset_called extra_args LOCALE_ARG)); } break; @@ -939,7 +940,7 @@ #ifdef _NL_CURRENT if (! (modifier == L_('E') && (*(subfmt = - (const CHAR_T *)_NL_CURRENT (LC_TIME, NLW(ERA_D_FMT))) + (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_D_FMT))) != L_('\0')))) subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_FMT)); goto subformat; @@ -1327,7 +1328,7 @@ DO_NUMBER (1, tp->tm_wday); case L_('Y'): - if (modifier == 'E') + if (modifier == L_('E')) { #if HAVE_STRUCT_ERA_ENTRY struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); @@ -1338,6 +1339,8 @@ # else subfmt = era->era_format; # endif + if (pad != 0) + yr_spec = pad; goto subformat; } #else @@ -1358,7 +1361,9 @@ if (era) { int delta = tp->tm_year - era->start_date[0]; - DO_NUMBER (1, (era->offset + if (yr_spec != 0) + pad = yr_spec; + DO_NUMBER (2, (era->offset + delta * era->absolute_direction)); } #else