From: Benjamin Kosnik Date: Wed, 11 Sep 2002 04:25:41 +0000 (+0000) Subject: [multiple changes] X-Git-Tag: releases/gcc-3.3.0~2907 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=145163253ac4baf3b28625321d9620c436efbbbe;p=thirdparty%2Fgcc.git [multiple changes] 2002-09-11 Benjamin Kosnik * 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 * include/bits/locale_facets.tcc (__convert_from_v): Use __uselocale instead of setlocale for glibc 2.3+. From-SVN: r57021 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 70fb2df50018..ba8ed4b5f653 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2002-09-11 Benjamin Kosnik + + * 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 + + * include/bits/locale_facets.tcc (__convert_from_v): + Use __uselocale instead of setlocale for glibc 2.3+. + 2002-09-10 Benjamin Kosnik * 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 0fc9a250c02a..cb2bae8b5c5c 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 + 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(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 3ce1781e23be..91a92e9aaed2 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 + 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(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 ad7ba3f53203..195d33ab0407 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 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(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 - 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(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