From patchwork Fri Dec 23 01:19:30 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rafal Luzynski X-Patchwork-Id: 18647 Received: (qmail 57918 invoked by alias); 23 Dec 2016 01:19:35 -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 57891 invoked by uid 89); 23 Dec 2016 01:19:34 -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=sk:libc_hi, libc_hidden_def, 21, 13, __typeof X-HELO: aev204.rev.netart.pl Date: Fri, 23 Dec 2016 02:19:30 +0100 (CET) From: Rafal Luzynski Reply-To: Rafal Luzynski To: libc-alpha@sourceware.org Message-ID: <1970898895.1457449.1482455970618@poczta.nazwa.pl> Subject: [RFC][PATCH v5 02/13] 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 | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 66 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..4c78967 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,47 @@ __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_internal_alias) +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_internal_alias, + nl_langinfo_l, GLIBC_2_25); +libc_hidden_ver (__nl_langinfo_l_internal_alias, 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) +{ + 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) + { + /* ALTMON_... item contains what MON_... item contained before. */ + return __nl_langinfo_l (item + ALTMON_1 - MON_1, l); + } + else if (item >= _NL_WMON_1 && item <= _NL_WMON_12) + { + /* The same for _NL_WALTMON_... and _NL_WMON_... */ + return __nl_langinfo_l (item + _NL_WALTMON_1 - _NL_WMON_1, l); + } + + /* Default result if it is not a month. */ + 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_l_alias) +compat_symbol (libc, __nl_langinfo_noaltmon_l_alias, + __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