diff options
author | Paolo Carlini <pcarlini@suse.de> | 2004-03-19 19:31:38 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2004-03-19 19:31:38 +0000 |
commit | 8268bba6f884dfcbcda28ab0f1500551d75399e7 (patch) | |
tree | a90ad99706f5c95504a4981c4047803de06537be | |
parent | 33d13fac08a9400ab517ad8ef4e7e323210bf5f2 (diff) | |
download | gcc-8268bba6f884dfcbcda28ab0f1500551d75399e7.zip gcc-8268bba6f884dfcbcda28ab0f1500551d75399e7.tar.gz gcc-8268bba6f884dfcbcda28ab0f1500551d75399e7.tar.bz2 |
re PR libstdc++/12077 ([3.4 only] wcin.rdbuf()->in_avail() return value too high)
2004-03-19 Paolo Carlini <pcarlini@suse.de>
Petur Runolfsson <peturr02@ru.is>
PR libstdc++/12077
* include/ext/stdio_sync_filebuf.h (showmanyc): Remove, there's
no way to find out the conversion used by the underlying FILE*.
* testsuite/ext/stdio_sync_filebuf/wchar_t/12077.cc: New.
* testsuite/27_io/objects/char/9.cc: Tweak.
Co-Authored-By: Petur Runolfsson <peturr02@ru.is>
From-SVN: r79695
-rw-r--r-- | libstdc++-v3/ChangeLog | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/ext/stdio_sync_filebuf.h | 26 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/27_io/objects/char/9.cc | 10 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/ext/stdio_sync_filebuf/wchar_t/12077.cc | 79 |
4 files changed, 92 insertions, 32 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index a2dd65e..e648e0a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,4 +1,13 @@ 2004-03-19 Paolo Carlini <pcarlini@suse.de> + Petur Runolfsson <peturr02@ru.is> + + PR libstdc++/12077 + * include/ext/stdio_sync_filebuf.h (showmanyc): Remove, there's + no way to find out the conversion used by the underlying FILE*. + * testsuite/ext/stdio_sync_filebuf/wchar_t/12077.cc: New. + * testsuite/27_io/objects/char/9.cc: Tweak. + +2004-03-19 Paolo Carlini <pcarlini@suse.de> PR libstdc++/14648 * include/ext/ropeimpl.h (rope<>::_S_apply_to_pieces): Fix diff --git a/libstdc++-v3/include/ext/stdio_sync_filebuf.h b/libstdc++-v3/include/ext/stdio_sync_filebuf.h index 2076ca5..cdf1e7c 100644 --- a/libstdc++-v3/include/ext/stdio_sync_filebuf.h +++ b/libstdc++-v3/include/ext/stdio_sync_filebuf.h @@ -1,6 +1,6 @@ // Iostreams wrapper for stdio FILE* -*- C++ -*- -// Copyright (C) 2003 Free Software Foundation, Inc. +// Copyright (C) 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 @@ -38,16 +38,6 @@ #include <streambuf> #include <unistd.h> - -#if defined(_GLIBCXX_HAVE_S_ISREG) || defined(_GLIBCXX_HAVE_S_IFREG) -# include <sys/stat.h> -# ifdef _GLIBCXX_HAVE_S_ISREG -# define _GLIBCXX_ISREG(x) S_ISREG(x) -# else -# define _GLIBCXX_ISREG(x) (((x) & S_IFMT) == S_IFREG) -# endif -#endif - #include <cstdio> #ifdef _GLIBCXX_USE_WCHAR_T @@ -82,7 +72,6 @@ namespace __gnu_cxx { } protected: - int_type syncgetc(); @@ -132,19 +121,6 @@ namespace __gnu_cxx virtual std::streamsize xsgetn(char_type* __s, std::streamsize __n); - virtual std::streamsize - showmanyc() - { -#if defined(_GLIBCXX_HAVE_S_ISREG) || defined(_GLIBCXX_HAVE_S_IFREG) - // Regular files. - struct stat __buffer; - int __ret = fstat(fileno(_M_file), &__buffer); - if (!__ret && _GLIBCXX_ISREG(__buffer.st_mode)) - return __buffer.st_size - ftell(_M_file); -#endif - return 0; - } - virtual int_type overflow(int_type __c = traits_type::eof()) { diff --git a/libstdc++-v3/testsuite/27_io/objects/char/9.cc b/libstdc++-v3/testsuite/27_io/objects/char/9.cc index 374fce4..ae62173 100644 --- a/libstdc++-v3/testsuite/27_io/objects/char/9.cc +++ b/libstdc++-v3/testsuite/27_io/objects/char/9.cc @@ -1,6 +1,6 @@ // 2003-05-01 Petur Runolfsson <peturr02@ru.is> -// Copyright (C) 2003 Free Software Foundation, Inc. +// Copyright (C) 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 @@ -18,10 +18,6 @@ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, // USA. -// The ARM simulator does not provide support for "fstat", which -// causes "in_avail" to return an incorrect value. -// { dg-do run { xfail arm-none-elf } } - #include <iostream> #include <cstdio> #include <testsuite_hooks.h> @@ -39,8 +35,8 @@ void test09() freopen(name, "r", stdin); - // The number of unread characters should be 4 (a, b, c, \\n) - VERIFY( 4 == std::cin.rdbuf()->in_avail() ); + // basic_streambuf::showmanyc returns 0. + VERIFY( 0 == std::cin.rdbuf()->in_avail() ); } int diff --git a/libstdc++-v3/testsuite/ext/stdio_sync_filebuf/wchar_t/12077.cc b/libstdc++-v3/testsuite/ext/stdio_sync_filebuf/wchar_t/12077.cc new file mode 100644 index 0000000..9ba9eb5 --- /dev/null +++ b/libstdc++-v3/testsuite/ext/stdio_sync_filebuf/wchar_t/12077.cc @@ -0,0 +1,79 @@ +// 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 <iostream> +#include <locale> +#include <testsuite_hooks.h> + +// libstdc++/12077 +void test01() +{ + using namespace std; + bool test __attribute__((unused)) = true; + + const char* name = "12077_tmp"; + + locale loc = __gnu_test::try_named_locale("is_IS.UTF-8"); + locale::global(loc); + wcin.imbue(loc); + + const char* str = + "\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10\x11\x12\x13" + "\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20!\"#$%&" + "'()*+,-./0123456789:;<=>?@}~\x7f\xc2\x80\xc2\x81\xc2\x82\xc2" + "\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a" + "\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f\xc2\x90\xc2\x91\xc2" + "\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99" + "\xc2\x9a\xc2\x9b\xc2\x9c\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3" + "\xbe\xc3\xbf\xc4\x80\xc4\x81\xc4\x82\xc4\x83\xc4\x84\xc4\x85" + "\xc4\x86\xc4\x87\xc4\x88\xc4\x89\xc4\x8a\xc4\x8b\xc4\x8c\xc4" + "\x8d\xc4\x8e\xc4\x8f\xc4\x90\xc4\x91\xc4\x92\xc4\x93\xc4\x94" + "\xc4\x95\xc4\x96\xc4\x97\xc4\x98\xc4\x99\xdf\xb8\xdf\xb9\xdf" + "\xba\xdf\xbb\xdf\xbc\xdf\xbd\xdf\xbe\xdf\xbf\xe0\xa0\x80\xe0" + "\xa0\x81\xe0\xa0\x82\xe0\xa0\x83\xe0\xa0\x84\xe0\xa0\x85\xe0" + "\xa0\x86\xe0\xa0\x87\xe0\xa0\x88\xe0\xa0\x89\xe0\xa0\x8a\xe0" + "\xa0\x8b\xe0\xa0\x8c\xe0\xa0\x8d\xe0\xa0\x8e\xe0\xa0\x8f\xe0" + "\xa0\x90\xe0\xa0\x91\xe0\xa0\x92\xe0\xa0\x93\xe0\xa0\x94\xe0" + "\xa0\x95\xe0\xa0\x96\xe0\xa0\x97\x1\x2\x4\x8\x10\x20@\xc2\x80" + "\xc4\x80\xc8\x80\xd0\x80\xe0\xa0\x80\xe1\x80\x80\xe2\x80\x80" + "\xe4\x80\x80\xe8\x80\x80\xf0\x90\x80\x80\xf0\xa0\x80\x80\xf1" + "\x80\x80\x80\xf2\x80\x80\x80\xf4\x80\x80\x80\xf8\x88\x80\x80" + "\x80\xf8\x90\x80\x80\x80\xf8\xa0\x80\x80\x80\xf9\x80\x80\x80" + "\x80\xfa\x80\x80\x80\x80\xfc\x84\x80\x80\x80\x80\xfc\x88\x80" + "\x80\x80\x80\xfc\x90\x80\x80\x80\x80\xfc\xa0\x80\x80\x80\x80" + "\xfd\x80\x80\x80\x80\x80"; + + FILE* file = fopen(name, "w"); + fputs(str, file); + fclose(file); + + freopen(name, "r", stdin); + + streamsize n = wcin.rdbuf()->in_avail(); + while (n--) + { + wint_t c = wcin.rdbuf()->sbumpc(); + VERIFY( c != WEOF ); + } +} + +int main() +{ + test01(); + return 0; +} |