diff options
author | Benjamin Kosnik <bkoz@redhat.com> | 2002-09-11 04:25:41 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@redhat.com> | 2002-09-11 04:25:41 +0000 |
commit | 066322278a134721d4bfa4b4104d3b6ae3cab2d3 (patch) | |
tree | 162f1f41a865e02d738b59722082ede902af05ff | |
parent | 33bd5fc3deb29ad65fbc714db146a20d517f80c9 (diff) |
2002-09-11 Benjamin Kosnik <bkoz@redhat.com>
* include/bits/locale_facets.tcc (__convert_from_v): Remove.
* config/locale/gnu/c_locale.h (__convert_from_v): Add.
* config/locale/generic/c_locale.h (__convert_from_v): Add.
2002-09-11 Paolo Carlini <pcarlini@unitus.it>
* include/bits/locale_facets.tcc (__convert_from_v):
Use __uselocale instead of setlocale for glibc 2.3+.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@57021 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | libstdc++-v3/ChangeLog | 11 | ||||
-rw-r--r-- | libstdc++-v3/config/locale/generic/c_locale.h | 29 | ||||
-rw-r--r-- | libstdc++-v3/config/locale/gnu/c_locale.h | 39 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/locale_facets.tcc | 39 |
4 files changed, 78 insertions, 40 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 70fb2df5001..ba8ed4b5f65 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2002-09-11 Benjamin Kosnik <bkoz@redhat.com> + + * include/bits/locale_facets.tcc (__convert_from_v): Remove. + * config/locale/gnu/c_locale.h (__convert_from_v): Add. + * config/locale/generic/c_locale.h (__convert_from_v): Add. + +2002-09-11 Paolo Carlini <pcarlini@unitus.it> + + * include/bits/locale_facets.tcc (__convert_from_v): + Use __uselocale instead of setlocale for glibc 2.3+. + 2002-09-10 Benjamin Kosnik <bkoz@redhat.com> * src/Makefile.am (sources): Edit. diff --git a/libstdc++-v3/config/locale/generic/c_locale.h b/libstdc++-v3/config/locale/generic/c_locale.h index 0fc9a250c02..cb2bae8b5c5 100644 --- a/libstdc++-v3/config/locale/generic/c_locale.h +++ b/libstdc++-v3/config/locale/generic/c_locale.h @@ -1,6 +1,6 @@ // Wrapper for underlying C-language localization -*- C++ -*- -// Copyright (C) 2001 Free Software Foundation, Inc. +// Copyright (C) 2001, 2002 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -38,4 +38,31 @@ namespace std { typedef int* __c_locale; + + template<typename _Tv> + int + __convert_from_v(char* __out, const int __size, const char* __fmt, + _Tv __v, const __c_locale&, int __prec = -1) + { + int __ret; + char* __old = setlocale(LC_ALL, NULL); + char* __sav = static_cast<char*>(malloc(strlen(__old) + 1)); + if (__sav) + strcpy(__sav, __old); + setlocale(LC_ALL, "C"); +#ifdef _GLIBCPP_USE_C99 + if (__prec >= 0) + __ret = snprintf(__out, __size, __fmt, __prec, __v); + else + __ret = snprintf(__out, __size, __fmt, __v); +#else + if (__prec >= 0) + __ret = sprintf(__out, __fmt, __prec, __v); + else + __ret = sprintf(__out, __fmt, __v); +#endif + setlocale(LC_ALL, __sav); + free(__sav); + return __ret; + } } diff --git a/libstdc++-v3/config/locale/gnu/c_locale.h b/libstdc++-v3/config/locale/gnu/c_locale.h index 3ce1781e23b..91a92e9aaed 100644 --- a/libstdc++-v3/config/locale/gnu/c_locale.h +++ b/libstdc++-v3/config/locale/gnu/c_locale.h @@ -1,6 +1,6 @@ // Wrapper for underlying C-language localization -*- C++ -*- -// Copyright (C) 2001 Free Software Foundation, Inc. +// Copyright (C) 2001, 2002 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -43,4 +43,41 @@ namespace std { typedef __locale_t __c_locale; + + template<typename _Tv> + int + __convert_from_v(char* __out, const int __size, const char* __fmt, + _Tv __v, const __c_locale& __cloc, int __prec = -1) + { + int __ret; +#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) + __c_locale __old = __uselocale(__cloc); +#else + char* __old = setlocale(LC_ALL, NULL); + char* __sav = static_cast<char*>(malloc(strlen(__old) + 1)); + if (__sav) + strcpy(__sav, __old); + setlocale(LC_ALL, "C"); +#endif + +#ifdef _GLIBCPP_USE_C99 + if (__prec >= 0) + __ret = snprintf(__out, __size, __fmt, __prec, __v); + else + __ret = snprintf(__out, __size, __fmt, __v); +#else + if (__prec >= 0) + __ret = sprintf(__out, __fmt, __prec, __v); + else + __ret = sprintf(__out, __fmt, __v); +#endif + +#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) + __uselocale(__old); +#else + setlocale(LC_ALL, __sav); + free(__sav); +#endif + return __ret; + } } diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index ad7ba3f5320..195d33ab040 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -1969,47 +1969,10 @@ namespace std // Convert numeric value of type _Tv to string and return length of string. // If snprintf is available use it, otherwise fall back to the unsafe sprintf // which, in general, can be dangerous and should be avoided. -#ifdef _GLIBCPP_USE_C99 template<typename _Tv> int __convert_from_v(char* __out, const int __size, const char* __fmt, - _Tv __v, const __c_locale&, int __prec = -1) - { - int __ret; - char* __old = setlocale(LC_ALL, NULL); - char* __sav = static_cast<char*>(malloc(strlen(__old) + 1)); - if (__sav) - strcpy(__sav, __old); - setlocale(LC_ALL, "C"); - if (__prec >= 0) - __ret = snprintf(__out, __size, __fmt, __prec, __v); - else - __ret = snprintf(__out, __size, __fmt, __v); - setlocale(LC_ALL, __sav); - free(__sav); - return __ret; - } -#else - template<typename _Tv> - int - __convert_from_v(char* __out, const int, const char* __fmt, _Tv __v, - const __c_locale&, int __prec = -1) - { - int __ret; - char* __old = setlocale(LC_ALL, NULL); - char* __sav = static_cast<char*>(malloc(strlen(__old) + 1)); - if (__sav) - strcpy(__sav, __old); - setlocale(LC_ALL, "C"); - if (__prec >= 0) - __ret = sprintf(__out, __fmt, __prec, __v); - else - __ret = sprintf(__out, __fmt, __v); - setlocale(LC_ALL, __sav); - free(__sav); - return __ret; - } -#endif + _Tv __v, const __c_locale&, int __prec = -1); // Construct correctly padded string, as per 22.2.2.2.2 // Assumes |