From 640f79135a9d7da27a66b66129efc4dfa7996e06 Mon Sep 17 00:00:00 2001 From: bkoz Date: Sat, 27 Mar 2004 16:21:21 +0000 Subject: [PATCH] 2004-03-27 Benjamin Kosnik 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 * testsuite/ext/enc_filebuf/char/13598.cc: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@80027 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 13 ++++++ .../ieee_1003.1-2001/codecvt_specializations.h | 38 ++++++++++++----- .../testsuite/ext/enc_filebuf/char/13598.cc | 47 ++++++++++++++++++++++ 3 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 libstdc++-v3/testsuite/ext/enc_filebuf/char/13598.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ce9d7b0f01c..1756701c5aa 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,16 @@ +2004-03-27 Benjamin Kosnik + + 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 + + * testsuite/ext/enc_filebuf/char/13598.cc: New. + 2004-03-27 Paolo Carlini * 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 efa8c378360..ef0923deb49 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(-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(-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 00000000000..a9270e145bb --- /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 +#include +#include +#ifdef _GLIBCXX_USE___ENC_TRAITS +#include +#endif + +int main() +{ +#ifdef _GLIBCXX_USE___ENC_TRAITS + const char* str = "Hello, world!\n"; + + std::locale loc(std::locale::classic(), + new std::codecvt()); + std::__enc_traits st("ISO-8859-1", "ISO-8859-1"); + __gnu_cxx::enc_filebuf 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; +} -- 2.11.0