From patchwork Mon Oct 17 23:59:23 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rafal Luzynski X-Patchwork-Id: 16596 Received: (qmail 105413 invoked by alias); 17 Oct 2016 23:59:27 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 105337 invoked by uid 89); 17 Oct 2016 23:59:27 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.7 required=5.0 tests=AWL, BAYES_50, KAM_LAZY_DOMAIN_SECURITY autolearn=no version=3.3.2 spammy=H*x:Mailer, H*UA:Mailer, ITEM, 7, 8 X-HELO: aev204.rev.netart.pl Date: Tue, 18 Oct 2016 01:59:23 +0200 (CEST) From: Rafal Luzynski Reply-To: Rafal Luzynski To: libc-alpha@sourceware.org Message-ID: <919758646.118144.1476748763838@poczta.nazwa.pl> Subject: [RFC][PATCH v3 02/11] Provide backward compatibility for nl_langinfo family (bug 10871). MIME-Version: 1.0 X-Originating-Client: com.openexchange.ox.gui.dhtml As ALTMON_1 .. ALTMON_12 constants have been added no nl_langinfo* family of functions backward compatibility implementation must be provided for older binaries which assume that MON_1 .. MON_12 return month names in their nominative case. [BZ #10871] * include/langinfo.h: Declare __nl_langinfo_noaltmon_l. * locale/Versions (libc: GLIBC_2.25): New nl_langinfo* added. * locale/nl_langinfo.c: Provide backward compatible version. * locale/nl_langinfo_l.c: Likewise. --- include/langinfo.h | 2 ++ locale/Versions | 3 +++ locale/nl_langinfo.c | 17 +++++++++++++++-- locale/nl_langinfo_l.c | 42 +++++++++++++++++++++++++++++++++++++++++- 4 files changed, 61 insertions(+), 3 deletions(-) diff --git a/include/langinfo.h b/include/langinfo.h index d60d7f6..60729e4 100644 --- a/include/langinfo.h +++ b/include/langinfo.h @@ -7,6 +7,8 @@ libc_hidden_proto (nl_langinfo) extern __typeof (nl_langinfo_l) __nl_langinfo_l; libc_hidden_proto (__nl_langinfo_l) +extern __typeof (nl_langinfo_l) __nl_langinfo_noaltmon_l; +libc_hidden_proto (__nl_langinfo_noaltmon_l) #endif #endif diff --git a/locale/Versions b/locale/Versions index 7211934..25e2612 100644 --- a/locale/Versions +++ b/locale/Versions @@ -66,6 +66,9 @@ libc { wcstoll_l; wcstoul_l; wcstoull_l; wcsxfrm_l; wctype_l; wctrans_l; nl_langinfo_l; } + GLIBC_2.25 { + nl_langinfo; nl_langinfo_l; + } GLIBC_PRIVATE { # global variables __collate_element_hash; __collate_element_strings; diff --git a/locale/nl_langinfo.c b/locale/nl_langinfo.c index d523564..9be1ccb 100644 --- a/locale/nl_langinfo.c +++ b/locale/nl_langinfo.c @@ -21,13 +21,26 @@ #include #include #include "localeinfo.h" +#include /* Return a string with the data for locale-dependent parameter ITEM. */ char * -nl_langinfo (nl_item item) +__nl_langinfo (nl_item item) { return __nl_langinfo_l (item, _NL_CURRENT_LOCALE); } -libc_hidden_def (nl_langinfo) +versioned_symbol (libc, __nl_langinfo, nl_langinfo, GLIBC_2_25); +libc_hidden_ver (__nl_langinfo, nl_langinfo) + + +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_25) +char * +attribute_compat_text_section +__nl_langinfo_noaltmon (nl_item item) +{ + return __nl_langinfo_noaltmon_l (item, _NL_CURRENT_LOCALE); +} +compat_symbol (libc, __nl_langinfo_noaltmon, nl_langinfo, GLIBC_2_0); +#endif diff --git a/locale/nl_langinfo_l.c b/locale/nl_langinfo_l.c index 0032c0b..879a066 100644 --- a/locale/nl_langinfo_l.c +++ b/locale/nl_langinfo_l.c @@ -22,6 +22,7 @@ #include #include #include "localeinfo.h" +#include /* Return a string with the data for locale-dependent parameter ITEM. */ @@ -66,4 +67,43 @@ __nl_langinfo_l (nl_item item, __locale_t l) return (char *) data->values[index].string; } libc_hidden_def (__nl_langinfo_l) -weak_alias (__nl_langinfo_l, nl_langinfo_l) +versioned_symbol (libc, __nl_langinfo_l, nl_langinfo_l, GLIBC_2_25); +libc_hidden_ver (__nl_langinfo_l, nl_langinfo_l) + + +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_25) +char * +attribute_compat_text_section +__nl_langinfo_noaltmon_l (nl_item item, __locale_t l) +{ + char *result; + + if ((item >= ALTMON_1 && item <= ALTMON_12) + || (item >= _NL_WALTMON_1 && item <= _NL_WALTMON_12)) + /* Pretend it's a bogus index for this category: bogus item. */ + return (char *) ""; + else if (item >= MON_1 && item <= MON_12) + { + /* If ALTMON_... item is not empty then it contains what MON_... + item contained before. */ + result = __nl_langinfo_l (item + ALTMON_1 - MON_1, l); + if (result != NULL && result[0] != '\0') + return result; + } + else if (item >= _NL_WMON_1 && item <= _NL_WMON_12) + { + /* The same for _NL_WALTMON_... and _NL_WMON_... */ + result = __nl_langinfo_l (item + _NL_WALTMON_1 - _NL_WMON_1, l); + if (result != NULL && ((wchar_t *) result)[0] != L'\0') + return result; + } + + /* Default result if it is not a month or an alternative month is empty. */ + return __nl_langinfo_l (item, l); +} +libc_hidden_def (__nl_langinfo_noaltmon_l) +#endif + +#if SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_25) +compat_symbol (libc, __nl_langinfo_noaltmon_l, nl_langinfo_l, GLIBC_2_3); +#endif