This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC][PATCH v5 02/13] Provide backward compatibility for nl_langinfo family (bug 10871).


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 <errno.h>
 #include <stddef.h>
 #include "localeinfo.h"
+#include <shlib-compat.h>
 
 
 /* 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 <stddef.h>
 #include <stdlib.h>
 #include "localeinfo.h"
+#include <shlib-compat.h>
 
 
 /* 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
-- 
2.7.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]