From: "CHIGOT, CLEMENT" <clement.chigot@atos.net>
To: libstdc++ <libstdc++@gcc.gnu.org>
Cc: David Edelsohn <dje.gcc@gmail.com>,
Jonathan Wakely <jwakely@redhat.com>,
David Edelsohn via Gcc-patches <gcc-patches@gcc.gnu.org>,
Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Subject: Re: [PATCH] libstdc++: implement locale support for AIX
Date: Thu, 21 Jan 2021 12:48:17 +0000 [thread overview]
Message-ID: <PA4PR02MB66860C3B1FB54ADD17809B3FEAA10@PA4PR02MB6686.eurprd02.prod.outlook.com> (raw)
In-Reply-To: <ydd7dohatqv.fsf@CeBiTec.Uni-Bielefeld.DE>
[-- Attachment #1: Type: text/plain, Size: 3839 bytes --]
Hi everyone,
Here is a new version of the patch. I've tested on Linux and AIX.
There are still some tests failing but it starts having a good shape !
However, I have few questions:
1) locale.name and syscalls
locale.name() is returning a string having the description of each locale
category. It looks like
"LC_CTYPE=en_US.UTF-8; LC_NUMERIC=en_US.UTF-8; ...".
However, in locale::global() or sometimes in c_locale.cc functions, this
name is used as arguments of setlocale, newlocale, etc.
It seems to work with GNU locale model but when I'm trying to do it
with the POSIX_2008 model, it doesn't work. A simple C program
seems to refuse it, anyway.
Thus, is there any define on Linux enabling this behavior ? And in
a more general way, I'm not sure it will work on all POSIX 2008
system. We might need to modify std:global() and other functions
ending up using locale.name() as syscalls argument.
2) Detect locale model during tests
Is there already a function in the testsuite to detect which locale model
is being used ? I didn't find any and as I'm not use to runtest scripts,
I don't really know how to implement one.
Ideally, it would be something like "has_locale_modele { gnu }". It would
allow to skip some tests which are made only for GNU model.
Is there any function I can based myself on ?
3) POSIX 2017 and non-POSIX functions
Many of the *_l functions being used in GNU or dragonfly models aren't
POSIX 2008, but mainly POSIX 2017 or like strtof_l not POSIX at all.
However, there are really useful in the code, thus I've made a double
implementation based on "#ifdef HAVE_". Is it ok for you ? It's not really
POSIX 2008 but more POSIX 2008 with 2017 compatibility.
For the configure, I didn't find any better way to check each syscall, as
they all depend on different includes. Tell me if you have a better idea.
4) ctype_configure_char.cc
I've some troubles knowing what is supposed to be implemented on this file.
I don't really understand the part with setlocale which appears in many
os. When I'm adding it, some tests start failing, some start working...
Moreover, on Linux, if I understand correctly, there is some optimizations
based on classic_table(), _M_toupper and _M_tolower. Could you confirm
that it's only useful on Linux ?
5) Some tests results
Here are the remaining tests failing on Linux x86:
FAIL: 22_locale/locale/cons/29217.cc execution test
FAIL: 22_locale/locale/cons/38368.cc execution test
FAIL: 22_locale/locale/cons/40184.cc execution test
FAIL: 22_locale/locale/cons/5.cc execution test
FAIL: 22_locale/locale/global_locale_objects/14071.cc execution test
=> linked to 1)
FAIL: 22_locale/messages/13631.cc execution test
FAIL: 22_locale/messages/members/char/1.cc execution test
FAIL: 22_locale/messages/members/char/2.cc execution test
FAIL: 22_locale/messages/members/char/wrapped_env.cc execution test
FAIL: 22_locale/messages/members/char/wrapped_locale.cc execution test
FAIL: 22_locale/messages_byname/named_equivalence.cc execution test
=> linked to message_members.cc not being implemented.
Reason behind 2)
FAIL: 22_locale/numpunct/members/char/3.cc execution test
=> No idea yet. Maybe 1) too.
FAIL: 22_locale/time_get/get_time/char/2.cc execution test
FAIL: 22_locale/time_get/get_time/char/wrapped_env.cc execution test
FAIL: 22_locale/time_get/get_time/char/wrapped_locale.cc execution test
FAIL: 22_locale/time_get/get_time/wchar_t/2.cc execution test
FAIL: 22_locale/time_get/get_time/wchar_t/wrapped_env.cc execution test
FAIL: 22_locale/time_get/get_time/wchar_t/wrapped_locale.cc execution test
=> Not related.
Feel free to try in on other OS. But I've made modifications only for AIX and
Linux, as I can test the other ones.
Thanks,
Clément
[-- Attachment #2: 0001-libstdc-implement-locale-support-for-POSIX-2008.txt --]
[-- Type: text/plain, Size: 51237 bytes --]
From 6b82a9c6b49d16e701f096891550c93661a58bbe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= <clement.chigot@atos.net>
Date: Tue, 29 Dec 2020 11:08:33 +0100
Subject: [PATCH] libstdc++: implement locale support for POSIX 2008
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The implementation is based on dragonfly one.
It also adds support for AIX with a few tweaks.
As of now, a few locale functions are missing on AIX.
For strftime_l, localeconv_l, mbstowcs_l and wcsftime_l,
uselocale must be set prior to use the version without _l.
For strtof_l, strtod_l, strtold_l, a wrapper simply calls
the default version.
libstdc++-v3/ChangeLog:
2021-01-12 Clément Chigot <clement.chigot@atos.net>
* acinclude.m4: Add ieee_1003.1-2008 locale model.
* configure: Regenerate.
* config/os/aix/ctype_configure_char.cc: Enable locale support.
* testsuite/lib/libstdc++.exp (check_v3_target_namedlocale):
Handle AIX locale names.
* testsuite/util/testsuite_hooks.h: Likewise.
* config/locale/dragonfly/c_locale.cc: Removed.
* config/locale/dragonfly/c_locale.h: Removed.
* config/locale/dragonfly/codecvt_members.cc: Removed.
* config/locale/dragonfly/collate_members.cc: Removed.
* config/locale/dragonfly/ctype_members.cc: Removed.
* config/locale/dragonfly/monetary_members.cc: Removed.
* config/locale/dragonfly/numeric_members.cc: Removed.
* config/locale/dragonfly/time_members.cc: Removed.
* config/locale/dragonfly/time_members.h: Removed.
* config/locale/ieee_1003.1-2008/c_locale.cc: New file.
* config/locale/ieee_1003.1-2008/c_locale.h: New file.
* config/locale/ieee_1003.1-2008/codecvt_members.cc: New file.
* config/locale/ieee_1003.1-2008/collate_members.cc: New file.
* config/locale/ieee_1003.1-2008/ctype_members.cc: New file.
* config/locale/ieee_1003.1-2008/monetary_members.cc: New file.
* config/locale/ieee_1003.1-2008/numeric_members.cc: New file.
* config/locale/ieee_1003.1-2008/time_members.cc: New file.
* config/locale/ieee_1003.1-2008/time_members.h: New file.
---
libstdc++-v3/acinclude.m4 | 360 +++++++++++++++++-
libstdc++-v3/config.h.in | 45 +++
.../c_locale.cc | 3 +
.../c_locale.h | 45 +++
.../codecvt_members.cc | 0
.../collate_members.cc | 35 +-
.../ctype_members.cc | 156 +++++++-
.../monetary_members.cc | 39 +-
.../numeric_members.cc | 25 ++
.../time_members.cc | 31 +-
.../time_members.h | 0
.../config/os/aix/ctype_configure_char.cc | 10 +-
.../os/gnu-linux/ctype_configure_char.cc | 4 +-
.../22_locale/codecvt/in/wchar_t/2.cc | 1 +
.../22_locale/codecvt/in/wchar_t/3.cc | 1 +
.../22_locale/codecvt/in/wchar_t/4.cc | 1 +
.../22_locale/codecvt/in/wchar_t/7.cc | 1 +
.../22_locale/codecvt/in/wchar_t/8.cc | 1 +
.../22_locale/codecvt/in/wchar_t/9.cc | 1 +
.../22_locale/codecvt/length/wchar_t/4.cc | 1 +
.../22_locale/codecvt/out/wchar_t/4.cc | 1 +
.../22_locale/codecvt/unshift/wchar_t/4.cc | 1 +
.../basic_filebuf/overflow/wchar_t/11305-1.cc | 1 +
.../basic_filebuf/overflow/wchar_t/11305-2.cc | 1 +
.../basic_filebuf/overflow/wchar_t/11305-3.cc | 1 +
.../basic_filebuf/overflow/wchar_t/11305-4.cc | 1 +
libstdc++-v3/testsuite/lib/libstdc++.exp | 5 +
libstdc++-v3/testsuite/util/testsuite_hooks.h | 3 +
28 files changed, 727 insertions(+), 47 deletions(-)
rename libstdc++-v3/config/locale/{dragonfly => ieee_1003.1-2008}/c_locale.cc (99%)
rename libstdc++-v3/config/locale/{dragonfly => ieee_1003.1-2008}/c_locale.h (72%)
rename libstdc++-v3/config/locale/{dragonfly => ieee_1003.1-2008}/codecvt_members.cc (100%)
rename libstdc++-v3/config/locale/{dragonfly => ieee_1003.1-2008}/collate_members.cc (71%)
rename libstdc++-v3/config/locale/{dragonfly => ieee_1003.1-2008}/ctype_members.cc (57%)
rename libstdc++-v3/config/locale/{dragonfly => ieee_1003.1-2008}/monetary_members.cc (96%)
rename libstdc++-v3/config/locale/{dragonfly => ieee_1003.1-2008}/numeric_members.cc (92%)
rename libstdc++-v3/config/locale/{dragonfly => ieee_1003.1-2008}/time_members.cc (93%)
rename libstdc++-v3/config/locale/{dragonfly => ieee_1003.1-2008}/time_members.h (100%)
diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index e4175ea3e64..e1d705309d7 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -2421,7 +2421,7 @@ dnl
AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
GLIBCXX_ENABLE(clocale,auto,[[[=MODEL]]],
[use MODEL for target locale package],
- [permit generic|gnu|ieee_1003.1-2001|newlib|yes|no|auto])
+ [permit generic|gnu|ieee_1003.1-2001|ieee_1003.1-2008|newlib|yes|no|auto])
# Deal with gettext issues. Default to not using it (=no) until we detect
# support for it later. Let the user turn it off via --e/d, but let that
@@ -2448,8 +2448,8 @@ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
darwin*)
enable_clocale_flag=darwin
;;
- dragonfly* | freebsd*)
- enable_clocale_flag=dragonfly
+ aix* | dragonfly* | freebsd*)
+ enable_clocale_flag=ieee_1003.1-2008
;;
openbsd*)
enable_clocale_flag=newlib
@@ -2543,23 +2543,6 @@ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
;;
- dragonfly)
- AC_MSG_RESULT(dragonfly or freebsd)
-
- CLOCALE_H=config/locale/dragonfly/c_locale.h
- CLOCALE_CC=config/locale/dragonfly/c_locale.cc
- CCODECVT_CC=config/locale/dragonfly/codecvt_members.cc
- CCOLLATE_CC=config/locale/dragonfly/collate_members.cc
- CCTYPE_CC=config/locale/dragonfly/ctype_members.cc
- CMESSAGES_H=config/locale/generic/messages_members.h
- CMESSAGES_CC=config/locale/generic/messages_members.cc
- CMONEY_CC=config/locale/dragonfly/monetary_members.cc
- CNUMERIC_CC=config/locale/dragonfly/numeric_members.cc
- CTIME_H=config/locale/dragonfly/time_members.h
- CTIME_CC=config/locale/dragonfly/time_members.cc
- CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
- ;;
-
gnu)
AC_MSG_RESULT(gnu)
@@ -2610,6 +2593,24 @@ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
CTIME_CC=config/locale/generic/time_members.cc
CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
;;
+
+ ieee_1003.1-2008)
+ AC_MSG_RESULT(ieee_1003.1-2008)
+
+ CLOCALE_H=config/locale/ieee_1003.1-2008/c_locale.h
+ CLOCALE_CC=config/locale/ieee_1003.1-2008/c_locale.cc
+ CCODECVT_CC=config/locale/ieee_1003.1-2008/codecvt_members.cc
+ CCOLLATE_CC=config/locale/ieee_1003.1-2008/collate_members.cc
+ CCTYPE_CC=config/locale/ieee_1003.1-2008/ctype_members.cc
+ CMESSAGES_H=config/locale/generic/messages_members.h
+ CMESSAGES_CC=config/locale/generic/messages_members.cc
+ CMONEY_CC=config/locale/ieee_1003.1-2008/monetary_members.cc
+ CNUMERIC_CC=config/locale/ieee_1003.1-2008/numeric_members.cc
+ CTIME_H=config/locale/ieee_1003.1-2008/time_members.h
+ CTIME_CC=config/locale/ieee_1003.1-2008/time_members.cc
+ CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
+ ;;
+
newlib)
AC_MSG_RESULT(newlib)
@@ -2656,6 +2657,325 @@ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
AC_SUBST(CTIME_CC)
AC_SUBST(CLOCALE_CC)
AC_SUBST(CLOCALE_INTERNAL_H)
+
+ if test $enable_clocale_flag = ieee_1003.1-2008; then
+ case ${target_os} in
+ dragonfly* | freebsd*) AC_DEFINE(_GLIBCXX_NEED_XLOCALE_H, 1,
+ [Define if <xlocale.h> must be included for locale support.]);;
+ esac
+
+ # Set it to scream when it hurts.
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS="-Wimplicit-function-declaration -Werror"
+
+ # Use strtof_l if available.
+ AC_MSG_CHECKING([for strtof_l])
+ AC_CACHE_VAL(glibcxx_cv_strtof_l, [
+ AC_TRY_COMPILE(
+ [
+ #include <stdlib.h>
+ #ifdef _GLIBCXX_NEED_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ ],
+ [strtof_l(0,0,0)],
+ [glibcxx_cv_strtof_l=yes],
+ [glibcxx_cv_strtof_l=no])
+ ])
+ if test $glibcxx_cv_strtof_l = yes; then
+ AC_DEFINE(HAVE_STRTOF_L, 1,
+ [Define if strtof_l is available in <stdlib.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_strtof_l)
+
+ # Use strtod_l if available.
+ AC_MSG_CHECKING([for strtod_l])
+ AC_CACHE_VAL(glibcxx_cv_strtod_l, [
+ AC_TRY_COMPILE(
+ [
+ #include <stdlib.h>
+ #ifdef _GLIBCXX_NEED_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ ],
+ [strtod_l(0,0,0)],
+ [glibcxx_cv_strtod_l=yes],
+ [glibcxx_cv_strtod_l=no])
+ ])
+ if test $glibcxx_cv_strtod_l = yes; then
+ AC_DEFINE(HAVE_STRTOD_L, 1,
+ [Define if strtod_l is available in <stdlib.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_strtod_l)
+
+ # Use strtold_l if available.
+ AC_MSG_CHECKING([for strtold_l])
+ AC_CACHE_VAL(glibcxx_cv_strtold_l, [
+ AC_TRY_COMPILE(
+ [
+ #include <stdlib.h>
+ #ifdef _GLIBCXX_NEED_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ ],
+ [strtold_l(0,0,0)],
+ [glibcxx_cv_strtold_l=yes],
+ [glibcxx_cv_strtold_l=no])
+ ])
+ if test $glibcxx_cv_strtold_l = yes; then
+ AC_DEFINE(HAVE_STRTOLD_L, 1,
+ [Define if strtold_l is available in <stdlib.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_strtold_l)
+
+ # Use localeconv_l if available.
+ AC_MSG_CHECKING([for localeconv_l])
+ AC_CACHE_VAL(glibcxx_cv_localeconv_l, [
+ AC_TRY_COMPILE(
+ [
+ #include <locale.h>
+ #ifdef _GLIBCXX_NEED_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ ],
+ [localeconv_l(0)],
+ [glibcxx_cv_localeconv_l=yes],
+ [glibcxx_cv_localeconv_l=no])
+ ])
+ if test $glibcxx_cv_localeconv_l = yes; then
+ AC_DEFINE(HAVE_LOCALECONV_L, 1,
+ [Define if localeconv_l is available in <locale.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_localeconv_l)
+
+ # Use mbstowcs_l if available.
+ AC_MSG_CHECKING([for mbstowcs_l])
+ AC_CACHE_VAL(glibcxx_cv_mbstowcs_l, [
+ AC_TRY_COMPILE(
+ [
+ #include <stdlib.h>
+ #ifdef _GLIBCXX_NEED_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ ],
+ [mbstowcs_l(0,0,0,0)],
+ [glibcxx_cv_mbstowcs_l=yes],
+ [glibcxx_cv_mbstowcs_l=no])
+ ])
+ if test $glibcxx_cv_mbstowcs_l = yes; then
+ AC_DEFINE(HAVE_MBSTOWCS_L, 1,
+ [Define if mbstowcs_l is available in <stdlib.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_mbstowcs_l)
+
+ # Use wcsftime_l if available.
+ AC_MSG_CHECKING([for wcsftime_l])
+ AC_CACHE_VAL(glibcxx_cv_wcsftime_l, [
+ AC_TRY_COMPILE(
+ [
+ #include <wchar.h>
+ #ifdef _GLIBCXX_NEED_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ ],
+ [wcsftime_l(0,0,0,0,0)],
+ [glibcxx_cv_wcsftime_l=yes],
+ [glibcxx_cv_wcsftime_l=no])
+ ])
+ if test $glibcxx_cv_wcsftime_l = yes; then
+ AC_DEFINE(HAVE_WCSFTIME_L, 1,
+ [Define if wcsftime_l is available in <wchar.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_wcsftime_l)
+
+ # Use iswctype_l if available.
+ AC_MSG_CHECKING([for iswctype_l])
+ AC_CACHE_VAL(glibcxx_cv_iswctype_l, [
+ AC_TRY_COMPILE(
+ [
+ #include <wchar.h>
+ #include <wctype.h>
+ #ifdef _GLIBCXX_NEED_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ ],
+ [iswctype_l(0,0,0)],
+ [glibcxx_cv_iswctype_l=yes],
+ [glibcxx_cv_iswctype_l=no])
+ ])
+ if test $glibcxx_cv_iswctype_l = yes; then
+ AC_DEFINE(HAVE_ISWCTYPE_L, 1,
+ [Define if iswctype_l is available in <wchar.h> or <wctype.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_iswctype_l)
+
+ # Use wctype_l if available.
+ AC_MSG_CHECKING([for wctype_l])
+ AC_CACHE_VAL(glibcxx_cv_wctype_l, [
+ AC_TRY_COMPILE(
+ [
+ #include <wchar.h>
+ #include <wctype.h>
+ #ifdef _GLIBCXX_NEED_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ ],
+ [wctype_l(0,0)],
+ [glibcxx_cv_wctype_l=yes],
+ [glibcxx_cv_wctype_l=no])
+ ])
+ if test $glibcxx_cv_wctype_l = yes; then
+ AC_DEFINE(HAVE_WCTYPE_L, 1,
+ [Define if wctype_l is available in <wchar.h> or <wctype.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_wctype_l)
+
+ # Use strcoll_l if available.
+ AC_MSG_CHECKING([for strcoll_l])
+ AC_CACHE_VAL(glibcxx_cv_strcoll_l, [
+ AC_TRY_COMPILE(
+ [
+ #include <string.h>
+ #ifdef _GLIBCXX_NEED_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ ],
+ [strcoll_l(0,0,0)],
+ [glibcxx_cv_strcoll_l=yes],
+ [glibcxx_cv_strcoll_l=no])
+ ])
+ if test $glibcxx_cv_strcoll_l = yes; then
+ AC_DEFINE(HAVE_STRCOLL_L, 1,
+ [Define if strcoll_l is available in <string.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_strcoll_l)
+
+ # Use strxfrm_l if available.
+ AC_MSG_CHECKING([for strxfrm_l])
+ AC_CACHE_VAL(glibcxx_cv_strxfrm_l, [
+ AC_TRY_COMPILE(
+ [
+ #include <string.h>
+ #ifdef _GLIBCXX_NEED_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ ],
+ [strxfrm_l(0,0,0,0)],
+ [glibcxx_cv_strxfrm_l=yes],
+ [glibcxx_cv_strxfrm_l=no])
+ ])
+ if test $glibcxx_cv_strxfrm_l = yes; then
+ AC_DEFINE(HAVE_STRXFRM_L, 1,
+ [Define if strxfrm_l is available in <string.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_strxfrm_l)
+
+ # Use wcscoll_l if available.
+ AC_MSG_CHECKING([for wcscoll_l])
+ AC_CACHE_VAL(glibcxx_cv_wcscoll_l, [
+ AC_TRY_COMPILE(
+ [
+ #include <string.h>
+ #include <wchar.h>
+ #ifdef _GLIBCXX_NEED_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ ],
+ [wcscoll_l(0,0,0)],
+ [glibcxx_cv_wcscoll_l=yes],
+ [glibcxx_cv_wcscoll_l=no])
+ ])
+ if test $glibcxx_cv_wcscoll_l = yes; then
+ AC_DEFINE(HAVE_WCSCOLL_L, 1,
+ [Define if wcscoll_l is available in <stdlib.h> or <wchar.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_wcscoll_l)
+
+ # Use wcsxfrm_l if available.
+ AC_MSG_CHECKING([for wcsxfrm_l])
+ AC_CACHE_VAL(glibcxx_cv_wcsxfrm_l, [
+ AC_TRY_COMPILE(
+ [
+ #include <string.h>
+ #include <wchar.h>
+ #ifdef _GLIBCXX_NEED_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ ],
+ [wcsxfrm_l(0,0,0,0)],
+ [glibcxx_cv_wcsxfrm_l=yes],
+ [glibcxx_cv_wcsxfrm_l=no])
+ ])
+ if test $glibcxx_cv_wcsxfrm_l = yes; then
+ AC_DEFINE(HAVE_WCSXFRM_L, 1,
+ [Define if wcsxfrm_l is available in <stdlib.h> or <wchar.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_wcsxfrm_l)
+
+ # Use towlower_l if available.
+ AC_MSG_CHECKING([for towlower_l])
+ AC_CACHE_VAL(glibcxx_cv_towlower_l, [
+ AC_TRY_COMPILE(
+ [
+ #include <wchar.h>
+ #include <wctype.h>
+ #ifdef _GLIBCXX_NEED_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ ],
+ [towlower_l(0,0)],
+ [glibcxx_cv_towlower_l=yes],
+ [glibcxx_cv_towlower_l=no])
+ ])
+ if test $glibcxx_cv_towlower_l = yes; then
+ AC_DEFINE(HAVE_TOWLOWER_L, 1,
+ [Define if towlower_l is available in <wchar.h> or <wctype.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_towlower_l)
+
+ # Use towupper_l if available.
+ AC_MSG_CHECKING([for towupper_l])
+ AC_CACHE_VAL(glibcxx_cv_towupper_l, [
+ AC_TRY_COMPILE(
+ [
+ #include <wchar.h>
+ #include <wctype.h>
+ #ifdef _GLIBCXX_NEED_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ ],
+ [towupper_l(0,0)],
+ [glibcxx_cv_towupper_l=yes],
+ [glibcxx_cv_towupper_l=no])
+ ])
+ if test $glibcxx_cv_towupper_l = yes; then
+ AC_DEFINE(HAVE_TOWUPPER_L, 1,
+ [Define if towupper_l is available in <wchar.h> or <wctype.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_towupper_l)
+
+ # Use strftime_l if available.
+ AC_MSG_CHECKING([for strftime_l])
+ AC_CACHE_VAL(glibcxx_cv_strftime_l, [
+ AC_TRY_COMPILE(
+ [
+ #include <time.h>
+ #ifdef _GLIBCXX_NEED_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ ],
+ [strftime_l(0,0,0,0,0)],
+ [glibcxx_cv_strftime_l=yes],
+ [glibcxx_cv_strftime_l=no])
+ ])
+ if test $glibcxx_cv_strftime_l = yes; then
+ AC_DEFINE(HAVE_STRFTIME_L, 1,
+ [Define if strftime_l is available in <time.h>.])
+ fi
+ AC_MSG_RESULT($glibcxx_cv_strftime_l)
+
+ CFLAGS="$ac_save_CFLAGS"
+ fi
])
diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in
index d36ca2620b4..b02bf922364 100644
--- a/libstdc++-v3/config.h.in
+++ b/libstdc++-v3/config.h.in
@@ -186,6 +186,9 @@
/* Defined if iswblank exists. */
#undef HAVE_ISWBLANK
+/* Define if iswctype_l is available in <wchar.h> or <wctype.h>. */
+#undef HAVE_ISWCTYPE_L
+
/* Define if LC_MESSAGES is available in <locale.h>. */
#undef HAVE_LC_MESSAGES
@@ -225,6 +228,9 @@
/* Define to 1 if you have the <linux/types.h> header file. */
#undef HAVE_LINUX_TYPES_H
+/* Define if localeconv_l is available in <locale.h>. */
+#undef HAVE_LOCALECONV_L
+
/* Define to 1 if you have the <locale.h> header file. */
#undef HAVE_LOCALE_H
@@ -249,6 +255,9 @@
/* Define if mbstate_t exists in wchar.h. */
#undef HAVE_MBSTATE_T
+/* Define if mbstowcs_l is available in <stdlib.h>. */
+#undef HAVE_MBSTOWCS_L
+
/* Define to 1 if you have the `memalign' function. */
#undef HAVE_MEMALIGN
@@ -354,24 +363,39 @@
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
+/* Define if strcoll_l is available in <string.h>. */
+#undef HAVE_STRCOLL_L
+
/* Define if strerror_l is available in <string.h>. */
#undef HAVE_STRERROR_L
/* Define if strerror_r is available in <string.h>. */
#undef HAVE_STRERROR_R
+/* Define if strftime_l is available in <time.h>. */
+#undef HAVE_STRFTIME_L
+
/* Define to 1 if you have the <strings.h> header file. */
#undef HAVE_STRINGS_H
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
+/* Define if strtod_l is available in <stdlib.h>. */
+#undef HAVE_STRTOD_L
+
/* Define to 1 if you have the `strtof' function. */
#undef HAVE_STRTOF
+/* Define if strtof_l is available in <stdlib.h>. */
+#undef HAVE_STRTOF_L
+
/* Define to 1 if you have the `strtold' function. */
#undef HAVE_STRTOLD
+/* Define if strtold_l is available in <stdlib.h>. */
+#undef HAVE_STRTOLD_L
+
/* Define to 1 if `d_type' is a member of `struct dirent'. */
#undef HAVE_STRUCT_DIRENT_D_TYPE
@@ -460,6 +484,12 @@
/* Define to 1 if the target supports thread-local storage. */
#undef HAVE_TLS
+/* Define if towlower_l is available in <wchar.h> or <wctype.h>. */
+#undef HAVE_TOWLOWER_L
+
+/* Define if towupper_l is available in <wchar.h> or <wctype.h>. */
+#undef HAVE_TOWUPPER_L
+
/* Define if truncate is available in <unistd.h>. */
#undef HAVE_TRUNCATE
@@ -490,12 +520,24 @@
/* Define to 1 if you have the <wchar.h> header file. */
#undef HAVE_WCHAR_H
+/* Define if wcscoll_l is available in <stdlib.h> or <wchar.h>. */
+#undef HAVE_WCSCOLL_L
+
+/* Define if wcsftime_l is available in <wchar.h>. */
+#undef HAVE_WCSFTIME_L
+
/* Defined if wcstof exists. */
#undef HAVE_WCSTOF
+/* Define if wcsxfrm_l is available in <stdlib.h> or <wchar.h>. */
+#undef HAVE_WCSXFRM_L
+
/* Define to 1 if you have the <wctype.h> header file. */
#undef HAVE_WCTYPE_H
+/* Define if wctype_l is available in <wchar.h> or <wctype.h>. */
+#undef HAVE_WCTYPE_L
+
/* Defined if Sleep exists. */
#undef HAVE_WIN32_SLEEP
@@ -835,6 +877,9 @@
/* Define to the letter to which size_t is mangled. */
#undef _GLIBCXX_MANGLE_SIZE_T
+/* Define if <xlocale.h> must be included for locale support. */
+#undef _GLIBCXX_NEED_XLOCALE_H
+
/* Define if C99 llrint and llround functions are missing from <math.h>. */
#undef _GLIBCXX_NO_C99_ROUNDING_FUNCS
diff --git a/libstdc++-v3/config/locale/dragonfly/c_locale.cc b/libstdc++-v3/config/locale/ieee_1003.1-2008/c_locale.cc
similarity index 99%
rename from libstdc++-v3/config/locale/dragonfly/c_locale.cc
rename to libstdc++-v3/config/locale/ieee_1003.1-2008/c_locale.cc
index 02df4605bb5..ea1531f5691 100644
--- a/libstdc++-v3/config/locale/dragonfly/c_locale.cc
+++ b/libstdc++-v3/config/locale/ieee_1003.1-2008/c_locale.cc
@@ -33,8 +33,11 @@
#include <locale>
#include <stdexcept>
#include <limits>
+
#include <langinfo.h>
+#ifdef _GLIBCXX_NEED_XLOCALE_H
#include <xlocale.h>
+#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
diff --git a/libstdc++-v3/config/locale/dragonfly/c_locale.h b/libstdc++-v3/config/locale/ieee_1003.1-2008/c_locale.h
similarity index 72%
rename from libstdc++-v3/config/locale/dragonfly/c_locale.h
rename to libstdc++-v3/config/locale/ieee_1003.1-2008/c_locale.h
index cf4281cebbf..31c9aab6712 100644
--- a/libstdc++-v3/config/locale/dragonfly/c_locale.h
+++ b/libstdc++-v3/config/locale/ieee_1003.1-2008/c_locale.h
@@ -40,7 +40,48 @@
#pragma GCC system_header
#include <clocale>
+#include <cstdlib>
+#ifdef _GLIBCXX_NEED_XLOCALE_H
#include <xlocale.h>
+#endif
+
+#define _GLIBCXX_C_LOCALE_IEEE_2008 1
+
+#ifndef _GLIBCXX_HAVE_STRTOF_L
+extern "C" inline
+float strtof_l (const char *__nptr, char **__endptr,
+ locale_t locale)
+{
+ locale_t __old = uselocale(locale);
+ float __res = strtof(__nptr, __endptr);
+ uselocale(__old);
+ return __res;
+}
+#endif
+
+#ifndef _GLIBCXX_HAVE_STRTOD_L
+extern "C" inline
+double strtod_l (const char *__nptr, char **__endptr,
+ locale_t locale)
+{
+ locale_t __old = uselocale(locale);
+ double __res = strtod(__nptr, __endptr);
+ uselocale(__old);
+ return __res;
+}
+#endif
+
+#ifndef _GLIBCXX_HAVE_STRTOLD_L
+extern "C" inline
+long double strtold_l (const char *__nptr, char **__endptr,
+ locale_t locale)
+{
+ locale_t __old = uselocale(locale);
+ long double __res = strtold(__nptr, __endptr);
+ uselocale(__old);
+ return __res;
+}
+#endif
#define _GLIBCXX_NUM_CATEGORIES 0
@@ -48,7 +89,11 @@ namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
+#if defined(__DragonFly__) || defined(__FreeBSD__)
typedef int* __c_locale;
+#else
+ typedef locale_t __c_locale;
+#endif
// Convert numeric value of type double and long double to string and
// return length of string. If vsnprintf is available use it, otherwise
diff --git a/libstdc++-v3/config/locale/dragonfly/codecvt_members.cc b/libstdc++-v3/config/locale/ieee_1003.1-2008/codecvt_members.cc
similarity index 100%
rename from libstdc++-v3/config/locale/dragonfly/codecvt_members.cc
rename to libstdc++-v3/config/locale/ieee_1003.1-2008/codecvt_members.cc
diff --git a/libstdc++-v3/config/locale/dragonfly/collate_members.cc b/libstdc++-v3/config/locale/ieee_1003.1-2008/collate_members.cc
similarity index 71%
rename from libstdc++-v3/config/locale/dragonfly/collate_members.cc
rename to libstdc++-v3/config/locale/ieee_1003.1-2008/collate_members.cc
index 64c7d864a61..6ecf29bfc65 100644
--- a/libstdc++-v3/config/locale/dragonfly/collate_members.cc
+++ b/libstdc++-v3/config/locale/ieee_1003.1-2008/collate_members.cc
@@ -43,7 +43,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
collate<char>::_M_compare(const char* __one,
const char* __two) const throw()
{
+#ifdef _GLIBCXX_HAVE_STRCOLL_L
int __cmp = strcoll_l(__one, __two, (locale_t)_M_c_locale_collate);
+#else
+ __c_locale __old = uselocale((locale_t)_M_c_locale_collate);
+ int __cmp = strcoll(__one, __two);
+ uselocale(__old);
+#endif
return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
}
@@ -51,7 +57,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
size_t
collate<char>::_M_transform(char* __to, const char* __from,
size_t __n) const throw()
- { return strxfrm_l(__to, __from, __n, (locale_t)_M_c_locale_collate); }
+ {
+#ifdef _GLIBCXX_HAVE_STRXFRM_L
+ return strxfrm_l(__to, __from, __n, (locale_t)_M_c_locale_collate);
+#else
+ __c_locale __old = uselocale((locale_t)_M_c_locale_collate);
+ size_t __res = strxfrm(__to, __from, __n);
+ uselocale(__old);
+ return __res;
+#endif
+ }
#ifdef _GLIBCXX_USE_WCHAR_T
template<>
@@ -59,7 +74,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
collate<wchar_t>::_M_compare(const wchar_t* __one,
const wchar_t* __two) const throw()
{
+#ifdef _GLIBCXX_HAVE_WCSCOLL_L
int __cmp = wcscoll_l(__one, __two, (locale_t)_M_c_locale_collate);
+#else
+ __c_locale __old = uselocale((locale_t)_M_c_locale_collate);
+ int __cmp = wcscoll(__one, __two);
+ uselocale(__old);
+#endif
+
return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
}
@@ -67,7 +89,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
size_t
collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from,
size_t __n) const throw()
- { return wcsxfrm_l(__to, __from, __n, (locale_t)_M_c_locale_collate); }
+ {
+#ifdef _GLIBCXX_HAVE_WCSXFRM_L
+ return wcsxfrm_l(__to, __from, __n, (locale_t)_M_c_locale_collate);
+#else
+ __c_locale __old = uselocale((locale_t)_M_c_locale_collate);
+ size_t __res = wcsxfrm(__to, __from, __n);
+ uselocale(__old);
+ return __res;
+#endif
+ }
#endif
_GLIBCXX_END_NAMESPACE_VERSION
diff --git a/libstdc++-v3/config/locale/dragonfly/ctype_members.cc b/libstdc++-v3/config/locale/ieee_1003.1-2008/ctype_members.cc
similarity index 57%
rename from libstdc++-v3/config/locale/dragonfly/ctype_members.cc
rename to libstdc++-v3/config/locale/ieee_1003.1-2008/ctype_members.cc
index 420cb51e07a..e37e9fb3b83 100644
--- a/libstdc++-v3/config/locale/dragonfly/ctype_members.cc
+++ b/libstdc++-v3/config/locale/ieee_1003.1-2008/ctype_members.cc
@@ -34,7 +34,11 @@
#include <cstdio>
#ifndef _ISbit
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
#define _ISbit(bit) ((bit) < 8 ? ((1 << (bit)) << 8) : ((1 << (bit)) >> 8))
+#else
+#define _ISbit(bit) (1 << bit)
+#endif
#endif
namespace std _GLIBCXX_VISIBILITY(default)
@@ -56,85 +60,209 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
ctype_byname<char>::~ctype_byname()
{ }
+#ifdef _GLIBCXX_HAVE_WCTYPE_L
+#define WCTYPE_L(PROP, LOCALE) wctype_l(PROP, LOCALE)
+#else
+ // "uselocale" must be called before using this macro.
+#define WCTYPE_L(PROP, LOCALE) wctype(PROP)
+#endif
+
#ifdef _GLIBCXX_USE_WCHAR_T
ctype<wchar_t>::__wmask_type
ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const throw()
{
+#ifndef _GLIBCXX_HAVE_WCTYPE_L
+ __c_locale __old = uselocale((locale_t)_M_c_locale_ctype);
+#endif
__wmask_type __ret;
switch (__m)
{
case space:
- __ret = wctype_l("space", (locale_t)_M_c_locale_ctype);
+ __ret = WCTYPE_L("space", (locale_t)_M_c_locale_ctype);
break;
case print:
- __ret = wctype_l("print", (locale_t)_M_c_locale_ctype);
+ __ret = WCTYPE_L("print", (locale_t)_M_c_locale_ctype);
break;
case cntrl:
- __ret = wctype_l("cntrl", (locale_t)_M_c_locale_ctype);
+ __ret = WCTYPE_L("cntrl", (locale_t)_M_c_locale_ctype);
break;
case upper:
- __ret = wctype_l("upper", (locale_t)_M_c_locale_ctype);
+ __ret = WCTYPE_L("upper", (locale_t)_M_c_locale_ctype);
break;
case lower:
- __ret = wctype_l("lower", (locale_t)_M_c_locale_ctype);
+ __ret = WCTYPE_L("lower", (locale_t)_M_c_locale_ctype);
break;
case alpha:
- __ret = wctype_l("alpha", (locale_t)_M_c_locale_ctype);
+ __ret = WCTYPE_L("alpha", (locale_t)_M_c_locale_ctype);
break;
case digit:
- __ret = wctype_l("digit", (locale_t)_M_c_locale_ctype);
+ __ret = WCTYPE_L("digit", (locale_t)_M_c_locale_ctype);
break;
case punct:
- __ret = wctype_l("punct", (locale_t)_M_c_locale_ctype);
+ __ret = WCTYPE_L("punct", (locale_t)_M_c_locale_ctype);
break;
case xdigit:
- __ret = wctype_l("xdigit", (locale_t)_M_c_locale_ctype);
+ __ret = WCTYPE_L("xdigit", (locale_t)_M_c_locale_ctype);
break;
case alnum:
- __ret = wctype_l("alnum", (locale_t)_M_c_locale_ctype);
+ __ret = WCTYPE_L("alnum", (locale_t)_M_c_locale_ctype);
break;
case graph:
- __ret = wctype_l("graph", (locale_t)_M_c_locale_ctype);
+ __ret = WCTYPE_L("graph", (locale_t)_M_c_locale_ctype);
break;
case blank:
- __ret = wctype_l("blank", (locale_t)_M_c_locale_ctype);
+ __ret = WCTYPE_L("blank", (locale_t)_M_c_locale_ctype);
break;
default:
__ret = __wmask_type();
}
+#ifndef _GLIBCXX_HAVE_WCTYPE_L
+ uselocale(__old);
+#endif
return __ret;
}
wchar_t
ctype<wchar_t>::do_toupper(wchar_t __c) const
- { return towupper_l(__c, (locale_t)_M_c_locale_ctype); }
+ {
+#ifdef _GLIBCXX_HAVE_TOWUPPER_L
+ return towupper_l(__c, (locale_t)_M_c_locale_ctype);
+#else
+ __c_locale __old = uselocale((locale_t)_M_c_locale_ctype);
+ wchar_t __res = towupper(__c);
+ uselocale(__old);
+ return __res;
+#endif
+ }
const wchar_t*
ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const
{
+#ifndef _GLIBCXX_HAVE_TOWUPPER_L
+ __c_locale __old = uselocale((locale_t)_M_c_locale_ctype);
+#endif
while (__lo < __hi)
{
+#ifdef _GLIBCXX_HAVE_TOWUPPER_L
*__lo = towupper_l(*__lo, (locale_t)_M_c_locale_ctype);
+#else
+ *__lo = towupper(*__lo);
+#endif
++__lo;
}
+#ifndef _GLIBCXX_HAVE_TOWUPPER_L
+ uselocale(__old);
+#endif
return __hi;
}
wchar_t
ctype<wchar_t>::do_tolower(wchar_t __c) const
- { return towlower_l(__c, (locale_t)_M_c_locale_ctype); }
+ {
+#ifdef _GLIBCXX_HAVE_TOWLOWER_L
+ return towlower_l(__c, (locale_t)_M_c_locale_ctype);
+#else
+ __c_locale __old = uselocale((locale_t)_M_c_locale_ctype);
+ wchar_t __res = towlower(__c);
+ uselocale(__old);
+ return __res;
+#endif
+ }
const wchar_t*
ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const
{
+#ifndef _GLIBCXX_HAVE_TOWLOWER_L
+ __c_locale __old = uselocale((locale_t)_M_c_locale_ctype);
+#endif
while (__lo < __hi)
{
+#ifdef _GLIBCXX_HAVE_TOWLOWER_L
*__lo = towlower_l(*__lo, (locale_t)_M_c_locale_ctype);
+#else
+ *__lo = towlower(*__lo);
+#endif
++__lo;
}
+#ifndef _GLIBCXX_HAVE_TOWLOWER_L
+ uselocale(__old);
+#endif
+ return __hi;
+ }
+
+#if !defined(__DragonFly__) && !defined(__FreeBSD__)
+ bool
+ ctype<wchar_t>::
+ do_is(mask __m, char_type __c) const
+ {
+ bool __ret = false;
+ const size_t __bitmasksize = 11;
+#ifndef _GLIBCXX_HAVE_ISWCTYPE_L
+ __c_locale __old = uselocale((locale_t)_M_c_locale_ctype);
+#endif
+ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
+ if (__m & _M_bit[__bitcur]
+#ifdef _GLIBCXX_HAVE_ISWCTYPE_L
+ && iswctype_l(__c, _M_wmask[__bitcur], (locale_t)_M_c_locale_ctype)
+#else
+ && iswctype(__c, _M_wmask[__bitcur])
+#endif
+ )
+ {
+ __ret = true;
+ break;
+ }
+#ifndef _GLIBCXX_HAVE_ISWCTYPE_L
+ uselocale(__old);
+#endif
+ return __ret;
+ }
+
+ const wchar_t*
+ ctype<wchar_t>::
+ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const
+ {
+#ifndef _GLIBCXX_HAVE_ISWCTYPE_L
+ __c_locale __old = uselocale((locale_t)_M_c_locale_ctype);
+#endif
+ for (;__lo < __hi; ++__vec, ++__lo)
+ {
+ const size_t __bitmasksize = 11;
+ mask __m = 0;
+ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
+#ifdef _GLIBCXX_HAVE_ISWCTYPE_L
+ if (iswctype_l(*__lo, _M_wmask[__bitcur], (locale_t)_M_c_locale_ctype))
+#else
+ if (iswctype(*__lo, _M_wmask[__bitcur]))
+#endif
+ __m |= _M_bit[__bitcur];
+ *__vec = __m;
+ }
+#ifndef _GLIBCXX_HAVE_ISWCTYPE_L
+ uselocale(__old);
+#endif
return __hi;
}
+ const wchar_t*
+ ctype<wchar_t>::
+ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const
+ {
+ while (__lo < __hi && !this->do_is(__m, *__lo))
+ ++__lo;
+ return __lo;
+ }
+
+ const wchar_t*
+ ctype<wchar_t>::
+ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
+ {
+ while (__lo < __hi && this->do_is(__m, *__lo) != 0)
+ ++__lo;
+ return __lo;
+ }
+#endif
+
wchar_t
ctype<wchar_t>::
do_widen(char __c) const
diff --git a/libstdc++-v3/config/locale/dragonfly/monetary_members.cc b/libstdc++-v3/config/locale/ieee_1003.1-2008/monetary_members.cc
similarity index 96%
rename from libstdc++-v3/config/locale/dragonfly/monetary_members.cc
rename to libstdc++-v3/config/locale/ieee_1003.1-2008/monetary_members.cc
index e1decc61cbf..700098c5562 100644
--- a/libstdc++-v3/config/locale/dragonfly/monetary_members.cc
+++ b/libstdc++-v3/config/locale/ieee_1003.1-2008/monetary_members.cc
@@ -31,7 +31,10 @@
#include <locale>
#include <cstring>
+
+#ifdef _GLIBCXX_NEED_XLOCALE_H
#include <xlocale.h>
+#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
@@ -241,7 +244,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
else
{
// Named locale.
+#ifdef _GLIBCXX_HAVE_LOCALECONV_L
lconv* lc = localeconv_l((locale_t) __cloc);
+#else
+ __c_locale __old = uselocale(__cloc);
+ lconv* lc = localeconv();
+#endif
// Check for NULL, which implies no fractional digits.
if (lc->mon_decimal_point == NULL ||
@@ -348,6 +356,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
delete [] __group;
delete [] __ps;
delete [] __ns;
+#ifndef _GLIBCXX_HAVE_LOCALECONV_L
+ uselocale(__old);
+#endif
__throw_exception_again;
}
@@ -360,6 +371,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
char __nspace = lc->int_n_sep_by_space;
_M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace,
__nposn);
+#ifndef _GLIBCXX_HAVE_LOCALECONV_L
+ uselocale(__old);
+#endif
}
}
@@ -395,7 +409,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
else
{
// Named locale.
+#ifdef _GLIBCXX_HAVE_LOCALECONV_L
lconv* lc = localeconv_l((locale_t) __cloc);
+#else
+ __c_locale __old = uselocale(__cloc);
+ lconv* lc = localeconv();
+#endif
// Check for NULL, which implies no fractional digits.
if (lc->mon_decimal_point == NULL ||
@@ -502,6 +521,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
delete [] __group;
delete [] __ps;
delete [] __ns;
+#ifndef _GLIBCXX_HAVE_LOCALECONV_L
+ uselocale(__old);
+#endif
__throw_exception_again;
}
@@ -514,6 +536,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
char __nspace = lc->n_sep_by_space;
_M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace,
__nposn);
+#ifndef _GLIBCXX_HAVE_LOCALECONV_L
+ uselocale(__old);
+#endif
}
}
@@ -581,9 +606,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
else
{
- __c_locale __old = (__c_locale)uselocale((locale_t)__cloc);
// Named locale.
+ // uselocale is needed for mbsrtowcs.
+ __c_locale __old = (__c_locale)uselocale((locale_t)__cloc);
+#ifdef _GLIBCXX_HAVE_LOCALECONV_L
lconv* lc = localeconv_l((locale_t) __cloc);
+#else
+ lconv* lc = localeconv();
+#endif
// Check for NULL, which implies no fractional digits.
if (lc->mon_decimal_point == NULL ||
@@ -741,9 +771,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
else
{
- __c_locale __old = (__c_locale)uselocale((locale_t)__cloc);
// Named locale.
+ // uselocale is needed for mbsrtowcs.
+ __c_locale __old = (__c_locale)uselocale((locale_t)__cloc);
+#ifdef _GLIBCXX_HAVE_LOCALECONV_L
lconv* lc = localeconv_l((locale_t) __cloc);
+#else
+ lconv* lc = localeconv();
+#endif
// Check for NULL, which implies no fractional digits.
if (lc->mon_decimal_point == NULL ||
diff --git a/libstdc++-v3/config/locale/dragonfly/numeric_members.cc b/libstdc++-v3/config/locale/ieee_1003.1-2008/numeric_members.cc
similarity index 92%
rename from libstdc++-v3/config/locale/dragonfly/numeric_members.cc
rename to libstdc++-v3/config/locale/ieee_1003.1-2008/numeric_members.cc
index cac6fe8c710..196f2952218 100644
--- a/libstdc++-v3/config/locale/dragonfly/numeric_members.cc
+++ b/libstdc++-v3/config/locale/ieee_1003.1-2008/numeric_members.cc
@@ -31,7 +31,10 @@
#include <locale>
#include <cstring>
+
+#ifdef _GLIBCXX_NEED_XLOCALE_H
#include <xlocale.h>
+#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
@@ -63,7 +66,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
else
{
// Named locale.
+#ifdef _GLIBCXX_HAVE_LOCALECONV_L
lconv* lc = localeconv_l((locale_t) __cloc);
+#else
+ __c_locale __old = uselocale(__cloc);
+ lconv* lc = localeconv();
+#endif
// Decimal point should always be defined, but check null anyway
if (lc->decimal_point == NULL)
@@ -103,6 +111,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{
delete _M_data;
_M_data = 0;
+#ifndef _GLIBCXX_HAVE_LOCALECONV_L
+ uselocale(__old);
+#endif
__throw_exception_again;
}
}
@@ -113,6 +124,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
_M_data->_M_grouping_size = __len;
}
+#ifndef _GLIBCXX_HAVE_LOCALECONV_L
+ uselocale(__old);
+#endif
}
// NB: There is no way to extact this info from posix locales.
@@ -162,7 +176,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
else
{
// Named locale.
+#ifdef _GLIBCXX_HAVE_LOCALECONV_L
lconv* lc = localeconv_l((locale_t) __cloc);
+#else
+ __c_locale __old = uselocale(__cloc);
+ lconv* lc = localeconv();
+#endif
// Decimal point should always be defined, but check null anyway
if (lc->decimal_point == NULL)
@@ -201,6 +220,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{
delete _M_data;
_M_data = 0;
+#ifndef _GLIBCXX_HAVE_LOCALECONV_L
+ uselocale(__old);
+#endif
__throw_exception_again;
}
}
@@ -211,6 +233,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
_M_data->_M_grouping_size = __len;
}
+#ifndef _GLIBCXX_HAVE_LOCALECONV_L
+ uselocale(__old);
+#endif
}
// NB: There is no way to extact this info from posix locales.
diff --git a/libstdc++-v3/config/locale/dragonfly/time_members.cc b/libstdc++-v3/config/locale/ieee_1003.1-2008/time_members.cc
similarity index 93%
rename from libstdc++-v3/config/locale/dragonfly/time_members.cc
rename to libstdc++-v3/config/locale/ieee_1003.1-2008/time_members.cc
index c8b621a323f..926cc5269b2 100644
--- a/libstdc++-v3/config/locale/dragonfly/time_members.cc
+++ b/libstdc++-v3/config/locale/ieee_1003.1-2008/time_members.cc
@@ -35,7 +35,10 @@
#include <cwchar>
#include <stdlib.h>
#include <langinfo.h>
+
+#ifdef _GLIBCXX_NEED_XLOCALE_H
#include <xlocale.h>
+#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
@@ -47,8 +50,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_put(char* __s, size_t __maxlen, const char* __format,
const tm* __tm) const throw()
{
+#ifdef _GLIBCXX_HAVE_STRFTIME_L
const size_t __len = strftime_l(__s, __maxlen, __format, __tm,
(locale_t)_M_c_locale_timepunct);
+#else
+ __c_locale __old = uselocale(_M_c_locale_timepunct);
+ const size_t __len = strftime(__s, __maxlen, __format, __tm);
+ uselocale(__old);
+#endif
// Make sure __s is null terminated.
if (__len == 0)
__s[0] = '\0';
@@ -196,15 +205,29 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format,
const tm* __tm) const throw()
{
+#ifdef _GLIBCXX_HAVE_WCSFTIME_L
const size_t __len = wcsftime_l(__s, __maxlen, __format, __tm,
(locale_t)_M_c_locale_timepunct);
+#else
+ __c_locale __old = uselocale(_M_c_locale_timepunct);
+ const size_t __len = wcsftime(__s, __maxlen, __format, __tm);
+ uselocale(__old);
+#endif
// Make sure __s is null terminated.
if (__len == 0)
__s[0] = L'\0';
}
+#ifdef _GLIBCXX_HAVE_MBSTOWCS_L
+#define MBSTOWCS_L(WCSTRING, STRING, NUMBER, LOCALE) \
+ mbstowcs_l (WCSTRING, STRING, NUMBER, LOCALE);
+#else
+ // "uselocale" must be called before using this macro.
+#define MBSTOWCS_L(WCSTRING, STRING, NUMBER, LOCALE) \
+ mbstowcs (WCSTRING, STRING, NUMBER);
+#endif
#define WIDE_LANGINFO(M,FMT) \
- fmtlen = mbstowcs_l (holder, nl_langinfo_l(FMT, (locale_t)__cloc), \
+ fmtlen = MBSTOWCS_L (holder, nl_langinfo_l(FMT, (locale_t)__cloc), \
128, (locale_t)__cloc); \
langstring = new wchar_t[fmtlen + 1]; \
wcsncpy (langstring, holder, fmtlen); \
@@ -281,6 +304,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
else
{
+#ifndef _GLIBCXX_HAVE_MBSTOWCS_L
+ __c_locale __old = uselocale(__cloc);
+#endif
wchar_t *langstring = 0;
wchar_t holder[128];
size_t fmtlen;
@@ -342,6 +368,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
WIDE_LANGINFO(_M_amonth10, ABMON_10)
WIDE_LANGINFO(_M_amonth11, ABMON_11)
WIDE_LANGINFO(_M_amonth12, ABMON_12)
+#ifndef _GLIBCXX_HAVE_MBSTOWCS_L
+ uselocale(__old);
+#endif
}
}
diff --git a/libstdc++-v3/config/locale/dragonfly/time_members.h b/libstdc++-v3/config/locale/ieee_1003.1-2008/time_members.h
similarity index 100%
rename from libstdc++-v3/config/locale/dragonfly/time_members.h
rename to libstdc++-v3/config/locale/ieee_1003.1-2008/time_members.h
diff --git a/libstdc++-v3/config/os/aix/ctype_configure_char.cc b/libstdc++-v3/config/os/aix/ctype_configure_char.cc
index b12c0bd435c..38f9308893b 100644
--- a/libstdc++-v3/config/os/aix/ctype_configure_char.cc
+++ b/libstdc++-v3/config/os/aix/ctype_configure_char.cc
@@ -46,23 +46,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
size_t __refs)
: facet(__refs), _M_del(__table != 0 && __del),
_M_toupper(NULL), _M_tolower(NULL),
- _M_table(__table ? __table : classic_table())
+ _M_table(__table ? __table : classic_table()),
+ _M_widen_ok(0), _M_narrow_ok(0)
{
memset(_M_widen, 0, sizeof(_M_widen));
- _M_widen_ok = 0;
memset(_M_narrow, 0, sizeof(_M_narrow));
- _M_narrow_ok = 0;
}
ctype<char>::ctype(const mask* __table, bool __del, size_t __refs)
: facet(__refs), _M_del(__table != 0 && __del),
_M_toupper(NULL), _M_tolower(NULL),
- _M_table(__table ? __table : classic_table())
+ _M_table(__table ? __table : classic_table()),
+ _M_widen_ok(0), _M_narrow_ok(0)
{
memset(_M_widen, 0, sizeof(_M_widen));
- _M_widen_ok = 0;
memset(_M_narrow, 0, sizeof(_M_narrow));
- _M_narrow_ok = 0;
}
char
diff --git a/libstdc++-v3/config/os/gnu-linux/ctype_configure_char.cc b/libstdc++-v3/config/os/gnu-linux/ctype_configure_char.cc
index d6ab73175b8..9cf21500271 100644
--- a/libstdc++-v3/config/os/gnu-linux/ctype_configure_char.cc
+++ b/libstdc++-v3/config/os/gnu-linux/ctype_configure_char.cc
@@ -38,7 +38,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// Information as gleaned from /usr/include/ctype.h
-#if _GLIBCXX_C_LOCALE_GNU
+#if _GLIBCXX_C_LOCALE_GNU || _GLIBCXX_C_LOCALE_IEEE_2008
const ctype_base::mask*
ctype<char>::classic_table() throw()
{ return _S_get_c_locale()->__ctype_b; }
@@ -70,7 +70,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
#endif
-#if _GLIBCXX_C_LOCALE_GNU
+#if _GLIBCXX_C_LOCALE_GNU || _GLIBCXX_C_LOCALE_IEEE_2008
ctype<char>::ctype(__c_locale __cloc, const mask* __table, bool __del,
size_t __refs)
: facet(__refs), _M_c_locale_ctype(_S_clone_c_locale(__cloc)),
diff --git a/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/2.cc b/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/2.cc
index ea0c43a20fc..71e198843d2 100644
--- a/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/2.cc
+++ b/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/2.cc
@@ -1,4 +1,5 @@
// { dg-require-namedlocale "en_US.ISO8859-1" }
+// { dg-excess-errors "wchar_t overflow" { xfail { wchar_t_char16_t_compatible } } }
// 2003-02-06 Petur Runolfsson <peturr02@ru.is>
diff --git a/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/3.cc b/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/3.cc
index 54206f8000a..ffde94108a1 100644
--- a/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/3.cc
+++ b/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/3.cc
@@ -1,4 +1,5 @@
// { dg-require-namedlocale "en_US.ISO-8859-15" }
+// { dg-excess-errors "wchar_t overflow" { xfail { wchar_t_char16_t_compatible } } }
// 2003-02-06 Petur Runolfsson <peturr02@ru.is>
diff --git a/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/4.cc b/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/4.cc
index f27d667daf5..9193b598162 100644
--- a/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/4.cc
+++ b/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/4.cc
@@ -1,4 +1,5 @@
// { dg-require-namedlocale "en_US.UTF-8" }
+// { dg-excess-errors "wchar_t overflow" { xfail { wchar_t_char16_t_compatible } } }
// 2003-02-06 Petur Runolfsson <peturr02@ru.is>
diff --git a/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/7.cc b/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/7.cc
index b5383af657c..e4b428c9fc6 100644
--- a/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/7.cc
+++ b/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/7.cc
@@ -1,4 +1,5 @@
// { dg-require-namedlocale "en_US.UTF-8" }
+// { dg-excess-errors "wchar_t overflow" { xfail { wchar_t_char16_t_compatible } } }
// 2003-02-06 Petur Runolfsson <peturr02@ru.is>
diff --git a/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/8.cc b/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/8.cc
index 1d40a1723a4..ffbd856640b 100644
--- a/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/8.cc
+++ b/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/8.cc
@@ -1,4 +1,5 @@
// { dg-require-namedlocale "en_US.UTF-8" }
+// { dg-excess-errors "wchar_t overflow" { xfail { wchar_t_char16_t_compatible } } }
// 2003-02-06 Petur Runolfsson <peturr02@ru.is>
diff --git a/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/9.cc b/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/9.cc
index 9801e085683..5e42a373547 100644
--- a/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/9.cc
+++ b/libstdc++-v3/testsuite/22_locale/codecvt/in/wchar_t/9.cc
@@ -1,4 +1,5 @@
// { dg-require-namedlocale "en_US.UTF-8" }
+// { dg-excess-errors "wchar_t overflow" { xfail { wchar_t_char16_t_compatible } } }
// 2003-02-06 Petur Runolfsson <peturr02@ru.is>
diff --git a/libstdc++-v3/testsuite/22_locale/codecvt/length/wchar_t/4.cc b/libstdc++-v3/testsuite/22_locale/codecvt/length/wchar_t/4.cc
index f70d0fc6c58..01bf1a57917 100644
--- a/libstdc++-v3/testsuite/22_locale/codecvt/length/wchar_t/4.cc
+++ b/libstdc++-v3/testsuite/22_locale/codecvt/length/wchar_t/4.cc
@@ -1,4 +1,5 @@
// { dg-require-namedlocale "en_US.UTF-8" }
+// { dg-excess-errors "wchar_t overflow" { xfail { wchar_t_char16_t_compatible } } }
// 2003-02-06 Petur Runolfsson <peturr02@ru.is>
diff --git a/libstdc++-v3/testsuite/22_locale/codecvt/out/wchar_t/4.cc b/libstdc++-v3/testsuite/22_locale/codecvt/out/wchar_t/4.cc
index 5cde0b66331..25dfa02b99d 100644
--- a/libstdc++-v3/testsuite/22_locale/codecvt/out/wchar_t/4.cc
+++ b/libstdc++-v3/testsuite/22_locale/codecvt/out/wchar_t/4.cc
@@ -1,4 +1,5 @@
// { dg-require-namedlocale "en_US.UTF-8" }
+// { dg-excess-errors "wchar_t overflow" { xfail { wchar_t_char16_t_compatible } } }
// 2003-02-06 Petur Runolfsson <peturr02@ru.is>
diff --git a/libstdc++-v3/testsuite/22_locale/codecvt/unshift/wchar_t/4.cc b/libstdc++-v3/testsuite/22_locale/codecvt/unshift/wchar_t/4.cc
index 1e4ce5a8e3e..5d00a62c9a9 100644
--- a/libstdc++-v3/testsuite/22_locale/codecvt/unshift/wchar_t/4.cc
+++ b/libstdc++-v3/testsuite/22_locale/codecvt/unshift/wchar_t/4.cc
@@ -1,4 +1,5 @@
// { dg-require-namedlocale "en_US.UTF-8" }
+// { dg-excess-errors "wchar_t overflow" { xfail { wchar_t_char16_t_compatible } } }
// 2003-02-06 Petur Runolfsson <peturr02@ru.is>
diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-1.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-1.cc
index c747f7bfb02..46713cca118 100644
--- a/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-1.cc
@@ -1,4 +1,5 @@
// { dg-require-namedlocale "en_US.UTF-8" }
+// { dg-excess-errors "wchar_t overflow" { xfail { wchar_t_char16_t_compatible } } }
// Copyright (C) 2003-2021 Free Software Foundation, Inc.
//
diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-2.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-2.cc
index 76a387768fe..a3a4bbf5833 100644
--- a/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-2.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-2.cc
@@ -1,4 +1,5 @@
// { dg-require-namedlocale "en_US.UTF-8" }
+// { dg-excess-errors "wchar_t overflow" { xfail { wchar_t_char16_t_compatible } } }
// Copyright (C) 2003-2021 Free Software Foundation, Inc.
//
diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-3.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-3.cc
index 24d192921cb..2a314589714 100644
--- a/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-3.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-3.cc
@@ -1,4 +1,5 @@
// { dg-require-namedlocale "en_US.UTF-8" }
+// { dg-excess-errors "wchar_t overflow" { xfail { wchar_t_char16_t_compatible } } }
// Copyright (C) 2003-2021 Free Software Foundation, Inc.
//
diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-4.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-4.cc
index 2c0a2ab61db..71393bbd255 100644
--- a/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-4.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-4.cc
@@ -1,4 +1,5 @@
// { dg-require-namedlocale "en_US.UTF-8" }
+// { dg-excess-errors "wchar_t overflow" { xfail { wchar_t_char16_t_compatible } } }
// Copyright (C) 2003-2021 Free Software Foundation, Inc.
//
diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp
index 30a4345b14f..200602d003e 100644
--- a/libstdc++-v3/testsuite/lib/libstdc++.exp
+++ b/libstdc++-v3/testsuite/lib/libstdc++.exp
@@ -904,6 +904,11 @@ proc check_v3_target_namedlocale { args } {
puts $f " strcpy(result, name);"
puts $f "#if defined __FreeBSD__ || defined __DragonFly__ || defined __NetBSD__"
puts $f " /* fall-through */"
+ puts $f "#elif defined _AIX"
+ puts $f " char *p = strstr(result, \"ISO8859-15\");"
+ puts $f " if (p) {"
+ puts $f " strcpy(p, \"8859-15\");"
+ puts $f " }"
puts $f "#else"
puts $f " if (strstr(result, \"ISO8859-15\")) {"
puts $f " strcat(result, \"@euro\");"
diff --git a/libstdc++-v3/testsuite/util/testsuite_hooks.h b/libstdc++-v3/testsuite/util/testsuite_hooks.h
index b5e0767211a..a632f5f31f8 100644
--- a/libstdc++-v3/testsuite/util/testsuite_hooks.h
+++ b/libstdc++-v3/testsuite/util/testsuite_hooks.h
@@ -77,6 +77,9 @@
#if defined __FreeBSD__ || defined __DragonFly__ || defined __NetBSD__
# define ISO_8859(part,langTERR) #langTERR ".ISO8859-" #part
+#elif defined _AIX
+# define ISO_8859(part,langTERR) ((part) == 15 ?\
+ #langTERR ".8859-" #part : #langTERR ".ISO8859-" #part)
#else
# define ISO_8859(part,langTERR) ((part) == 15 ?\
#langTERR ".ISO8859-" #part "@euro" : #langTERR ".ISO8859-" #part)
--
2.25.0
next prev parent reply other threads:[~2021-01-21 12:48 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <PA4PR02MB6686075C6C254E583B72BC2AEAAB0@PA4PR02MB6686.eurprd02.prod.outlook.com>
[not found] ` <CAGWvny=XpcWGnyb=MWg5ziYSND7O1AnQ6-NAX811p1b5urH0YA@mail.gmail.com>
2021-01-11 15:35 ` Rainer Orth
2021-01-11 15:40 ` Jonathan Wakely
2021-01-11 15:56 ` CHIGOT, CLEMENT
2021-01-11 22:20 ` David Edelsohn
2021-01-12 15:14 ` CHIGOT, CLEMENT
2021-01-12 15:23 ` CHIGOT, CLEMENT
2021-01-12 15:25 ` Jonathan Wakely
2021-01-12 15:40 ` CHIGOT, CLEMENT
2021-01-12 15:44 ` David Edelsohn
2021-01-12 17:34 ` Jonathan Wakely
2021-01-12 15:52 ` Rainer Orth
2021-01-12 17:41 ` Rainer Orth
2021-01-12 17:44 ` David Edelsohn
2021-01-12 19:58 ` Rainer Orth
2021-01-13 11:57 ` Rainer Orth
2021-01-13 12:23 ` CHIGOT, CLEMENT
2021-01-13 12:31 ` Rainer Orth
2021-01-13 12:41 ` CHIGOT, CLEMENT
2021-01-13 12:47 ` Rainer Orth
2021-01-21 12:48 ` CHIGOT, CLEMENT [this message]
2021-01-21 16:36 ` Rainer Orth
2021-01-22 9:57 ` CHIGOT, CLEMENT
2021-01-22 11:04 ` Rainer Orth
2021-01-22 11:29 ` Jonathan Wakely
2021-01-22 11:54 ` Rainer Orth
2021-01-22 12:23 ` CHIGOT, CLEMENT
2021-01-27 12:52 ` CHIGOT, CLEMENT
2021-01-27 14:26 ` Rainer Orth
2021-01-27 14:44 ` CHIGOT, CLEMENT
2021-01-28 10:09 ` CHIGOT, CLEMENT
2021-05-17 9:17 ` CHIGOT, CLEMENT
2021-06-08 6:59 ` CHIGOT, CLEMENT
2021-06-09 14:50 ` Rainer Orth
2021-07-21 12:00 ` CHIGOT, CLEMENT
2021-07-21 13:04 ` Rainer Orth
2021-07-22 12:09 ` CHIGOT, CLEMENT
2021-07-22 12:19 ` Rainer Orth
2021-07-30 14:02 ` CHIGOT, CLEMENT
2022-03-16 9:57 ` CHIGOT, CLEMENT
2021-01-22 11:12 ` Jonathan Wakely
2021-01-22 11:02 ` Jonathan Wakely
2021-01-12 16:00 ` Rainer Orth
[not found] ` <PA4PR02MB6686C2022E2B42D82DC9F269EAAB0@PA4PR02MB6686.eurprd02.prod.outlook.com>
2021-01-11 15:38 ` Rainer Orth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=PA4PR02MB66860C3B1FB54ADD17809B3FEAA10@PA4PR02MB6686.eurprd02.prod.outlook.com \
--to=clement.chigot@atos.net \
--cc=dje.gcc@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=jwakely@redhat.com \
--cc=libstdc++@gcc.gnu.org \
--cc=ro@CeBiTec.Uni-Bielefeld.DE \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).