From patchwork Fri Oct 28 00:45:54 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rafal Luzynski X-Patchwork-Id: 16878 Received: (qmail 25854 invoked by alias); 28 Oct 2016 00:46:00 -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 25802 invoked by uid 89); 28 Oct 2016 00:45:58 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.7 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY autolearn=no version=3.3.2 spammy=H*x:Mailer, H*UA:Mailer, 2212, 78 X-HELO: aev204.rev.netart.pl Date: Fri, 28 Oct 2016 02:45:54 +0200 (CEST) From: Rafal Luzynski Reply-To: Rafal Luzynski To: libc-alpha@sourceware.org Message-ID: <2067766829.1799957.1477615554889@poczta.nazwa.pl> Subject: [RFC][PATCH v4 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 to 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 | 53 +++++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 70 insertions(+), 5 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..6b49ddb 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; __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..63f3add 100644 --- a/locale/nl_langinfo_l.c +++ b/locale/nl_langinfo_l.c @@ -22,12 +22,13 @@ #include #include #include "localeinfo.h" +#include /* Return a string with the data for locale-dependent parameter ITEM. */ char * -__nl_langinfo_l (nl_item item, __locale_t l) +__nl_langinfo_l_internal (nl_item item, __locale_t l) { int category = _NL_ITEM_CATEGORY (item); unsigned int index = _NL_ITEM_INDEX (item); @@ -65,5 +66,51 @@ __nl_langinfo_l (nl_item item, __locale_t l) /* Return the string for the specified item. */ return (char *) data->values[index].string; } -libc_hidden_def (__nl_langinfo_l) -weak_alias (__nl_langinfo_l, nl_langinfo_l) +strong_alias (__nl_langinfo_l_internal, __nl_langinfo_l_internal2) +versioned_symbol (libc, __nl_langinfo_l_internal, __nl_langinfo_l, GLIBC_2_25); +libc_hidden_ver (__nl_langinfo_l_internal, __nl_langinfo_l) +versioned_symbol (libc, __nl_langinfo_l_internal2, nl_langinfo_l, GLIBC_2_25); +libc_hidden_ver (__nl_langinfo_l_internal2, 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_2, GLIBC_2_25) +strong_alias (__nl_langinfo_noaltmon_l, __nl_langinfo_noaltmon_l2) +compat_symbol (libc, __nl_langinfo_noaltmon_l2, __nl_langinfo_l, GLIBC_2_2); +#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