aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/config/os/gnu-linux/ctype_noninline.h
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3/config/os/gnu-linux/ctype_noninline.h')
-rw-r--r--libstdc++-v3/config/os/gnu-linux/ctype_noninline.h57
1 files changed, 39 insertions, 18 deletions
diff --git a/libstdc++-v3/config/os/gnu-linux/ctype_noninline.h b/libstdc++-v3/config/os/gnu-linux/ctype_noninline.h
index 779b26a0d49..808b25c9328 100644
--- a/libstdc++-v3/config/os/gnu-linux/ctype_noninline.h
+++ b/libstdc++-v3/config/os/gnu-linux/ctype_noninline.h
@@ -50,17 +50,24 @@
{
const ctype_base::mask* __ret;
char* __old = setlocale(LC_CTYPE, NULL);
- const size_t __len = __builtin_strlen(__old) + 1;
- char* __sav = new char[__len];
- __builtin_memcpy(__sav, __old, __len);
- setlocale(LC_CTYPE, "C");
+ char* __sav = NULL;
+ if (__builtin_strcmp(__old, "C"))
+ {
+ const size_t __len = __builtin_strlen(__old) + 1;
+ __sav = new char[__len];
+ __builtin_memcpy(__sav, __old, __len);
+ setlocale(LC_CTYPE, "C");
+ }
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
__ret = *__ctype_b_loc();
#else
__ret = __ctype_b;
#endif
- setlocale(LC_CTYPE, __sav);
- delete [] __sav;
+ if (__sav)
+ {
+ setlocale(LC_CTYPE, __sav);
+ delete [] __sav;
+ }
return __ret;
}
#endif
@@ -85,10 +92,14 @@
_M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
{
char* __old = setlocale(LC_CTYPE, NULL);
- const size_t __len = __builtin_strlen(__old) + 1;
- char* __sav = new char[__len];
- __builtin_memcpy(__sav, __old, __len);
- setlocale(LC_CTYPE, "C");
+ char* __sav = NULL;
+ if (__builtin_strcmp(__old, "C"))
+ {
+ const size_t __len = __builtin_strlen(__old) + 1;
+ __sav = new char[__len];
+ __builtin_memcpy(__sav, __old, __len);
+ setlocale(LC_CTYPE, "C");
+ }
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
_M_toupper = *__ctype_toupper_loc();
_M_tolower = *__ctype_tolower_loc();
@@ -98,8 +109,11 @@
_M_tolower = __ctype_tolower;
_M_table = __table ? __table : __ctype_b;
#endif
- setlocale(LC_CTYPE, __sav);
- delete [] __sav;
+ if (__sav)
+ {
+ setlocale(LC_CTYPE, __sav);
+ delete [] __sav;
+ }
__builtin_memset(_M_widen, 0, sizeof(_M_widen));
__builtin_memset(_M_narrow, 0, sizeof(_M_narrow));
}
@@ -123,10 +137,14 @@
_M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
{
char* __old = setlocale(LC_CTYPE, NULL);
- const size_t __len = __builtin_strlen(__old) + 1;
- char* __sav = new char[__len];
- __builtin_memcpy(__sav, __old, __len);
- setlocale(LC_CTYPE, "C");
+ char* __sav = NULL;
+ if (__builtin_strcmp(__old, "C"))
+ {
+ const size_t __len = __builtin_strlen(__old) + 1;
+ __sav = new char[__len];
+ __builtin_memcpy(__sav, __old, __len);
+ setlocale(LC_CTYPE, "C");
+ }
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
_M_toupper = *__ctype_toupper_loc();
_M_tolower = *__ctype_tolower_loc();
@@ -136,8 +154,11 @@
_M_tolower = __ctype_tolower;
_M_table = __table ? __table : __ctype_b;
#endif
- setlocale(LC_CTYPE, __sav);
- delete [] __sav;
+ if (__sav)
+ {
+ setlocale(LC_CTYPE, __sav);
+ delete [] __sav;
+ }
__builtin_memset(_M_widen, 0, sizeof(_M_widen));
__builtin_memset(_M_narrow, 0, sizeof(_M_narrow));
}