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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@52879
138bc75d-0d04-0410-961f-
82ee72b054a4
+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
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,
__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();
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;
__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();
- }
}
}
}
// 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;
+ if (ix < numeric_limits<int>::max())
+ {
+ 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;
+ }
+ }
else
- newsize = max;
-
- 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 caused exception");
return _M_word_zero;
}
- for (; i < _M_word_size; i++)
- words[i] = _M_word[i];
- if (_M_word && _M_word != _M_local_word)
- {
- delete [] _M_word;
- _M_word = 0;
- }
}
_M_word = words;
_M_word_size = newsize;
return __ret;
}
} // namespace std
-
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);
// 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
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()
{
// test03();
// test04();
// test05();
+ // test06();
return 0;
}