diff options
author | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2004-03-27 16:21:21 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2004-03-27 16:21:21 +0000 |
commit | a5f105b59031f43cc15e2a44293a7631dfea4253 (patch) | |
tree | 13503acaa4f6fbf5791b17b4ed6108e955151b1d | |
parent | 84c1fa24b1cb78ca71c2f5a490f93f266073e9bc (diff) | |
download | gcc-a5f105b59031f43cc15e2a44293a7631dfea4253.zip gcc-a5f105b59031f43cc15e2a44293a7631dfea4253.tar.gz gcc-a5f105b59031f43cc15e2a44293a7631dfea4253.tar.bz2 |
[multiple changes]
2004-03-27 Benjamin Kosnik <bkoz@redhat.com>
libstdc++ PR/13598
* config/locale/ieee_1003.1-2001/codecvt_specializations.h
(__enc_traits::_M_destroy): New.
(__enc_traits::~__enc_traits): Use it.
(__enc_traits::operator=): Use _M_destroy, _M_init.
(__enc_traits::__enc_traits): Same.
2004-03-27 Petur Runolfsson <peturr02@ru.is>
* testsuite/ext/enc_filebuf/char/13598.cc: New.
From-SVN: r80027
-rw-r--r-- | libstdc++-v3/ChangeLog | 13 | ||||
-rw-r--r-- | libstdc++-v3/config/locale/ieee_1003.1-2001/codecvt_specializations.h | 38 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/ext/enc_filebuf/char/13598.cc | 47 |
3 files changed, 87 insertions, 11 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ce9d7b0..1756701 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,16 @@ +2004-03-27 Benjamin Kosnik <bkoz@redhat.com> + + libstdc++ PR/13598 + * config/locale/ieee_1003.1-2001/codecvt_specializations.h + (__enc_traits::_M_destroy): New. + (__enc_traits::~__enc_traits): Use it. + (__enc_traits::operator=): Use _M_destroy, _M_init. + (__enc_traits::__enc_traits): Same. + +2004-03-27 Petur Runolfsson <peturr02@ru.is> + + * testsuite/ext/enc_filebuf/char/13598.cc: New. + 2004-03-27 Paolo Carlini <pcarlini@suse.de> * include/ext/mt_allocator.h: Uglify consistently names of diff --git a/libstdc++-v3/config/locale/ieee_1003.1-2001/codecvt_specializations.h b/libstdc++-v3/config/locale/ieee_1003.1-2001/codecvt_specializations.h index efa8c37..ef0923d 100644 --- a/libstdc++-v3/config/locale/ieee_1003.1-2001/codecvt_specializations.h +++ b/libstdc++-v3/config/locale/ieee_1003.1-2001/codecvt_specializations.h @@ -1,6 +1,6 @@ // Locale support (codecvt) -*- C++ -*- -// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +// Copyright (C) 2000, 2001, 2002, 2003, 2004 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 @@ -85,6 +85,7 @@ { strncpy(_M_int_enc, __int, _S_max_size); strncpy(_M_ext_enc, __ext, _S_max_size); + _M_init(); } // 21.1.2 traits typedefs @@ -92,12 +93,17 @@ // typedef STATE_T state_type // requires: state_type shall meet the requirements of // CopyConstructible types (20.1.3) + // NB: This does not preseve the actual state of the conversion + // descriptor member, but it does duplicate the encoding + // information. __enc_traits(const __enc_traits& __obj): _M_in_desc(0), _M_out_desc(0) { strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); _M_ext_bom = __obj._M_ext_bom; _M_int_bom = __obj._M_int_bom; + _M_destroy(); + _M_init(); } // Need assignment operator as well. @@ -106,21 +112,15 @@ { strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); - _M_in_desc = 0; - _M_out_desc = 0; _M_ext_bom = __obj._M_ext_bom; _M_int_bom = __obj._M_int_bom; + _M_destroy(); + _M_init(); return *this; } ~__enc_traits() - { - __desc_type __err = reinterpret_cast<iconv_t>(-1); - if (_M_in_desc && _M_in_desc != __err) - iconv_close(_M_in_desc); - if (_M_out_desc && _M_out_desc != __err) - iconv_close(_M_out_desc); - } + { _M_destroy(); } void _M_init() @@ -142,6 +142,22 @@ } } + void + _M_destroy() + { + const __desc_type __err = reinterpret_cast<iconv_t>(-1); + if (_M_in_desc && _M_in_desc != __err) + { + iconv_close(_M_in_desc); + _M_in_desc = 0; + } + if (_M_out_desc && _M_out_desc != __err) + { + iconv_close(_M_out_desc); + _M_out_desc = 0; + } + } + bool _M_good() { @@ -173,7 +189,7 @@ const char* _M_get_external_enc() - { return _M_ext_enc; } + { return _M_ext_enc; } }; // Partial specialization diff --git a/libstdc++-v3/testsuite/ext/enc_filebuf/char/13598.cc b/libstdc++-v3/testsuite/ext/enc_filebuf/char/13598.cc new file mode 100644 index 0000000..a9270e1 --- /dev/null +++ b/libstdc++-v3/testsuite/ext/enc_filebuf/char/13598.cc @@ -0,0 +1,47 @@ +// Copyright (C) 2004 Free Software Foundation +// +// 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 +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +#include <locale> +#include <cstring> +#include <cassert> +#ifdef _GLIBCXX_USE___ENC_TRAITS +#include <ext/enc_filebuf.h> +#endif + +int main() +{ +#ifdef _GLIBCXX_USE___ENC_TRAITS + const char* str = "Hello, world!\n"; + + std::locale loc(std::locale::classic(), + new std::codecvt<char, char, std::__enc_traits>()); + std::__enc_traits st("ISO-8859-1", "ISO-8859-1"); + __gnu_cxx::enc_filebuf<char> fb(st); + fb.pubimbue(loc); + + fb.open("tmp_13598", std::ios_base::out); + std::streamsize n = fb.sputn(str, std::strlen(str)); + int s = fb.pubsync(); + fb.close(); + + assert(n == std::strlen(str)); + assert(s == 0); +#endif + + return 0; +} |