This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

basic_streambuf<> problems/fixes


The following will do a reasonable job of exercising certain parts of
the iostreams library.

#include <string>    // char_traits
#include <utility>   // pair
#include <sstream>
#include <fstream>

struct MyChar {
   unsigned long _c;
};

struct MyCharTraits {
   typedef MyChar		char_type;
   typedef std::pair<char_type, bool> int_type;
   typedef std::streamoff	off_type;
   typedef std::streampos	pos_type;
   typedef      mbstate_t	state_type;

   static void assign(char_type& c1, const char_type& c2);
   static bool eq(const char_type& c1, const char_type& c2);
   static bool lt(const char_type& c1, const char_type& c2);
   static int compare(const char_type* s1, const char_type* s2);
   static size_t length(const char_type* s1);
   static const char_type* find(const char_type* s, size_t n,
				 const char_type& a);
   static char_type* move(char_type* s1, const char_type* s2, size_t n);
   static char_type* copy(char_type* s1, const char_type* s2, size_t n);
   static char_type* assign(char_type* s, size_t n, char_type a);
   static int_type not_eof(const int_type& c);
   static char_type to_char_type(const int_type& c);
   static int_type to_int_type(const char_type& c);
   static bool eq_int_type(const int_type& c1, const int_type& c2);
   static int_type eof();
};

template std::basic_streambuf<MyChar, MyCharTraits>;
template std::basic_stringbuf<MyChar, MyCharTraits>;
template std::basic_stringstream<MyChar, MyCharTraits>;

template std::basic_filebuf<MyChar, MyCharTraits>;
template std::basic_istream<MyChar, MyCharTraits>;
template std::basic_ostream<MyChar, MyCharTraits>;

int main() {
   std::stringstream<MyChar, MyCharTraits> test;
   return 0;
}

Some fixes (not all) are provided below.

-------------------------
File: std/std_streambuf.h
94c94
<       int_type			_M_buf_size;
---
      size_t			_M_buf_size;
97c97
<       int_type			_M_buf_size_opt;
---
      size_t			_M_buf_size_opt;
129c129
<       static const int_type    	_S_pback_size = 1;
---
      static const size_t	_S_pback_size = 1;
143,144c143,144
< 	    int_type __dist = _M_in_end - _M_in_cur;
< 	    int_type __len = min(_S_pback_size, __dist);
---
	    size_t __dist = _M_in_end - _M_in_cur;
	    size_t __len = min(_S_pback_size, __dist);
162c162
< 	    int_type __off_cur = _M_in_cur - _M_pback;
---
	    size_t __off_cur = _M_in_cur - _M_pback;
165,167c165,167
< 	    int_type __off_end = 0;
< 	    int_type __pback_len = _M_in_end - _M_pback;
< 	    int_type __save_len = _M_pback_end_save - _M_buf;
---
	    size_t __off_end = 0;
	    size_t __pback_len = _M_in_end - _M_pback;
	    size_t __save_len = _M_pback_end_save - _M_buf;
291,292c291,292
< 		int_type __save_len =  _M_pback_end_save - _M_pback_cur_save;
< 		int_type __pback_len = _M_in_cur - _M_pback;
---
		size_t __save_len = _M_pback_end_save - _M_pback_cur_save;
		size_t __pback_len = _M_in_cur - _M_pback;
307c307
< 	return (this->sbumpc() == __eof ? __eof : this->sgetc());
---
return (traits_type::eq_int_type(this->sbumpc(), __eof) ? __eof : this->sgetc());
345,350c345,360
< : _M_buf(NULL), _M_buf_size(0),
< _M_buf_size_opt(static_cast<int_type>(BUFSIZ)), _M_buf_unified(false),
< _M_in_beg(0), _M_in_cur(0), _M_in_end(0), _M_out_beg(0), _M_out_cur(0),
< _M_out_end(0), _M_mode(ios_base::openmode(0)), _M_buf_locale(locale()),
< _M_buf_locale_init(false), _M_pback_cur_save(0), _M_pback_end_save(0),
< _M_pback_init(false)
---

: _M_buf(NULL),
_M_buf_size(0),
_M_buf_size_opt(BUFSIZ),
_M_buf_unified(false), _M_in_beg(0), _M_in_cur(0), _M_in_end(0), _M_out_beg(0), _M_out_cur(0), _M_out_end(0), _M_mode(ios_base::openmode(0)), _M_buf_locale(locale()), _M_buf_locale_init(false), _M_pback_cur_save(0), _M_pback_end_save(0), _M_pback_init(false)
441c451
< 	bool __testeof = this->underflow() == __ret;
---
	bool __testeof = traits_type::eq_int_type(this->underflow(), __ret);
------------------------
File: bits/streambuf.tcc
43c43
<     const typename basic_streambuf<_CharT, _Traits>::int_type
---
    const size_t
141c141
< 	      if (__c != traits_type::eof())
---
	      if (!traits_type::eq_int_type(__c, traits_type::eof()))
180c180
< 	      if (__c != traits_type::eof())
---
	      if (!traits_type::eq_int_type(__c, traits_type::eof()))
217c217
< 		  if (__sbin->sgetc() == _Traits::eof())
---
		  if (_Traits::eq_int_type(__sbin->sgetc(), _Traits::eof()))
------------------------
File: bits/basic_ios.tcc
159c159
<       _M_fill = 0;
---
      _M_fill = _CharT();
------------------------
File: bits/sstream.tcc
98c98
< 		__ret = this->sputc(__c);
---
		__ret = this->sputc(traits_type::to_char_type(__c));
104c104
< 		  _M_buf_size = static_cast<int_type>(__len);
---
		  _M_buf_size = __len;




_________________________________________________________________
Send and receive Hotmail on your mobile device: http://mobile.msn.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]