re PR libstdc++/5280 (Problems with named locales and iostreams (gnulocale))

2002-04-28  Benjamin Kosnik  <bkoz@redhat.com>

        PR libstdc++/5280
        * config/io/basic_file_stdio.h (__basic_file::sys_getc): Return int.
        (__basic_file::sys_ungetc): Take int.
        * config/io/basic_file_stdio.cc (__basic_file::sys_ungetc): Same.
        * include/bits/fstream.tcc (basic_filebuf::_M_underflow_common):
        Use sys_getc for unbuffered input.
        * testsuite/27_io/narrow_stream_objects.cc (test06): New.

        * src/ios.cc (_M_grow_words): Adjust error checking.
        * testsuite/27_io/ios_base_storage.cc: Same.

From-SVN: r52879
This commit is contained in:
Benjamin Kosnik 2002-04-29 07:00:50 +00:00 committed by Benjamin Kosnik
parent 189ab118de
commit d02475fdae
7 changed files with 79 additions and 39 deletions

View file

@ -1,3 +1,16 @@
2002-04-28 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/5280
* config/io/basic_file_stdio.h (__basic_file::sys_getc): Return int.
(__basic_file::sys_ungetc): Take int.
* config/io/basic_file_stdio.cc (__basic_file::sys_ungetc): Same.
* include/bits/fstream.tcc (basic_filebuf::_M_underflow_common):
Use sys_getc for unbuffered input.
* testsuite/27_io/narrow_stream_objects.cc (test06): New.
* src/ios.cc (_M_grow_words): Adjust error checking.
* testsuite/27_io/ios_base_storage.cc: Same.
2002-04-28 Peter Schmid <schmid@snake.iap.physik.tu-darmstadt.de>
* include/ext/stl_hashtable.h: Import __iterator_category

View file

@ -81,11 +81,13 @@ namespace std
return __ret;
}
char
__basic_file<char>::sys_getc() { return getc (_M_cfile); }
int
__basic_file<char>::sys_getc()
{ return getc(_M_cfile); }
char
__basic_file<char>::sys_ungetc(char __s) { return ungetc (__s, _M_cfile); }
int
__basic_file<char>::sys_ungetc(int __c)
{ return ungetc(__c, _M_cfile); }
__basic_file<char>*
__basic_file<char>::open(const char* __name, ios_base::openmode __mode,

View file

@ -72,11 +72,11 @@ namespace std
__basic_file*
sys_open(__c_file* __file, ios_base::openmode __mode);
char
int
sys_getc();
char
sys_ungetc(char);
int
sys_ungetc(int);
__basic_file*
close();

View file

@ -224,6 +224,17 @@ namespace std
return traits_type::to_int_type(*_M_in_cur);
}
// Check for unbuffered stream.
if (_M_buf_size == 1)
{
__ret = _M_file.sys_getc();
*_M_in_cur = traits_type::to_char_type(__ret);
_M_set_determinate(1);
if (__testout)
_M_out_cur = _M_in_cur;
return __ret;
}
// Sync internal and external buffers.
// NB: __testget -> __testput as _M_buf_unified here.
bool __testget = _M_in_cur && _M_in_beg < _M_in_cur;
@ -278,14 +289,6 @@ namespace std
__ret = traits_type::to_int_type(*_M_in_cur);
if (__bump)
_M_in_cur_move(1);
else if (_M_buf_size == 1)
{
// If we are synced with stdio, we have to unget the
// character we just read so that the file pointer
// doesn't move.
_M_file.sys_ungetc(*_M_in_cur);
_M_set_indeterminate();
}
}
}
}

View file

@ -226,32 +226,34 @@ namespace std
// Precondition: _M_word_size <= ix
int newsize = _S_local_word_size;
_Words* words = _M_local_word;
int i = 0;
if (ix > _S_local_word_size - 1)
{
const int max = numeric_limits<int>::max();
if (ix < max)
newsize = ix + 1;
else
newsize = max;
try
{ words = new _Words[newsize]; }
catch (...)
if (ix < numeric_limits<int>::max())
{
delete [] _M_word;
_M_word = 0;
_M_streambuf_state |= badbit;
if (_M_streambuf_state & _M_exception)
__throw_ios_failure("ios_base::_M_grow_words caused exception");
return _M_word_zero;
newsize = ix + 1;
try
{ words = new _Words[newsize]; }
catch (...)
{
delete [] _M_word;
_M_word = 0;
_M_streambuf_state |= badbit;
if (_M_streambuf_state & _M_exception)
__throw_ios_failure("ios_base::_M_grow_words failure");
return _M_word_zero;
}
for (int i = 0; i < _M_word_size; i++)
words[i] = _M_word[i];
if (_M_word && _M_word != _M_local_word)
{
delete [] _M_word;
_M_word = 0;
}
}
for (; i < _M_word_size; i++)
words[i] = _M_word[i];
if (_M_word && _M_word != _M_local_word)
else
{
delete [] _M_word;
_M_word = 0;
_M_streambuf_state |= badbit;
return _M_word_zero;
}
}
_M_word = words;
@ -351,4 +353,3 @@ namespace std
return __ret;
}
} // namespace std

View file

@ -45,7 +45,7 @@ void test01()
void test02()
{
bool test = true;
int max = std::numeric_limits<int>::max();
int max = std::numeric_limits<int>::max() - 1;
std::stringbuf strbuf;
std::ios ios(&strbuf);

View file

@ -1,6 +1,6 @@
// 2000-08-02 bkoz
// Copyright (C) 2000, 2001 Free Software Foundation, Inc.
// Copyright (C) 2000, 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
@ -145,6 +145,26 @@ void test05()
std::cout << "hello " << s << std::endl;
}
// libstdc++/5280
// Interactive test: input "1234^D^D" for i should terminate for EOF.
void test06()
{
using namespace std;
int i;
cin >> i;
if (!cin.good())
{
cerr << endl;
cerr << "i == " << i << endl;
cerr << "cin.rdstate() == " << cin.rdstate() << endl;
cerr << "cin.bad() == " << cin.bad() << endl;
cerr << "cin.fail() == " << cin.fail() << endl;
cerr << "cin.eof() == " << cin.eof() << endl;
}
else
cerr << "i == " << i << endl;
}
int
main()
{
@ -154,5 +174,6 @@ main()
// test03();
// test04();
// test05();
// test06();
return 0;
}