re PR libstdc++/11389 (Unbuffered wfilebuf fails to read single-byte UTF-8 characters.)

2003-07-01  Paolo Carlini  <pcarlini@unitus.it>

	PR libstdc++/11389
	* include/bits/fstream.tcc (underflow): For encoding() == 0
	don't read more than __buflen chars.
	* testsuite/27_io/basic_filebuf/underflow/wchar_t/11389-1.cc: New.
	* testsuite/27_io/basic_filebuf/underflow/wchar_t/11389-2.cc: New.
	* testsuite/27_io/basic_filebuf/underflow/wchar_t/11389-3.cc: New.
	* testsuite/27_io/basic_filebuf/underflow/wchar_t/11389-4.cc: New.

From-SVN: r68780
This commit is contained in:
Paolo Carlini 2003-07-01 19:13:01 +02:00 committed by Paolo Carlini
parent 54ced33d13
commit f64f3e74b9
6 changed files with 214 additions and 1 deletions

View File

@ -1,3 +1,13 @@
2003-07-01 Paolo Carlini <pcarlini@unitus.it>
PR libstdc++/11389
* include/bits/fstream.tcc (underflow): For encoding() == 0
don't read more than __buflen chars.
* testsuite/27_io/basic_filebuf/underflow/wchar_t/11389-1.cc: New.
* testsuite/27_io/basic_filebuf/underflow/wchar_t/11389-2.cc: New.
* testsuite/27_io/basic_filebuf/underflow/wchar_t/11389-3.cc: New.
* testsuite/27_io/basic_filebuf/underflow/wchar_t/11389-4.cc: New.
2003-07-01 Jerry Quinn <jlquinn@optonline.net>
* 22_locale/num_put/put/char/7.cc: New.

View File

@ -210,7 +210,8 @@ namespace std
{
// Worst-case number of external bytes.
// XXX Not done encoding() == -1.
const streamsize __blen = __buflen * _M_codecvt->max_length();
const int __enc = _M_codecvt->encoding();
const streamsize __blen = __enc > 0 ? __buflen * __enc : __buflen;
char* __buf = static_cast<char*>(__builtin_alloca(__blen));
__elen = _M_file.xsgetn(__buf, __blen);

View File

@ -0,0 +1,49 @@
// Copyright (C) 2003 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
// 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.
// 27.8.1.4 Overridden virtual functions
#include <fstream>
#include <testsuite_hooks.h>
const char name_01[] = "tmp_11389-1";
void test01()
{
using namespace std;
bool test = true;
filebuf fbout;
fbout.open(name_01, ios_base::out);
fbout.sputc('a');
fbout.close();
wfilebuf fbin;
locale loc(__gnu_cxx_test::try_named_locale("en_US.UTF-8"));
fbin.pubimbue(loc);
fbin.open(name_01, ios_base::in);
VERIFY( fbin.sbumpc() == L'a' );
VERIFY( fbin.sgetc() == wfilebuf::traits_type::eof() );
fbin.close();
}
int main()
{
test01();
return 0;
}

View File

@ -0,0 +1,51 @@
// Copyright (C) 2003 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
// 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.
// 27.8.1.4 Overridden virtual functions
#include <fstream>
#include <testsuite_hooks.h>
const char name_02[] = "tmp_11389-2";
void test02()
{
using namespace std;
bool test = true;
filebuf fbout;
fbout.open(name_02, ios_base::out);
fbout.sputc('a');
fbout.sputc('b');
fbout.close();
wfilebuf fbin;
locale loc(__gnu_cxx_test::try_named_locale("en_US.UTF-8"));
fbin.pubimbue(loc);
fbin.open(name_02, ios_base::in);
VERIFY( fbin.sbumpc() == L'a' );
VERIFY( fbin.sbumpc() == L'b' );
VERIFY( fbin.sgetc() == wfilebuf::traits_type::eof() );
fbin.close();
}
int main()
{
test02();
return 0;
}

View File

@ -0,0 +1,50 @@
// Copyright (C) 2003 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
// 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.
// 27.8.1.4 Overridden virtual functions
#include <fstream>
#include <testsuite_hooks.h>
const char name_03[] = "tmp_11389-3";
void test03()
{
using namespace std;
bool test = true;
filebuf fbout;
fbout.open(name_03, ios_base::out);
fbout.sputc('a');
fbout.close();
wfilebuf fbin;
locale loc(__gnu_cxx_test::try_named_locale("en_US.UTF-8"));
fbin.pubimbue(loc);
fbin.pubsetbuf(0, 0);
fbin.open(name_03, ios_base::in);
VERIFY( fbin.sbumpc() == L'a' );
VERIFY( fbin.sgetc() == wfilebuf::traits_type::eof() );
fbin.close();
}
int main()
{
test03();
return 0;
}

View File

@ -0,0 +1,52 @@
// Copyright (C) 2003 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
// 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.
// 27.8.1.4 Overridden virtual functions
#include <fstream>
#include <testsuite_hooks.h>
const char name_04[] = "tmp_11389-4";
void test04()
{
using namespace std;
bool test = true;
filebuf fbout;
fbout.open(name_04, ios_base::out);
fbout.sputc('a');
fbout.sputc('b');
fbout.close();
wfilebuf fbin;
locale loc(__gnu_cxx_test::try_named_locale("en_US.UTF-8"));
fbin.pubimbue(loc);
fbin.pubsetbuf(0, 0);
fbin.open(name_04, ios_base::in);
VERIFY( fbin.sbumpc() == L'a' );
VERIFY( fbin.sbumpc() == L'b' );
VERIFY( fbin.sgetc() == wfilebuf::traits_type::eof() );
fbin.close();
}
int main()
{
test04();
return 0;
}