This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[v3] char_traits fixups round two
- From: Benjamin Kosnik <bkoz at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org, jakub at redhat dot com
- Date: Tue, 30 Jul 2002 19:34:26 -0700
- Subject: [v3] char_traits fixups round two
This patch fixes up the remaining char_traits issues with 27_io
classes: streambuf, stringbuf, filebuf, ostream, istream, fstream,
stringstream.
The patch itself is less tricky than the previously posted one. Mostly
because I'm now not convinced that non-std::char_traits type classes
can really be used non-ambiguously in the 27_io classes, as
written. (See num_put/num_get, and lack of _Traits parameter: instead,
one must be inferred from _CharT or _OutIter. It is possible to do
some of this magic, but then char_traits and helper classes get
specialized as well. I don't think it worth the extra (non-standard,
non-required) efforts.)
I will fully document the new behavior in the next week.
-benjamin
tested x86/linux
gcc
gcc-3_2-branch
2002-07-30 Benjamin Kosnik <bkoz@redhat.com>
Gabriel Dos Reis <gdr@nerim.net>
* include/bits/char_traits.h: Remove generic definitions.
* include/bits/streambuf_iterator.h (istreambuf_iterator): Use
eof, not -2.
* include/bits/istream.tcc (istream::readsome): Don't check
against eof, instead use constants.
(istream::sync): Same.
(istream::sentry::sentry): Use eq_int_type.
(istream::get): Same.
* include/bits/ostream.tcc: Change __pad to
__pad<_CharT, _Traits>::_S_pad.
* include/bits/locale_facets.h: Add __pad_traits generic and
ostreambuf_iterator specialization.
* include/bits/locale_facets.tcc: Change __pad into struct __pad
with a _CharT and _Traits template parameter and _S_pad static
member function.
* src/locale-inst.cc: Update __pad instantiations.
* include/std/std_fstream.h: Declare _M_underflow_common
specializations.
* src/fstream.cc: New. Add _M_underflow_common specializations.
* include/bits/fstream.tcc (filebuf::close): Use traits_type.
(filebuf::_M_underflow_common(bool)): Remove generic version, as
sys_ungetc and custom int_types don't get along.
* include/std/std_streambuf.h: Add _M_pos.
* src/Makefile.am (sources): Add fstream.cc.
* src/Makefile.in: Regenerate.
* testsuite/21_strings/capacity.cc: Add char_traits specializations.
* testsuite/22_locale/codecvt_members_unicode_char.cc: Same.
* testsuite/22_locale/codecvt_members_unicode_wchar_t.cc: Same.
* testsuite/22_locale/ctor_copy_dtor.cc: Same.
* testsuite/27_io/filebuf_virtuals.cc (test07): Move to...
* testsuite/27_io/filebuf.cc: ...here.
* testsuite/testsuite_hooks.h: Add gnu_char, gnu_int, char_traits
specialization for both.
* testsuite/27_io/streambuf.cc: Add instantiation test,
testsuite_hooks include.
* testsuite/27_io/istream.cc: Same.
* testsuite/27_io/ostream.cc: Same.
* testsuite/27_io/fstream.cc: Same.
* testsuite/27_io/stringstream.cc: Same.
* testsuite/27_io/filebuf.cc: Same.
* testsuite/27_io/stringbuf.cc: Same.
Index: include/bits/char_traits.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/char_traits.h,v
retrieving revision 1.13
diff -c -p -r1.13 char_traits.h
*** include/bits/char_traits.h 20 Jul 2002 06:26:26 -0000 1.13
--- include/bits/char_traits.h 31 Jul 2002 02:27:01 -0000
***************
*** 1,6 ****
// Character Traits for use by standard string and iostream -*- C++ -*-
! // Copyright (C) 1997, 1998, 1999, 2000, 2001 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
--- 1,7 ----
// Character Traits for use by standard string and iostream -*- C++ -*-
! // Copyright (C) 1997, 1998, 1999, 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
*************** namespace std
*** 57,138 ****
struct char_traits
{
typedef _CharT char_type;
! // Unsigned as wint_t in unsigned.
typedef unsigned long int_type;
typedef streampos pos_type;
typedef streamoff off_type;
typedef mbstate_t state_type;
static void
! assign(char_type& __c1, const char_type& __c2)
! { __c1 = __c2; }
static bool
! eq(const char_type& __c1, const char_type& __c2)
! { return __c1 == __c2; }
static bool
! lt(const char_type& __c1, const char_type& __c2)
! { return __c1 < __c2; }
static int
! compare(const char_type* __s1, const char_type* __s2, size_t __n)
! {
! for (size_t __i = 0; __i < __n; ++__i)
! if (!eq(__s1[__i], __s2[__i]))
! return lt(__s1[__i], __s2[__i]) ? -1 : 1;
! return 0;
! }
static size_t
! length(const char_type* __s)
! {
! const char_type* __p = __s;
! while (*__p) ++__p;
! return (__p - __s);
! }
static const char_type*
! find(const char_type* __s, size_t __n, const char_type& __a)
! {
! for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
! if (*__p == __a) return __p;
! return 0;
! }
static char_type*
! move(char_type* __s1, const char_type* __s2, size_t __n)
! { return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
static char_type*
! copy(char_type* __s1, const char_type* __s2, size_t __n)
! { return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
static char_type*
! assign(char_type* __s, size_t __n, char_type __a)
! {
! for (char_type* __p = __s; __p < __s + __n; ++__p)
! assign(*__p, __a);
! return __s;
! }
static char_type
! to_char_type(const int_type& __c)
! { return char_type(__c); }
static int_type
! to_int_type(const char_type& __c) { return int_type(__c); }
static bool
! eq_int_type(const int_type& __c1, const int_type& __c2)
! { return __c1 == __c2; }
static int_type
! eof() { return static_cast<int_type>(-1); }
static int_type
! not_eof(const int_type& __c)
! { return eq_int_type(__c, eof()) ? int_type(0) : __c; }
};
--- 58,110 ----
struct char_traits
{
typedef _CharT char_type;
! // Unsigned as wint_t is unsigned.
typedef unsigned long int_type;
typedef streampos pos_type;
typedef streamoff off_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, size_t __n);
static size_t
! length(const char_type* __s);
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 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();
static int_type
! not_eof(const int_type& __c);
};
Index: include/bits/fpos.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/fpos.h,v
retrieving revision 1.8
diff -c -p -r1.8 fpos.h
*** include/bits/fpos.h 4 Jan 2002 21:27:31 -0000 1.8
--- include/bits/fpos.h 31 Jul 2002 02:27:01 -0000
*************** namespace std
*** 105,111 ****
bool
operator!=(const fpos& __pos) const
{ return _M_off != __pos._M_off; }
!
streamoff
_M_position() const { return _M_off; }
--- 105,111 ----
bool
operator!=(const fpos& __pos) const
{ return _M_off != __pos._M_off; }
!
streamoff
_M_position() const { return _M_off; }
Index: include/bits/fstream.tcc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/fstream.tcc,v
retrieving revision 1.38
diff -c -p -r1.38 fstream.tcc
*** include/bits/fstream.tcc 13 May 2002 13:57:54 -0000 1.38
--- include/bits/fstream.tcc 31 Jul 2002 02:27:02 -0000
*************** namespace std
*** 112,118 ****
{
const int_type __eof = traits_type::eof();
bool __testput = _M_out_cur && _M_out_beg < _M_out_end;
! if (__testput && _M_really_overflow(__eof) == __eof)
return __ret;
// NB: Do this here so that re-opened filebufs will be cool...
--- 112,119 ----
{
const int_type __eof = traits_type::eof();
bool __testput = _M_out_cur && _M_out_beg < _M_out_end;
! if (__testput
! && traits_type::eq_int_type(_M_really_overflow(__eof), __eof))
return __ret;
// NB: Do this here so that re-opened filebufs will be cool...
*************** namespace std
*** 151,246 ****
__ret = _M_in_end - _M_in_cur;
else
__ret = 0;
- }
- _M_last_overflowed = false;
- return __ret;
- }
-
- template<typename _CharT, typename _Traits>
- typename basic_filebuf<_CharT, _Traits>::int_type
- basic_filebuf<_CharT, _Traits>::
- _M_underflow_common(bool __bump)
- {
- int_type __ret = traits_type::eof();
- bool __testin = _M_mode & ios_base::in;
- bool __testout = _M_mode & ios_base::out;
-
- if (__testin)
- {
- // Check for pback madness, and if so swich back to the
- // normal buffers and jet outta here before expensive
- // fileops happen...
- if (_M_pback_init)
- {
- _M_pback_destroy();
- if (_M_in_cur < _M_in_end)
- return traits_type::to_int_type(*_M_in_cur);
- }
-
- // Sync internal and external buffers.
- // NB: __testget -> __testput as _M_buf_unified here.
- bool __testget = _M_in_cur && _M_in_beg < _M_in_cur;
- bool __testinit = _M_is_indeterminate();
- if (__testget)
- {
- if (__testout)
- _M_really_overflow();
- else if (_M_in_cur != _M_filepos)
- _M_file.seekoff(_M_in_cur - _M_filepos,
- ios_base::cur, ios_base::in);
- }
-
- if (__testinit || __testget)
- {
- const locale __loc = this->getloc();
- const __codecvt_type& __cvt = use_facet<__codecvt_type>(__loc);
-
- streamsize __elen = 0;
- streamsize __ilen = 0;
- if (__cvt.always_noconv())
- {
- __elen = _M_file.xsgetn(reinterpret_cast<char*>(_M_in_beg),
- _M_buf_size);
- __ilen = __elen;
- }
- else
- {
- char* __buf = static_cast<char*>(__builtin_alloca(_M_buf_size));
- __elen = _M_file.xsgetn(__buf, _M_buf_size);
-
- const char* __eend;
- char_type* __iend;
- __res_type __r = __cvt.in(_M_state_cur, __buf,
- __buf + __elen, __eend, _M_in_beg,
- _M_in_beg + _M_buf_size, __iend);
- if (__r == codecvt_base::ok)
- __ilen = __iend - _M_in_beg;
- else
- {
- // Unwind.
- __ilen = 0;
- _M_file.seekoff(-__elen, ios_base::cur, ios_base::in);
- }
- }
-
- if (0 < __ilen)
- {
- _M_set_determinate(__ilen);
- if (__testout)
- _M_out_cur = _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();
- }
- }
- }
}
_M_last_overflowed = false;
return __ret;
--- 152,157 ----
Index: include/bits/istream.tcc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/istream.tcc,v
retrieving revision 1.32
diff -c -p -r1.32 istream.tcc
*** include/bits/istream.tcc 25 Jul 2002 23:20:49 -0000 1.32
--- include/bits/istream.tcc 31 Jul 2002 02:27:02 -0000
*************** namespace std
*** 54,66 ****
__int_type __c = __sb->sgetc();
if (__in._M_check_facet(__in._M_fctype))
! while (__c != __eof
! && __in._M_fctype->is(ctype_base::space, __c))
__c = __sb->snextc();
#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
//195. Should basic_istream::sentry's constructor ever set eofbit?
! if (__c == __eof)
__in.setstate(ios_base::eofbit);
#endif
}
--- 54,67 ----
__int_type __c = __sb->sgetc();
if (__in._M_check_facet(__in._M_fctype))
! while (!traits_type::eq_int_type(__c, __eof)
! && __in._M_fctype->is(ctype_base::space,
! traits_type::to_char_type(__c)))
__c = __sb->snextc();
#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
//195. Should basic_istream::sentry's constructor ever set eofbit?
! if (traits_type::eq_int_type(__c, __eof))
__in.setstate(ios_base::eofbit);
#endif
}
*************** namespace std
*** 521,527 ****
{
__c = this->rdbuf()->sbumpc();
// 27.6.1.1 paragraph 3
! if (__c != __eof)
_M_gcount = 1;
else
this->setstate(ios_base::eofbit | ios_base::failbit);
--- 522,528 ----
{
__c = this->rdbuf()->sbumpc();
// 27.6.1.1 paragraph 3
! if (!traits_type::eq_int_type(__c, __eof))
_M_gcount = 1;
else
this->setstate(ios_base::eofbit | ios_base::failbit);
*************** namespace std
*** 552,558 ****
const int_type __eof = traits_type::eof();
int_type __bufval = this->rdbuf()->sbumpc();
// 27.6.1.1 paragraph 3
! if (__bufval != __eof)
{
_M_gcount = 1;
__c = traits_type::to_char_type(__bufval);
--- 553,559 ----
const int_type __eof = traits_type::eof();
int_type __bufval = this->rdbuf()->sbumpc();
// 27.6.1.1 paragraph 3
! if (!traits_type::eq_int_type(__bufval, __eof))
{
_M_gcount = 1;
__c = traits_type::to_char_type(__bufval);
*************** namespace std
*** 588,600 ****
__streambuf_type* __sb = this->rdbuf();
int_type __c = __sb->sgetc();
! while (_M_gcount + 1 < __n && __c != __eof && __c != __idelim)
{
*__s++ = traits_type::to_char_type(__c);
__c = __sb->snextc();
++_M_gcount;
}
! if (__c == __eof)
this->setstate(ios_base::eofbit);
}
catch(exception& __fail)
--- 589,603 ----
__streambuf_type* __sb = this->rdbuf();
int_type __c = __sb->sgetc();
! while (_M_gcount + 1 < __n
! && !traits_type::eq_int_type(__c, __eof)
! && !traits_type::eq_int_type(__c, __idelim))
{
*__s++ = traits_type::to_char_type(__c);
__c = __sb->snextc();
++_M_gcount;
}
! if (traits_type::eq_int_type(__c, __eof))
this->setstate(ios_base::eofbit);
}
catch(exception& __fail)
*************** namespace std
*** 627,640 ****
const int_type __eof = traits_type::eof();
__streambuf_type* __this_sb = this->rdbuf();
int_type __c = __this_sb->sgetc();
! while (__c != __eof && __c != __idelim
! && (__sb.sputc(traits_type::to_char_type(__c)) != __eof))
{
++_M_gcount;
__c = __this_sb->snextc();
}
! if (__c == __eof)
this->setstate(ios_base::eofbit);
}
catch(exception& __fail)
--- 630,646 ----
const int_type __eof = traits_type::eof();
__streambuf_type* __this_sb = this->rdbuf();
int_type __c = __this_sb->sgetc();
+ char_type __c2 = traits_type::to_char_type(__c);
! while (!traits_type::eq_int_type(__c, __eof)
! && !traits_type::eq_int_type(__c, __idelim)
! && !traits_type::eq_int_type(__sb.sputc(__c2), __eof))
{
++_M_gcount;
__c = __this_sb->snextc();
+ __c2 = traits_type::to_char_type(__c);
}
! if (traits_type::eq_int_type(__c, __eof))
this->setstate(ios_base::eofbit);
}
catch(exception& __fail)
*************** namespace std
*** 667,683 ****
__streambuf_type* __sb = this->rdbuf();
int_type __c = __sb->sgetc();
! while (_M_gcount + 1 < __n && __c != __eof && __c != __idelim)
{
*__s++ = traits_type::to_char_type(__c);
__c = __sb->snextc();
++_M_gcount;
}
! if (__c == __eof)
this->setstate(ios_base::eofbit);
else
{
! if (__c == __idelim)
{
__sb->sbumpc();
++_M_gcount;
--- 673,691 ----
__streambuf_type* __sb = this->rdbuf();
int_type __c = __sb->sgetc();
! while (_M_gcount + 1 < __n
! && !traits_type::eq_int_type(__c, __eof)
! && !traits_type::eq_int_type(__c, __idelim))
{
*__s++ = traits_type::to_char_type(__c);
__c = __sb->snextc();
++_M_gcount;
}
! if (traits_type::eq_int_type(__c, __eof))
this->setstate(ios_base::eofbit);
else
{
! if (traits_type::eq_int_type(__c, __idelim))
{
__sb->sbumpc();
++_M_gcount;
*************** namespace std
*** 717,730 ****
int_type __c = __sb->sgetc();
__n = min(__n, numeric_limits<streamsize>::max());
! while (_M_gcount < __n && __c !=__eof && __c != __delim)
{
__c = __sb->snextc();
++_M_gcount;
}
! if (__c == __eof)
this->setstate(ios_base::eofbit);
! else if (__c == __delim)
{
__sb->sbumpc();
++_M_gcount;
--- 725,740 ----
int_type __c = __sb->sgetc();
__n = min(__n, numeric_limits<streamsize>::max());
! while (_M_gcount < __n
! && !traits_type::eq_int_type(__c, __eof)
! && !traits_type::eq_int_type(__c, __delim))
{
__c = __sb->snextc();
++_M_gcount;
}
! if (traits_type::eq_int_type(__c, __eof))
this->setstate(ios_base::eofbit);
! else if (traits_type::eq_int_type(__c, __delim))
{
__sb->sbumpc();
++_M_gcount;
*************** namespace std
*** 806,814 ****
{
try
{
- const int_type __eof = traits_type::eof();
streamsize __num = this->rdbuf()->in_avail();
! if (__num != static_cast<streamsize>(__eof))
{
__num = min(__num, __n);
if (__num)
--- 816,823 ----
{
try
{
streamsize __num = this->rdbuf()->in_avail();
! if (__num > 0)
{
__num = min(__num, __n);
if (__num)
*************** namespace std
*** 843,849 ****
{
const int_type __eof = traits_type::eof();
__streambuf_type* __sb = this->rdbuf();
! if (!__sb || __sb->sputbackc(__c) == __eof)
this->setstate(ios_base::badbit);
}
catch(exception& __fail)
--- 852,859 ----
{
const int_type __eof = traits_type::eof();
__streambuf_type* __sb = this->rdbuf();
! if (!__sb
! || traits_type::eq_int_type(__sb->sputbackc(__c), __eof))
this->setstate(ios_base::badbit);
}
catch(exception& __fail)
*************** namespace std
*** 873,879 ****
{
const int_type __eof = traits_type::eof();
__streambuf_type* __sb = this->rdbuf();
! if (!__sb || __eof == __sb->sungetc())
this->setstate(ios_base::badbit);
}
catch(exception& __fail)
--- 883,890 ----
{
const int_type __eof = traits_type::eof();
__streambuf_type* __sb = this->rdbuf();
! if (!__sb
! || traits_type::eq_int_type(__sb->sungetc(), __eof))
this->setstate(ios_base::badbit);
}
catch(exception& __fail)
*************** namespace std
*** 895,901 ****
basic_istream<_CharT, _Traits>::
sync(void)
{
! int __ret = traits_type::eof();
_M_gcount = 0;
sentry __cerb(*this, true);
if (__cerb)
--- 906,912 ----
basic_istream<_CharT, _Traits>::
sync(void)
{
! int __ret = -1;
_M_gcount = 0;
sentry __cerb(*this, true);
if (__cerb)
*************** namespace std
*** 903,912 ****
try
{
__streambuf_type* __sb = this->rdbuf();
! if (!__sb || __ret == __sb->pubsync())
! this->setstate(ios_base::badbit);
! else
! __ret = 0;
}
catch(exception& __fail)
{
--- 914,926 ----
try
{
__streambuf_type* __sb = this->rdbuf();
! if (__sb)
! {
! if (__sb->pubsync() == -1)
! this->setstate(ios_base::badbit);
! else
! __ret = 0;
! }
}
catch(exception& __fail)
{
*************** namespace std
*** 1186,1201 ****
__streambuf_type* __sb = __in.rdbuf();
__int_type __c = __sb->sbumpc();
const __int_type __eof = _Traits::eof();
! __testdelim = __c == __idelim;
! while (__extracted <= __n && __c != __eof && !__testdelim)
{
__str += _Traits::to_char_type(__c);
++__extracted;
__c = __sb->sbumpc();
! __testdelim = __c == __idelim;
}
! if (__c == __eof)
__in.setstate(ios_base::eofbit);
}
if (!__extracted && !__testdelim)
--- 1200,1217 ----
__streambuf_type* __sb = __in.rdbuf();
__int_type __c = __sb->sbumpc();
const __int_type __eof = _Traits::eof();
! __testdelim = _Traits::eq_int_type(__c, __idelim);
! while (__extracted <= __n
! && !_Traits::eq_int_type(__c, __eof)
! && !__testdelim)
{
__str += _Traits::to_char_type(__c);
++__extracted;
__c = __sb->sbumpc();
! __testdelim = _Traits::eq_int_type(__c, __idelim);
}
! if (_Traits::eq_int_type(__c, __eof))
__in.setstate(ios_base::eofbit);
}
if (!__extracted && !__testdelim)
Index: include/bits/locale_facets.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/locale_facets.h,v
retrieving revision 1.44
diff -c -p -r1.44 locale_facets.h
*** include/bits/locale_facets.h 3 Jul 2002 06:29:26 -0000 1.44
--- include/bits/locale_facets.h 31 Jul 2002 02:27:02 -0000
*************** namespace std
*** 55,60 ****
--- 55,63 ----
# define _GLIBCPP_NUM_FACETS 14
#endif
+ template<typename _CharT, typename _Traits>
+ struct __pad;
+
// 22.2.1.1 Template class ctype
// Include host and configuration specific ctype enums for ctype_base.
#include <bits/ctype_base.h>
*************** namespace std
*** 652,657 ****
--- 655,661 ----
virtual iter_type
do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
+
virtual iter_type
do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, long&) const;
*************** namespace std
*** 696,701 ****
--- 700,722 ----
template<typename _CharT, typename _InIter>
locale::id num_get<_CharT, _InIter>::id;
+
+ #if 0
+ // Partial specialization for istreambuf_iterator, so can use traits_type.
+ template<typename _CharT>
+ class num_get<_CharT, istreambuf_iterator<_CharT> >;
+
+ iter_type
+ _M_extract_float(iter_type, iter_type, ios_base&, ios_base::iostate&,
+ string& __xtrc) const;
+
+ iter_type
+ _M_extract_int(iter_type, iter_type, ios_base&, ios_base::iostate&,
+ string& __xtrc, int& __base) const;
+
+ virtual iter_type
+ do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const;
+ #endif
template<typename _CharT, typename _OutIter>
class num_put : public locale::facet, public __num_base
Index: include/bits/locale_facets.tcc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/locale_facets.tcc,v
retrieving revision 1.77
diff -c -p -r1.77 locale_facets.tcc
*** include/bits/locale_facets.tcc 4 May 2002 21:33:17 -0000 1.77
--- include/bits/locale_facets.tcc 31 Jul 2002 02:27:02 -0000
*************** namespace std
*** 94,99 ****
--- 94,100 ----
_M_extract_float(_InIter __beg, _InIter __end, ios_base& __io,
ios_base::iostate& __err, string& __xtrc) const
{
+ typedef char_traits<_CharT> __traits_type;
const locale __loc = __io.getloc();
const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc);
*************** namespace std
*** 103,109 ****
const char_type __minus = __ctype.widen('-');
int __pos = 0;
char_type __c = *__beg;
! if ((__c == __plus || __c == __minus) && __beg != __end)
{
__xtrc += __ctype.narrow(__c, char());
++__pos;
--- 104,111 ----
const char_type __minus = __ctype.widen('-');
int __pos = 0;
char_type __c = *__beg;
! if ((__traits_type::eq(__c, __plus) || __traits_type::eq(__c, __minus))
! && __beg != __end)
{
__xtrc += __ctype.narrow(__c, char());
++__pos;
*************** namespace std
*** 113,119 ****
// Next, strip leading zeros.
const char_type __zero = __ctype.widen(_S_atoms[_M_zero]);
bool __found_zero = false;
! while (__c == __zero && __beg != __end)
{
__c = *(++__beg);
__found_zero = true;
--- 115,121 ----
// Next, strip leading zeros.
const char_type __zero = __ctype.widen(_S_atoms[_M_zero]);
bool __found_zero = false;
! while (__traits_type::eq(__c, __zero) && __beg != __end)
{
__c = *(++__beg);
__found_zero = true;
*************** namespace std
*** 141,151 ****
while (__beg != __end)
{
// Only look in digits.
- typedef char_traits<_CharT> __traits_type;
const char_type* __p = __traits_type::find(__watoms, 10, __c);
// NB: strchr returns true for __c == 0x0
! if (__p && __c)
{
// Try first for acceptable digit; record it if found.
++__pos;
--- 143,152 ----
while (__beg != __end)
{
// Only look in digits.
const char_type* __p = __traits_type::find(__watoms, 10, __c);
// NB: strchr returns true for __c == 0x0
! if (__p && !__traits_type::eq(__c, char_type()))
{
// Try first for acceptable digit; record it if found.
++__pos;
*************** namespace std
*** 153,159 ****
++__sep_pos;
__c = *(++__beg);
}
! else if (__c == __sep && __check_grouping && !__found_dec)
{
// NB: Thousands separator at the beginning of a string
// is a no-no, as is two consecutive thousands separators.
--- 154,161 ----
++__sep_pos;
__c = *(++__beg);
}
! else if (__traits_type::eq(__c, __sep)
! && __check_grouping && !__found_dec)
{
// NB: Thousands separator at the beginning of a string
// is a no-no, as is two consecutive thousands separators.
*************** namespace std
*** 169,175 ****
break;
}
}
! else if (__c == __dec && !__found_dec)
{
// According to the standard, if no grouping chars are seen,
// no grouping check is applied. Therefore __found_grouping
--- 171,177 ----
break;
}
}
! else if (__traits_type::eq(__c, __dec) && !__found_dec)
{
// According to the standard, if no grouping chars are seen,
// no grouping check is applied. Therefore __found_grouping
*************** namespace std
*** 181,187 ****
__c = *(++__beg);
__found_dec = true;
}
! else if ((__c == __watoms[_M_e] || __c == __watoms[_M_E])
&& !__found_sci && __pos)
{
// Scientific notation.
--- 183,190 ----
__c = *(++__beg);
__found_dec = true;
}
! else if ((__traits_type::eq(__c, __watoms[_M_e])
! || __traits_type::eq(__c, __watoms[_M_E]))
&& !__found_sci && __pos)
{
// Scientific notation.
*************** namespace std
*** 190,196 ****
__c = *(++__beg);
// Remove optional plus or minus sign, if they exist.
! if (__c == __plus || __c == __minus)
{
++__pos;
__xtrc += __ctype.narrow(__c, char());
--- 193,200 ----
__c = *(++__beg);
// Remove optional plus or minus sign, if they exist.
! if (__traits_type::eq(__c, __plus)
! || __traits_type::eq(__c, __minus))
{
++__pos;
__xtrc += __ctype.narrow(__c, char());
*************** namespace std
*** 228,233 ****
--- 232,238 ----
_M_extract_int(_InIter __beg, _InIter __end, ios_base& __io,
ios_base::iostate& __err, string& __xtrc, int& __base) const
{
+ typedef char_traits<_CharT> __traits_type;
const locale __loc = __io.getloc();
const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc);
*************** namespace std
*** 241,250 ****
else
__base = 10;
! // First check for sign.
int __pos = 0;
char_type __c = *__beg;
! if ((__c == __ctype.widen('+') || __c == __ctype.widen('-'))
&& __beg != __end)
{
__xtrc += __ctype.narrow(__c, char());
--- 246,258 ----
else
__base = 10;
! // First check for sign.
int __pos = 0;
char_type __c = *__beg;
! const char_type __plus = __ctype.widen('+');
! const char_type __minus = __ctype.widen('-');
!
! if ((__traits_type::eq(__c, __plus) || __traits_type::eq(__c, __minus))
&& __beg != __end)
{
__xtrc += __ctype.narrow(__c, char());
*************** namespace std
*** 259,265 ****
if (__base == 10)
{
bool __found_zero = false;
! while (__c == __zero && __beg != __end)
{
__c = *(++__beg);
__found_zero = true;
--- 267,273 ----
if (__base == 10)
{
bool __found_zero = false;
! while (__traits_type::eq(__c, __zero) && __beg != __end)
{
__c = *(++__beg);
__found_zero = true;
*************** namespace std
*** 270,276 ****
++__pos;
if (__basefield == 0)
{
! if ((__c == __x || __c == __X) && __beg != __end)
{
__xtrc += __ctype.narrow(__c, char());
++__pos;
--- 278,286 ----
++__pos;
if (__basefield == 0)
{
! if ((__traits_type::eq(__c, __x)
! || __traits_type::eq(__c, __X))
! && __beg != __end)
{
__xtrc += __ctype.narrow(__c, char());
++__pos;
*************** namespace std
*** 284,295 ****
}
else if (__base == 16)
{
! if (__c == __zero && __beg != __end)
{
__xtrc += _S_atoms[_M_zero];
++__pos;
__c = *(++__beg);
! if ((__c == __x || __c == __X) && __beg != __end)
{
__xtrc += __ctype.narrow(__c, char());
++__pos;
--- 294,306 ----
}
else if (__base == 16)
{
! if (__traits_type::eq(__c, __zero) && __beg != __end)
{
__xtrc += _S_atoms[_M_zero];
++__pos;
__c = *(++__beg);
! if ((__traits_type::eq(__c, __x) || __traits_type::eq(__c, __X))
! && __beg != __end)
{
__xtrc += __ctype.narrow(__c, char());
++__pos;
*************** namespace std
*** 316,326 ****
const char_type __sep = __np.thousands_sep();
while (__beg != __end)
{
- typedef char_traits<_CharT> __traits_type;
const char_type* __p = __traits_type::find(__watoms, __len, __c);
// NB: strchr returns true for __c == 0x0
! if (__p && __c)
{
// Try first for acceptable digit; record it if found.
__xtrc += _S_atoms[__p - __watoms];
--- 327,336 ----
const char_type __sep = __np.thousands_sep();
while (__beg != __end)
{
const char_type* __p = __traits_type::find(__watoms, __len, __c);
// NB: strchr returns true for __c == 0x0
! if (__p && !__traits_type::eq(__c, char_type()))
{
// Try first for acceptable digit; record it if found.
__xtrc += _S_atoms[__p - __watoms];
*************** namespace std
*** 328,334 ****
++__sep_pos;
__c = *(++__beg);
}
! else if (__c == __sep && __check_grouping)
{
// NB: Thousands separator at the beginning of a string
// is a no-no, as is two consecutive thousands separators.
--- 338,344 ----
++__sep_pos;
__c = *(++__beg);
}
! else if (__traits_type::eq(__c, __sep) && __check_grouping)
{
// NB: Thousands separator at the beginning of a string
// is a no-no, as is two consecutive thousands separators.
*************** namespace std
*** 394,400 ****
// Parse bool values as alphanumeric
else
{
! typedef basic_string<_CharT> __string_type;
locale __loc = __io.getloc();
const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc);
const __string_type __true = __np.truename();
--- 404,412 ----
// Parse bool values as alphanumeric
else
{
! typedef char_traits<_CharT> __traits_type;
! typedef basic_string<_CharT> __string_type;
!
locale __loc = __io.getloc();
const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc);
const __string_type __true = __np.truename();
*************** namespace std
*** 407,414 ****
for (size_t __n = 0; __beg != __end; ++__n)
{
char_type __c = *__beg++;
! bool __testf = __n <= __falsen ? __c == __falses[__n] : false;
! bool __testt = __n <= __truen ? __c == __trues[__n] : false;
if (!(__testf || __testt))
{
__err |= ios_base::failbit;
--- 419,428 ----
for (size_t __n = 0; __beg != __end; ++__n)
{
char_type __c = *__beg++;
! bool __testf = __n <= __falsen
! ? __traits_type::eq(__c, __falses[__n]) : false;
! bool __testt = __n <= __truen
! ? __traits_type::eq(__c, __trues[__n]) : false;
if (!(__testf || __testt))
{
__err |= ios_base::failbit;
*************** namespace std
*** 708,713 ****
--- 722,728 ----
_M_widen_float(_OutIter __s, ios_base& __io, _CharT __fill, char* __cs,
int __len) const
{
+ typedef char_traits<_CharT> __traits_type;
// [22.2.2.2.2] Stage 2, convert to char_type, using correct
// numpunct.decimal_point() values for '.' and adding grouping.
const locale __loc = __io.getloc();
*************** namespace std
*** 723,729 ****
// Replace decimal point.
const _CharT* __p;
const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc);
! if (__p = char_traits<_CharT>::find(__ws, __len, __ctype.widen('.')))
__ws[__p - __ws] = __np.decimal_point();
#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
--- 738,744 ----
// Replace decimal point.
const _CharT* __p;
const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc);
! if (__p = __traits_type::find(__ws, __len, __ctype.widen('.')))
__ws[__p - __ws] = __np.decimal_point();
#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
*************** namespace std
*** 744,750 ****
// Tack on decimal part.
if (__p)
{
! char_traits<_CharT>::copy(__p2, __p, __len - __declen);
__newlen += __len - __declen;
}
--- 759,765 ----
// Tack on decimal part.
if (__p)
{
! __traits_type::copy(__p2, __p, __len - __declen);
__newlen += __len - __declen;
}
*************** namespace std
*** 816,828 ****
_M_insert(_OutIter __s, ios_base& __io, _CharT __fill, const _CharT* __ws,
int __len) const
{
// [22.2.2.2.2] Stage 3.
streamsize __w = __io.width();
_CharT* __ws2 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
* __w));
if (__w > static_cast<streamsize>(__len))
{
! __pad(__io, __fill, __ws2, __ws, __w, __len, true);
__len = static_cast<int>(__w);
// Switch strings.
__ws = __ws2;
--- 831,845 ----
_M_insert(_OutIter __s, ios_base& __io, _CharT __fill, const _CharT* __ws,
int __len) const
{
+ typedef char_traits<_CharT> __traits_type;
// [22.2.2.2.2] Stage 3.
streamsize __w = __io.width();
_CharT* __ws2 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
* __w));
if (__w > static_cast<streamsize>(__len))
{
! __pad<_CharT, __traits_type>::_S_pad(__io, __fill, __ws2, __ws,
! __w, __len, true);
__len = static_cast<int>(__w);
// Switch strings.
__ws = __ws2;
*************** namespace std
*** 845,851 ****
if ((__flags & ios_base::boolalpha) == 0)
{
unsigned long __uv = __v;
! __s = _M_convert_int(__s, __io, __fill, 'u', char_type(), __uv);
}
else
{
--- 862,868 ----
if ((__flags & ios_base::boolalpha) == 0)
{
unsigned long __uv = __v;
! __s = _M_convert_int(__s, __io, __fill, 'u', char(), __uv);
}
else
{
*************** namespace std
*** 866,879 ****
_OutIter
num_put<_CharT, _OutIter>::
do_put(iter_type __s, ios_base& __io, char_type __fill, long __v) const
! { return _M_convert_int(__s, __io, __fill, 'd', char_type(), __v); }
template<typename _CharT, typename _OutIter>
_OutIter
num_put<_CharT, _OutIter>::
do_put(iter_type __s, ios_base& __io, char_type __fill,
unsigned long __v) const
! { return _M_convert_int(__s, __io, __fill, 'u', char_type(), __v); }
#ifdef _GLIBCPP_USE_LONG_LONG
template<typename _CharT, typename _OutIter>
--- 883,896 ----
_OutIter
num_put<_CharT, _OutIter>::
do_put(iter_type __s, ios_base& __io, char_type __fill, long __v) const
! { return _M_convert_int(__s, __io, __fill, 'd', char(), __v); }
template<typename _CharT, typename _OutIter>
_OutIter
num_put<_CharT, _OutIter>::
do_put(iter_type __s, ios_base& __io, char_type __fill,
unsigned long __v) const
! { return _M_convert_int(__s, __io, __fill, 'u', char(), __v); }
#ifdef _GLIBCPP_USE_LONG_LONG
template<typename _CharT, typename _OutIter>
*************** namespace std
*** 894,900 ****
_OutIter
num_put<_CharT, _OutIter>::
do_put(iter_type __s, ios_base& __io, char_type __fill, double __v) const
! { return _M_convert_float(__s, __io, __fill, char_type(), __v); }
template<typename _CharT, typename _OutIter>
_OutIter
--- 911,917 ----
_OutIter
num_put<_CharT, _OutIter>::
do_put(iter_type __s, ios_base& __io, char_type __fill, double __v) const
! { return _M_convert_float(__s, __io, __fill, char(), __v); }
template<typename _CharT, typename _OutIter>
_OutIter
*************** namespace std
*** 915,921 ****
__io.flags(__flags & __fmt | (ios_base::hex | ios_base::showbase));
try
{
! __s = _M_convert_int(__s, __io, __fill, 'u', char_type(),
reinterpret_cast<unsigned long>(__v));
__io.flags(__flags);
}
--- 932,938 ----
__io.flags(__flags & __fmt | (ios_base::hex | ios_base::showbase));
try
{
! __s = _M_convert_int(__s, __io, __fill, 'u', char(),
reinterpret_cast<unsigned long>(__v));
__io.flags(__flags);
}
*************** namespace std
*** 1591,1597 ****
const _CharT** __names, size_t __indexlen,
ios_base::iostate& __err) const
{
! typedef char_traits<char_type> __traits_type;
int* __matches = static_cast<int*>(__builtin_alloca(sizeof(int) * __indexlen));
size_t __nmatches = 0;
size_t __pos = 0;
--- 1608,1614 ----
const _CharT** __names, size_t __indexlen,
ios_base::iostate& __err) const
{
! typedef char_traits<_CharT> __traits_type;
int* __matches = static_cast<int*>(__builtin_alloca(sizeof(int) * __indexlen));
size_t __nmatches = 0;
size_t __pos = 0;
*************** namespace std
*** 1686,1692 ****
do_get_weekday(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, tm* __tm) const
{
! typedef char_traits<char_type> __traits_type;
locale __loc = __io.getloc();
__timepunct<_CharT> const& __tp = use_facet<__timepunct<_CharT> >(__loc);
const char_type* __days[7];
--- 1703,1709 ----
do_get_weekday(iter_type __beg, iter_type __end, ios_base& __io,
ios_base::iostate& __err, tm* __tm) const
{
! typedef char_traits<_CharT> __traits_type;
locale __loc = __io.getloc();
__timepunct<_CharT> const& __tp = use_facet<__timepunct<_CharT> >(__loc);
const char_type* __days[7];
*************** namespace std
*** 1729,1735 ****
do_get_monthname(iter_type __beg, iter_type __end,
ios_base& __io, ios_base::iostate& __err, tm* __tm) const
{
! typedef char_traits<char_type> __traits_type;
locale __loc = __io.getloc();
__timepunct<_CharT> const& __tp = use_facet<__timepunct<_CharT> >(__loc);
const char_type* __months[12];
--- 1746,1752 ----
do_get_monthname(iter_type __beg, iter_type __end,
ios_base& __io, ios_base::iostate& __err, tm* __tm) const
{
! typedef char_traits<_CharT> __traits_type;
locale __loc = __io.getloc();
__timepunct<_CharT> const& __tp = use_facet<__timepunct<_CharT> >(__loc);
const char_type* __months[12];
*************** namespace std
*** 1996,2017 ****
// internal-adjusted objects are padded according to the rules below
// concerning 0[xX] and +-, otherwise, exactly as right-adjusted
// ones are.
template<typename _CharT, typename _Traits>
! void
! __pad(ios_base& __io, _CharT __fill, _CharT* __news, const _CharT* __olds,
! const streamsize __newlen, const streamsize __oldlen,
! const bool __num)
! {
! typedef _CharT char_type;
! typedef _Traits traits_type;
! typedef typename traits_type::int_type int_type;
!
! int_type __plen = static_cast<size_t>(__newlen - __oldlen);
! char_type* __pads = static_cast<char_type*>(__builtin_alloca(sizeof(char_type) * __plen));
! traits_type::assign(__pads, __plen, __fill);
! char_type* __beg;
! char_type* __end;
size_t __mod = 0;
size_t __beglen; //either __plen or __oldlen
ios_base::fmtflags __adjust = __io.flags() & ios_base::adjustfield;
--- 2013,2043 ----
// internal-adjusted objects are padded according to the rules below
// concerning 0[xX] and +-, otherwise, exactly as right-adjusted
// ones are.
+
+ // NB: Of the two parameters, _CharT can be deduced from the
+ // function arguments. The other (_Traits) has to be explicitly specified.
template<typename _CharT, typename _Traits>
! struct __pad
! {
! static void
! _S_pad(ios_base& __io, _CharT __fill, _CharT* __news,
! const _CharT* __olds, const streamsize __newlen,
! const streamsize __oldlen, const bool __num);
! };
!
! template<typename _CharT, typename _Traits>
! void
! __pad<_CharT, _Traits>::_S_pad(ios_base& __io, _CharT __fill,
! _CharT* __news, const _CharT* __olds,
! const streamsize __newlen,
! const streamsize __oldlen, const bool __num)
! {
! size_t __plen = static_cast<size_t>(__newlen - __oldlen);
! _CharT* __pads = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __plen));
! _Traits::assign(__pads, __plen, __fill);
! _CharT* __beg;
! _CharT* __end;
size_t __mod = 0;
size_t __beglen; //either __plen or __oldlen
ios_base::fmtflags __adjust = __io.flags() & ios_base::adjustfield;
*************** namespace std
*** 2019,2025 ****
if (__adjust == ios_base::left)
{
// Padding last.
! __beg = const_cast<char_type*>(__olds);
__beglen = __oldlen;
__end = __pads;
}
--- 2045,2051 ----
if (__adjust == ios_base::left)
{
// Padding last.
! __beg = const_cast<_CharT*>(__olds);
__beglen = __oldlen;
__end = __pads;
}
*************** namespace std
*** 2030,2041 ****
// Who came up with these rules, anyway? Jeeze.
locale __loc = __io.getloc();
const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
! const char_type __minus = __ctype.widen('-');
! const char_type __plus = __ctype.widen('+');
! bool __testsign = __olds[0] == __minus || __olds[0] == __plus;
! bool __testhex = __ctype.widen('0') == __olds[0]
! && (__ctype.widen('x') == __olds[1]
! || __ctype.widen('X') == __olds[1]);
if (__testhex)
{
__news[0] = __olds[0];
--- 2056,2069 ----
// Who came up with these rules, anyway? Jeeze.
locale __loc = __io.getloc();
const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
! const _CharT __minus = __ctype.widen('-');
! const _CharT __plus = __ctype.widen('+');
! bool __testsign = _Traits::eq(__olds[0], __minus)
! || _Traits::eq(__olds[0], __plus);
!
! bool __testhex = _Traits::eq(__ctype.widen('0'), __olds[0])
! && (_Traits::eq(__ctype.widen('x'), __olds[1])
! || _Traits::eq(__ctype.widen('X'), __olds[1]));
if (__testhex)
{
__news[0] = __olds[0];
*************** namespace std
*** 2044,2066 ****
__news += 2;
__beg = __pads;
__beglen = __plen;
! __end = const_cast<char_type*>(__olds + __mod);
}
else if (__testsign)
{
! __news[0] = __olds[0] == __plus ? __plus : __minus;
++__mod;
++__news;
__beg = __pads;
__beglen = __plen;
! __end = const_cast<char_type*>(__olds + __mod);
}
else
{
// Padding first.
__beg = __pads;
__beglen = __plen;
! __end = const_cast<char_type*>(__olds);
}
}
else
--- 2072,2094 ----
__news += 2;
__beg = __pads;
__beglen = __plen;
! __end = const_cast<_CharT*>(__olds + __mod);
}
else if (__testsign)
{
! _Traits::eq((__news[0] = __olds[0]), __plus) ? __plus : __minus;
++__mod;
++__news;
__beg = __pads;
__beglen = __plen;
! __end = const_cast<_CharT*>(__olds + __mod);
}
else
{
// Padding first.
__beg = __pads;
__beglen = __plen;
! __end = const_cast<_CharT*>(__olds);
}
}
else
*************** namespace std
*** 2068,2090 ****
// Padding first.
__beg = __pads;
__beglen = __plen;
! __end = const_cast<char_type*>(__olds);
}
! traits_type::copy(__news, __beg, __beglen);
! traits_type::copy(__news + __beglen, __end, __newlen - __beglen - __mod);
! }
!
! // NB: Can't have default argument on non-member template, and
! // num_put doesn't have a _Traits template parameter, so this
! // forwarding template adds in the default template argument.
! template<typename _CharT>
! void
! __pad(ios_base& __io, _CharT __fill, _CharT* __news, const _CharT* __olds,
! const streamsize __newlen, const streamsize __oldlen,
! const bool __num)
! {
! return __pad<_CharT, char_traits<_CharT> >(__io, __fill, __news, __olds,
! __newlen, __oldlen, __num);
}
// Used by both numeric and monetary facets.
--- 2096,2106 ----
// Padding first.
__beg = __pads;
__beglen = __plen;
! __end = const_cast<_CharT*>(__olds);
}
! _Traits::copy(__news, __beg, __beglen);
! _Traits::copy(__news + __beglen, __end,
! __newlen - __beglen - __mod);
}
// Used by both numeric and monetary facets.
*************** namespace std
*** 2401,2405 ****
} // namespace std
#endif
-
-
--- 2417,2419 ----
Index: include/bits/ostream.tcc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/ostream.tcc,v
retrieving revision 1.30
diff -c -p -r1.30 ostream.tcc
*** include/bits/ostream.tcc 7 Jun 2002 22:06:38 -0000 1.30
--- include/bits/ostream.tcc 31 Jul 2002 02:27:02 -0000
*************** namespace std
*** 474,480 ****
streamsize __len = 1;
if (__w > __len)
{
! __pad(__out, __out.fill(), __pads, &__c, __w, __len, false);
__len = __w;
}
__out.write(__pads, __len);
--- 474,481 ----
streamsize __len = 1;
if (__w > __len)
{
! __pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __pads,
! &__c, __w, __len, false);
__len = __w;
}
__out.write(__pads, __len);
*************** namespace std
*** 509,515 ****
streamsize __len = 1;
if (__w > __len)
{
! __pad(__out, __out.fill(), __pads, &__c, __w, __len, false);
__len = __w;
}
__out.write(__pads, __len);
--- 510,517 ----
streamsize __len = 1;
if (__w > __len)
{
! __pad<char, _Traits>::_S_pad(__out, __out.fill(), __pads,
! &__c, __w, __len, false);
__len = __w;
}
__out.write(__pads, __len);
*************** namespace std
*** 542,548 ****
streamsize __len = static_cast<streamsize>(_Traits::length(__s));
if (__w > __len)
{
! __pad(__out, __out.fill(), __pads, __s, __w, __len, false);
__s = __pads;
__len = __w;
}
--- 544,551 ----
streamsize __len = static_cast<streamsize>(_Traits::length(__s));
if (__w > __len)
{
! __pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __pads,
! __s, __w, __len, false);
__s = __pads;
__len = __w;
}
*************** namespace std
*** 590,596 ****
if (__w > __len)
{
! __pad(__out, __out.fill(), __pads, __ws, __w, __len, false);
__str = __pads;
__len = __w;
}
--- 593,600 ----
if (__w > __len)
{
! __pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __pads,
! __ws, __w, __len, false);
__str = __pads;
__len = __w;
}
*************** namespace std
*** 628,634 ****
if (__w > __len)
{
! __pad(__out, __out.fill(), __pads, __s, __w, __len, false);
__s = __pads;
__len = __w;
}
--- 632,639 ----
if (__w > __len)
{
! __pad<char, _Traits>::_S_pad(__out, __out.fill(), __pads,
! __s, __w, __len, false);
__s = __pads;
__len = __w;
}
*************** namespace std
*** 668,674 ****
#endif
if (__w > __len)
{
! __pad(__out, __out.fill(), __pads, __s, __w, __len, false);
__s = __pads;
__len = __w;
}
--- 673,680 ----
#endif
if (__w > __len)
{
! __pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __pads, __s,
! __w, __len, false);
__s = __pads;
__len = __w;
}
Index: include/bits/sstream.tcc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/sstream.tcc,v
retrieving revision 1.11
diff -c -p -r1.11 sstream.tcc
*** include/bits/sstream.tcc 4 Jul 2002 09:20:00 -0000 1.11
--- include/bits/sstream.tcc 31 Jul 2002 02:27:02 -0000
*************** namespace std
*** 184,190 ****
if (_M_buf_size)
{
! off_type __pos = __sp._M_position();
char_type* __beg = NULL;
char_type* __end = NULL;
bool __testin = (ios_base::in & _M_mode & __mode) != 0;
--- 184,190 ----
if (_M_buf_size)
{
! off_type __pos = __sp; // Use streamoff operator to do conversion.
char_type* __beg = NULL;
char_type* __end = NULL;
bool __testin = (ios_base::in & _M_mode & __mode) != 0;
Index: include/bits/streambuf_iterator.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/streambuf_iterator.h,v
retrieving revision 1.7
diff -c -p -r1.7 streambuf_iterator.h
*** include/bits/streambuf_iterator.h 1 May 2002 22:40:27 -0000 1.7
--- include/bits/streambuf_iterator.h 31 Jul 2002 02:27:02 -0000
*************** namespace std
*** 69,81 ****
public:
istreambuf_iterator() throw()
! : _M_sbuf(0), _M_c(-2) { }
istreambuf_iterator(istream_type& __s) throw()
! : _M_sbuf(__s.rdbuf()), _M_c(-2) { }
istreambuf_iterator(streambuf_type* __s) throw()
! : _M_sbuf(__s), _M_c(-2) { }
// NB: The result of operator*() on an end of stream is undefined.
char_type
--- 69,81 ----
public:
istreambuf_iterator() throw()
! : _M_sbuf(0), _M_c(traits_type::eof()) { }
istreambuf_iterator(istream_type& __s) throw()
! : _M_sbuf(__s.rdbuf()), _M_c(traits_type::eof()) { }
istreambuf_iterator(streambuf_type* __s) throw()
! : _M_sbuf(__s), _M_c(traits_type::eof()) { }
// NB: The result of operator*() on an end of stream is undefined.
char_type
*************** namespace std
*** 85,105 ****
istreambuf_iterator&
operator++()
{
! if (_M_sbuf && _M_sbuf->sbumpc() == traits_type::eof())
_M_sbuf = 0;
else
! _M_c = -2;
return *this;
}
istreambuf_iterator
operator++(int)
{
istreambuf_iterator __old = *this;
! if (_M_sbuf && (__old._M_c = _M_sbuf->sbumpc()) == traits_type::eof())
_M_sbuf = 0;
else
! _M_c = -2;
return __old;
}
--- 85,109 ----
istreambuf_iterator&
operator++()
{
! const int_type __eof = traits_type::eof();
! if (_M_sbuf && traits_type::eq_int_type(_M_sbuf->sbumpc(), __eof))
_M_sbuf = 0;
else
! _M_c = __eof;
return *this;
}
istreambuf_iterator
operator++(int)
{
+ const int_type __eof = traits_type::eof();
istreambuf_iterator __old = *this;
! if (_M_sbuf
! && traits_type::eq_int_type((__old._M_c = _M_sbuf->sbumpc()),
! __eof))
_M_sbuf = 0;
else
! _M_c = __eof;
return __old;
}
*************** namespace std
*** 110,117 ****
equal(const istreambuf_iterator& __b) const
{
const int_type __eof = traits_type::eof();
! bool __thiseof = _M_get() == __eof;
! bool __beof = __b._M_get() == __eof;
return (__thiseof && __beof || (!__thiseof && !__beof));
}
#endif
--- 114,121 ----
equal(const istreambuf_iterator& __b) const
{
const int_type __eof = traits_type::eof();
! bool __thiseof = traits_type::eq_int_type(_M_get(), __eof);
! bool __beof = traits_type::eq_int_type(__b._M_get(), __eof);
return (__thiseof && __beof || (!__thiseof && !__beof));
}
#endif
*************** namespace std
*** 120,132 ****
int_type
_M_get() const
{
! int_type __ret = traits_type::eof();
if (_M_sbuf)
{
! if (_M_c != static_cast<int_type>(-2))
__ret = _M_c;
else
! if ((__ret = _M_sbuf->sgetc()) == traits_type::eof())
_M_sbuf = 0;
}
return __ret;
--- 124,137 ----
int_type
_M_get() const
{
! const int_type __eof = traits_type::eof();
! int_type __ret = __eof;
if (_M_sbuf)
{
! if (!traits_type::eq_int_type(_M_c, __eof))
__ret = _M_c;
else
! if (traits_type::eq_int_type((__ret = _M_sbuf->sgetc()), __eof))
_M_sbuf = 0;
}
return __ret;
Index: include/std/std_fstream.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/std/std_fstream.h,v
retrieving revision 1.12
diff -c -p -r1.12 std_fstream.h
*** include/std/std_fstream.h 30 Apr 2002 19:04:39 -0000 1.12
--- include/std/std_fstream.h 31 Jul 2002 02:27:02 -0000
*************** namespace std
*** 286,292 ****
--- 286,301 ----
}
};
+ // Explicit specializations.
+ template<>
+ basic_filebuf<char>::int_type
+ basic_filebuf<char>::_M_underflow_common(bool __bump);
+ #ifdef _GLIBCPP_USE_WCHAR_T
+ template<>
+ basic_filebuf<wchar_t>::int_type
+ basic_filebuf<wchar_t>::_M_underflow_common(bool __bump);
+ #endif
// 27.8.1.5 Template class basic_ifstream
/**
Index: include/std/std_streambuf.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/std/std_streambuf.h,v
retrieving revision 1.9
diff -c -p -r1.9 std_streambuf.h
*** include/std/std_streambuf.h 4 Jul 2002 09:20:01 -0000 1.9
--- include/std/std_streambuf.h 31 Jul 2002 02:27:02 -0000
*************** namespace std
*** 71,76 ****
--- 71,77 ----
// Non-standard Types:
typedef ctype<char_type> __ctype_type;
typedef basic_streambuf<char_type, traits_type> __streambuf_type;
+ typedef typename traits_type::state_type __state_type;
friend class basic_ios<char_type, traits_type>;
friend class basic_istream<char_type, traits_type>;
*************** namespace std
*** 131,136 ****
--- 132,140 ----
char_type* _M_pback_cur_save;
char_type* _M_pback_end_save;
bool _M_pback_init;
+
+ // Yet unused.
+ fpos<__state_type> _M_pos;
// Initializes pback buffers, and moves normal buffers to safety.
// Assumptions:
Index: src/Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/src/Makefile.am,v
retrieving revision 1.110
diff -c -p -r1.110 Makefile.am
*** src/Makefile.am 20 Jun 2002 19:08:38 -0000 1.110
--- src/Makefile.am 31 Jul 2002 02:27:02 -0000
*************** sources = \
*** 70,75 ****
--- 70,76 ----
concept-inst.cc \
ctype.cc \
ext-inst.cc \
+ fstream.cc \
fstream-inst.cc \
functexcept.cc \
globals.cc \
Index: src/Makefile.in
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/src/Makefile.in,v
retrieving revision 1.155
diff -c -p -r1.155 Makefile.in
*** src/Makefile.in 27 Jun 2002 10:16:49 -0000 1.155
--- src/Makefile.in 31 Jul 2002 02:27:03 -0000
*************** sources = \
*** 175,180 ****
--- 175,181 ----
concept-inst.cc \
ctype.cc \
ext-inst.cc \
+ fstream.cc \
fstream-inst.cc \
functexcept.cc \
globals.cc \
*************** LDFLAGS = @LDFLAGS@
*** 279,285 ****
LIBS = @LIBS@
libstdc___la_OBJECTS = basic_file.lo bitset.lo c++locale.lo codecvt.lo \
collate.lo complex_io.lo concept-inst.lo ctype.lo ext-inst.lo \
! fstream-inst.lo functexcept.lo globals.lo io-inst.lo ios.lo \
istream-inst.lo limits.lo locale-inst.lo locale.lo localename.lo \
messages.lo misc-inst.lo monetary.lo numeric.lo ostream-inst.lo \
sstream-inst.lo stdexcept.lo stl-inst.lo streambuf-inst.lo \
--- 280,286 ----
LIBS = @LIBS@
libstdc___la_OBJECTS = basic_file.lo bitset.lo c++locale.lo codecvt.lo \
collate.lo complex_io.lo concept-inst.lo ctype.lo ext-inst.lo \
! fstream.lo fstream-inst.lo functexcept.lo globals.lo io-inst.lo ios.lo \
istream-inst.lo limits.lo locale-inst.lo locale.lo localename.lo \
messages.lo misc-inst.lo monetary.lo numeric.lo ostream-inst.lo \
sstream-inst.lo stdexcept.lo stl-inst.lo streambuf-inst.lo \
Index: src/locale-inst.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/src/locale-inst.cc,v
retrieving revision 1.33
diff -c -p -r1.33 locale-inst.cc
*** src/locale-inst.cc 7 Jun 2002 22:06:38 -0000 1.33
--- src/locale-inst.cc 31 Jul 2002 02:27:03 -0000
*************** namespace std
*** 420,434 ****
bool
__verify_grouping<char>(const basic_string<char>&, basic_string<char>&);
! template
! void
! __pad<char>(ios_base&, char, char*, const char *, streamsize,
! streamsize, const bool);
!
! template
! void
! __pad<char, char_traits<char> >(ios_base&, char, char*, const char *,
! streamsize, streamsize, const bool);
#ifdef _GLIBCPP_USE_WCHAR_T
template
--- 420,426 ----
bool
__verify_grouping<char>(const basic_string<char>&, basic_string<char>&);
! template class __pad<char, char_traits<char> >;
#ifdef _GLIBCPP_USE_WCHAR_T
template
*************** namespace std
*** 440,468 ****
__verify_grouping<wchar_t>(const basic_string<wchar_t>&,
basic_string<wchar_t>&);
! template
! void
! __pad<wchar_t>(ios_base&, wchar_t, wchar_t*, const wchar_t*,
! streamsize, streamsize, const bool);
!
! template
! void
! __pad<wchar_t, char_traits<wchar_t> >(ios_base&, wchar_t, wchar_t*,
! const wchar_t*, streamsize,
! streamsize, const bool);
! #endif // _GLIBCPP_USE_WCHAR_T
template
int
! __convert_from_v(char*, const int, const char*, double, const __c_locale&, int);
template
int
! __convert_from_v(char*, const int, const char*, long double, const __c_locale&, int);
template
int
! __convert_from_v(char*, const int, const char*, long, const __c_locale&, int);
template
int
--- 432,454 ----
__verify_grouping<wchar_t>(const basic_string<wchar_t>&,
basic_string<wchar_t>&);
! template class __pad<wchar_t, char_traits<wchar_t> >;
! #endif
template
int
! __convert_from_v(char*, const int, const char*, double,
! const __c_locale&, int);
template
int
! __convert_from_v(char*, const int, const char*, long double,
! const __c_locale&, int);
template
int
! __convert_from_v(char*, const int, const char*, long,
! const __c_locale&, int);
template
int
*************** namespace std
*** 471,477 ****
template
int
! __convert_from_v(char*, const int, const char*, long long, const __c_locale&, int);
template
int
--- 457,464 ----
template
int
! __convert_from_v(char*, const int, const char*, long long,
! const __c_locale&, int);
template
int
Index: testsuite/testsuite_hooks.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/testsuite_hooks.h,v
retrieving revision 1.8
diff -c -p -r1.8 testsuite_hooks.h
*** testsuite/testsuite_hooks.h 7 Jun 2002 20:25:04 -0000 1.8
--- testsuite/testsuite_hooks.h 31 Jul 2002 02:27:03 -0000
***************
*** 50,59 ****
--- 50,65 ----
// 4) gnu_copy_tracker, from Stephen M. Webb <stephen@bregmasoft.com>.
// A class with nontrivial ctor/dtor that provides the ability to track the
// number of copy ctors and dtors, and will throw on demand during copy.
+ //
+ // 5) gnu_char, gnu_char_traits, abstract character classes and
+ // char_traits specializations for testing instantiations.
#ifndef _GLIBCPP_TESTSUITE_HOOKS_H
#define _GLIBCPP_TESTSUITE_HOOKS_H
+ #include <bits/c++config.h>
+ #include <cstddef>
+
#ifdef DEBUG_ASSERT
# include <cassert>
# define VERIFY(fn) assert(fn)
***************
*** 61,68 ****
# define VERIFY(fn) test &= (fn)
#endif
- #include <bits/c++config.h>
-
// Defined in GLIBCPP_CONFIGURE_TESTSUITE.
#ifndef _GLIBCPP_MEM_LIMITS
// Don't do memory limits.
--- 67,72 ----
*************** class gnu_copy_tracker
*** 146,151 ****
--- 150,229 ----
static int itsDtorCount;
};
+ struct gnu_char
+ {
+ unsigned long c;
+ };
+
+ struct gnu_int
+ {
+ unsigned long i;
+ };
+
+ struct gnu_state
+ {
+ unsigned long l;
+ unsigned long l2;
+ };
+
+ // char_traits specialization
+ namespace std
+ {
+ template<class _CharT>
+ struct char_traits;
+
+ template<>
+ struct char_traits<gnu_char>
+ {
+ typedef gnu_char char_type;
+ typedef gnu_int int_type;
+ typedef long pos_type;
+ typedef unsigned long off_type;
+ typedef gnu_state 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, size_t __n);
+
+ static size_t
+ length(const char_type* __s);
+
+ 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 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();
+
+ static int_type
+ not_eof(const int_type& __c);
+ };
+ } // namespace std
#endif // _GLIBCPP_TESTSUITE_HOOKS_H
Index: testsuite/21_strings/capacity.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/21_strings/capacity.cc,v
retrieving revision 1.8
diff -c -p -r1.8 capacity.cc
*** testsuite/21_strings/capacity.cc 18 Apr 2002 23:47:49 -0000 1.8
--- testsuite/21_strings/capacity.cc 31 Jul 2002 02:27:03 -0000
*************** template<typename T>
*** 36,41 ****
--- 36,128 ----
struct B { };
+ // char_traits specialization
+ namespace std
+ {
+ template<>
+ struct char_traits<A<B> >
+ {
+ typedef A<B> char_type;
+ // Unsigned as wint_t in unsigned.
+ typedef unsigned long int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_type;
+ typedef mbstate_t state_type;
+
+ static void
+ assign(char_type& __c1, const char_type& __c2)
+ { __c1 = __c2; }
+
+ static bool
+ eq(const char_type& __c1, const char_type& __c2)
+ { return __c1 == __c2; }
+
+ static bool
+ lt(const char_type& __c1, const char_type& __c2)
+ { return __c1 < __c2; }
+
+ static int
+ compare(const char_type* __s1, const char_type* __s2, size_t __n)
+ {
+ for (size_t __i = 0; __i < __n; ++__i)
+ if (!eq(__s1[__i], __s2[__i]))
+ return lt(__s1[__i], __s2[__i]) ? -1 : 1;
+ return 0;
+ }
+
+ static size_t
+ length(const char_type* __s)
+ {
+ const char_type* __p = __s;
+ while (__p)
+ ++__p;
+ return (__p - __s);
+ }
+
+ static const char_type*
+ find(const char_type* __s, size_t __n, const char_type& __a)
+ {
+ for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
+ if (*__p == __a) return __p;
+ return 0;
+ }
+
+ static char_type*
+ move(char_type* __s1, const char_type* __s2, size_t __n)
+ { return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
+
+ static char_type*
+ copy(char_type* __s1, const char_type* __s2, size_t __n)
+ { return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
+
+ static char_type*
+ assign(char_type* __s, size_t __n, char_type __a)
+ {
+ for (char_type* __p = __s; __p < __s + __n; ++__p)
+ assign(*__p, __a);
+ return __s;
+ }
+
+ static char_type
+ to_char_type(const int_type& __c)
+ { return char_type(); }
+
+ static int_type
+ to_int_type(const char_type& __c) { return int_type(); }
+
+ static bool
+ eq_int_type(const int_type& __c1, const int_type& __c2)
+ { return __c1 == __c2; }
+
+ static int_type
+ eof() { return static_cast<int_type>(-1); }
+
+ static int_type
+ not_eof(const int_type& __c)
+ { return eq_int_type(__c, eof()) ? int_type(0) : __c; }
+ };
+ } // namespace std
+
void test01()
{
// 1 POD types : resize, capacity, reserve
Index: testsuite/22_locale/codecvt_members_unicode_char.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/22_locale/codecvt_members_unicode_char.cc,v
retrieving revision 1.4
diff -c -p -r1.4 codecvt_members_unicode_char.cc
*** testsuite/22_locale/codecvt_members_unicode_char.cc 26 Mar 2002 00:36:19 -0000 1.4
--- testsuite/22_locale/codecvt_members_unicode_char.cc 31 Jul 2002 02:27:03 -0000
***************
*** 23,32 ****
#include <locale>
#include <testsuite_hooks.h>
! using namespace std;
#ifdef _GLIBCPP_USE___ENC_TRAITS
/*
> how do I check that these conversions are correct?
Very easy. Since all the characters are from ASCII you simply
--- 23,93 ----
#include <locale>
#include <testsuite_hooks.h>
!
#ifdef _GLIBCPP_USE___ENC_TRAITS
+ // Need some char_traits specializations for this to work.
+ typedef unsigned short unicode_t;
+
+ namespace std
+ {
+ template<>
+ struct char_traits<unicode_t>
+ {
+ typedef unicode_t char_type;
+ // Unsigned as wint_t is unsigned.
+ typedef unsigned long int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_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, size_t __n)
+ { return memcmp(__s1, __s2, __n); }
+
+ static size_t
+ length(const char_type* __s);
+
+ 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)
+ { return static_cast<char_type*>(memcpy(__s1, __s2, __n)); }
+
+ static char_type*
+ assign(char_type* __s, size_t __n, char_type __a);
+
+ 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();
+
+ static int_type
+ not_eof(const int_type& __c);
+ };
+ }
+
/*
> how do I check that these conversions are correct?
Very easy. Since all the characters are from ASCII you simply
*************** it shows that the other byte-order is us
*** 51,57 ****
void
! initialize_state(__enc_traits& state)
{ state._M_init(); }
// Partial specialization using __enc_traits.
--- 112,118 ----
void
! initialize_state(std::__enc_traits& state)
{ state._M_init(); }
// Partial specialization using __enc_traits.
*************** initialize_state(__enc_traits& state)
*** 59,66 ****
// UNICODE - UCS2 (big endian)
void test01()
{
typedef codecvt_base::result result;
- typedef unsigned short unicode_t;
typedef unicode_t int_type;
typedef char ext_type;
typedef __enc_traits enc_type;
--- 120,127 ----
// UNICODE - UCS2 (big endian)
void test01()
{
+ using namespace std;
typedef codecvt_base::result result;
typedef unicode_t int_type;
typedef char ext_type;
typedef __enc_traits enc_type;
*************** void test01()
*** 146,151 ****
--- 207,213 ----
// UNICODE - UCS2 (little endian)
void test02()
{
+ using namespace std;
typedef codecvt_base::result result;
typedef unsigned short unicode_t;
typedef unicode_t int_type;
Index: testsuite/22_locale/codecvt_members_unicode_wchar_t.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/22_locale/codecvt_members_unicode_wchar_t.cc,v
retrieving revision 1.2
diff -c -p -r1.2 codecvt_members_unicode_wchar_t.cc
*** testsuite/22_locale/codecvt_members_unicode_wchar_t.cc 28 Mar 2002 19:19:23 -0000 1.2
--- testsuite/22_locale/codecvt_members_unicode_wchar_t.cc 31 Jul 2002 02:27:03 -0000
***************
*** 1,6 ****
// 2000-08-23 Benjamin Kosnik <bkoz@cygnus.com>
! // Copyright (C) 2000, 2001 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
--- 1,6 ----
// 2000-08-23 Benjamin Kosnik <bkoz@cygnus.com>
! // Copyright (C) 2000, 2001, 2002 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
***************
*** 23,43 ****
#include <locale>
#include <testsuite_hooks.h>
- using namespace std;
-
#ifdef _GLIBCPP_USE___ENC_TRAITS
#ifdef _GLIBCPP_USE_WCHAR_T
void
! initialize_state(__enc_traits& state)
{ state._M_init(); }
// Partial specialization using __enc_traits.
// codecvt<unicode_t, wchar_t, __enc_traits>
void test01()
{
typedef codecvt_base::result result;
- typedef unsigned short unicode_t;
typedef unicode_t int_type;
typedef wchar_t ext_type;
typedef __enc_traits enc_type;
--- 23,102 ----
#include <locale>
#include <testsuite_hooks.h>
#ifdef _GLIBCPP_USE___ENC_TRAITS
#ifdef _GLIBCPP_USE_WCHAR_T
+ // Need some char_traits specializations for this to work.
+ typedef unsigned short unicode_t;
+
+ namespace std
+ {
+ template<>
+ struct char_traits<unicode_t>
+ {
+ typedef unicode_t char_type;
+ // Unsigned as wint_t is unsigned.
+ typedef unsigned long int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_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, size_t __n)
+ { return memcmp(__s1, __s2, __n); }
+
+ static size_t
+ length(const char_type* __s);
+
+ 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)
+ { return static_cast<char_type*>(memcpy(__s1, __s2, __n)); }
+
+ static char_type*
+ assign(char_type* __s, size_t __n, char_type __a);
+
+ 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();
+
+ static int_type
+ not_eof(const int_type& __c);
+ };
+ }
+
void
! initialize_state(std::__enc_traits& state)
{ state._M_init(); }
// Partial specialization using __enc_traits.
// codecvt<unicode_t, wchar_t, __enc_traits>
void test01()
{
+ using namespace std;
typedef codecvt_base::result result;
typedef unicode_t int_type;
typedef wchar_t ext_type;
typedef __enc_traits enc_type;
Index: testsuite/22_locale/ctor_copy_dtor.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/22_locale/ctor_copy_dtor.cc,v
retrieving revision 1.14
diff -c -p -r1.14 ctor_copy_dtor.cc
*** testsuite/22_locale/ctor_copy_dtor.cc 25 Jul 2002 06:42:00 -0000 1.14
--- testsuite/22_locale/ctor_copy_dtor.cc 31 Jul 2002 02:27:03 -0000
*************** public:
*** 48,58 ****
std::locale::id gnu_facet::id;
void test01()
{
using namespace std;
-
- typedef unsigned short unicode_t;
typedef unicode_t int_type;
typedef char ext_type;
typedef __enc_traits enc_type;
--- 48,117 ----
std::locale::id gnu_facet::id;
+ // Need some char_traits specializations for this to work.
+ typedef unsigned short unicode_t;
+
+ namespace std
+ {
+ template<>
+ struct char_traits<unicode_t>
+ {
+ typedef unicode_t char_type;
+ // Unsigned as wint_t is unsigned.
+ typedef unsigned long int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_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, size_t __n)
+ { return memcmp(__s1, __s2, __n); }
+
+ static size_t
+ length(const char_type* __s);
+
+ 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)
+ { return static_cast<char_type*>(memcpy(__s1, __s2, __n)); }
+
+ static char_type*
+ assign(char_type* __s, size_t __n, char_type __a);
+
+ 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();
+
+ static int_type
+ not_eof(const int_type& __c);
+ };
+ }
+
void test01()
{
using namespace std;
typedef unicode_t int_type;
typedef char ext_type;
typedef __enc_traits enc_type;
Index: testsuite/27_io/filebuf.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/filebuf.cc,v
retrieving revision 1.19
diff -c -p -r1.19 filebuf.cc
*** testsuite/27_io/filebuf.cc 26 Jul 2002 01:49:36 -0000 1.19
--- testsuite/27_io/filebuf.cc 31 Jul 2002 02:27:03 -0000
*************** void test01()
*** 42,52 ****
// test05
// libstdc++/1886
// should be able to instantiate basic_filebuf for non-standard types.
! template class std::basic_filebuf<short, std::char_traits<short> >;
int main()
{
test01();
return 0;
}
--- 42,108 ----
// test05
// libstdc++/1886
// should be able to instantiate basic_filebuf for non-standard types.
! namespace test
! {
! using namespace std;
! typedef short type_t;
! template class basic_filebuf<type_t, char_traits<type_t> >;
! template class basic_filebuf<gnu_char, char_traits<gnu_char> >;
! } // test
!
!
! // test07
! // libstdc++/2020
! // should be able to use custom char_type
! class gnu_char_type
! {
! unsigned long character;
! public:
! // operator ==
! bool
! operator==(const gnu_char_type& __lhs)
! { return character == __lhs.character; }
!
! // operator <
! bool
! operator<(const gnu_char_type& __lhs)
! { return character < __lhs.character; }
!
! // default ctor
! gnu_char_type() { }
!
! // to_char_type
! gnu_char_type(const unsigned long& __l) : character(__l) { }
!
! // to_int_type
! operator unsigned long() const { return character; }
! };
!
! void test07()
! {
! bool test = true;
! typedef std::basic_filebuf<gnu_char_type> gnu_filebuf;
!
! try
! { gnu_filebuf obj; }
! catch(std::exception& obj)
! {
! test = false;
! VERIFY( test );
! }
! }
!
! #if !__GXX_WEAK__
! // Explicitly instantiate for systems with no COMDAT or weak support.
! template
! std::basic_streambuf<gnu_char_type>::int_type
! std::basic_streambuf<gnu_char_type>::_S_pback_size;
! #endif
int main()
{
test01();
+ test07();
return 0;
}
Index: testsuite/27_io/filebuf_virtuals.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc,v
retrieving revision 1.6
diff -c -p -r1.6 filebuf_virtuals.cc
*** testsuite/27_io/filebuf_virtuals.cc 22 Apr 2002 20:28:05 -0000 1.6
--- testsuite/27_io/filebuf_virtuals.cc 31 Jul 2002 02:27:03 -0000
*************** void test06()
*** 514,567 ****
VERIFY( buffer[0] == 'a' );
}
- // test06
- // libstdc++/2020
- // should be able to use custom char_type
- class gnu_char_type
- {
- unsigned long character;
- public:
- // operator ==
- bool
- operator==(const gnu_char_type& __lhs)
- { return character == __lhs.character; }
-
- // operator <
- bool
- operator<(const gnu_char_type& __lhs)
- { return character < __lhs.character; }
-
- // default ctor
- gnu_char_type() { }
-
- // to_char_type
- gnu_char_type(const unsigned long& __l) : character(__l) { }
-
- // to_int_type
- operator unsigned long() const { return character; }
- };
-
- void test07()
- {
- bool test = true;
- typedef std::basic_filebuf<gnu_char_type> gnu_filebuf;
-
- try
- { gnu_filebuf obj; }
- catch(std::exception& obj)
- {
- test = false;
- VERIFY( test );
- }
- }
-
- #if !__GXX_WEAK__
- // Explicitly instantiate for systems with no COMDAT or weak support.
- template
- std::basic_streambuf<gnu_char_type>::int_type
- std::basic_streambuf<gnu_char_type>::_S_pback_size;
- #endif
-
main()
{
test01();
--- 514,519 ----
*************** main()
*** 571,577 ****
test04();
test05();
test06();
- test07();
return 0;
}
--- 523,528 ----
Index: testsuite/27_io/fstream.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/fstream.cc,v
retrieving revision 1.1
diff -c -p -r1.1 fstream.cc
*** testsuite/27_io/fstream.cc 26 Jul 2002 01:49:36 -0000 1.1
--- testsuite/27_io/fstream.cc 31 Jul 2002 02:27:03 -0000
***************
*** 31,36 ****
--- 31,37 ----
// NB: This file is for testing basic_fstream with NO OTHER INCLUDES.
#include <fstream>
+ #include <testsuite_hooks.h>
// { dg-do compile }
*************** namespace test
*** 51,56 ****
--- 52,58 ----
using namespace std;
typedef short type_t;
template class basic_fstream<type_t, char_traits<type_t> >;
+ template class basic_fstream<gnu_char, char_traits<gnu_char> >;
} // test
int main()
Index: testsuite/27_io/ios_init.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/ios_init.cc,v
retrieving revision 1.9
diff -c -p -r1.9 ios_init.cc
*** testsuite/27_io/ios_init.cc 4 Apr 2002 05:32:59 -0000 1.9
--- testsuite/27_io/ios_init.cc 31 Jul 2002 02:27:03 -0000
***************
*** 34,39 ****
--- 34,209 ----
#include <iostream>
#include <testsuite_hooks.h>
+ // char_traits specialization
+ namespace std
+ {
+ template<>
+ struct char_traits<unsigned short>
+ {
+ typedef unsigned short char_type;
+ // Unsigned as wint_t in unsigned.
+ typedef unsigned long int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_type;
+ typedef mbstate_t state_type;
+
+ static void
+ assign(char_type& __c1, const char_type& __c2)
+ { __c1 = __c2; }
+
+ static bool
+ eq(const char_type& __c1, const char_type& __c2)
+ { return __c1 == __c2; }
+
+ static bool
+ lt(const char_type& __c1, const char_type& __c2)
+ { return __c1 < __c2; }
+
+ static int
+ compare(const char_type* __s1, const char_type* __s2, size_t __n)
+ {
+ for (size_t __i = 0; __i < __n; ++__i)
+ if (!eq(__s1[__i], __s2[__i]))
+ return lt(__s1[__i], __s2[__i]) ? -1 : 1;
+ return 0;
+ }
+
+ static size_t
+ length(const char_type* __s)
+ {
+ const char_type* __p = __s;
+ while (__p)
+ ++__p;
+ return (__p - __s);
+ }
+
+ static const char_type*
+ find(const char_type* __s, size_t __n, const char_type& __a)
+ {
+ for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
+ if (*__p == __a) return __p;
+ return 0;
+ }
+
+ static char_type*
+ move(char_type* __s1, const char_type* __s2, size_t __n)
+ { return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
+
+ static char_type*
+ copy(char_type* __s1, const char_type* __s2, size_t __n)
+ { return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
+
+ static char_type*
+ assign(char_type* __s, size_t __n, char_type __a)
+ {
+ for (char_type* __p = __s; __p < __s + __n; ++__p)
+ assign(*__p, __a);
+ return __s;
+ }
+
+ static char_type
+ to_char_type(const int_type& __c)
+ { return char_type(); }
+
+ static int_type
+ to_int_type(const char_type& __c) { return int_type(); }
+
+ static bool
+ eq_int_type(const int_type& __c1, const int_type& __c2)
+ { return __c1 == __c2; }
+
+ static int_type
+ eof() { return static_cast<int_type>(-1); }
+
+ static int_type
+ not_eof(const int_type& __c)
+ { return eq_int_type(__c, eof()) ? int_type(0) : __c; }
+ };
+
+ template<>
+ struct char_traits<unsigned char>
+ {
+ typedef unsigned char char_type;
+ // Unsigned as wint_t in unsigned.
+ typedef unsigned long int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_type;
+ typedef mbstate_t state_type;
+
+ static void
+ assign(char_type& __c1, const char_type& __c2)
+ { __c1 = __c2; }
+
+ static bool
+ eq(const char_type& __c1, const char_type& __c2)
+ { return __c1 == __c2; }
+
+ static bool
+ lt(const char_type& __c1, const char_type& __c2)
+ { return __c1 < __c2; }
+
+ static int
+ compare(const char_type* __s1, const char_type* __s2, size_t __n)
+ {
+ for (size_t __i = 0; __i < __n; ++__i)
+ if (!eq(__s1[__i], __s2[__i]))
+ return lt(__s1[__i], __s2[__i]) ? -1 : 1;
+ return 0;
+ }
+
+ static size_t
+ length(const char_type* __s)
+ {
+ const char_type* __p = __s;
+ while (__p && *__p)
+ ++__p;
+ return (__p - __s);
+ }
+
+ static const char_type*
+ find(const char_type* __s, size_t __n, const char_type& __a)
+ {
+ for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
+ if (*__p == __a) return __p;
+ return 0;
+ }
+
+ static char_type*
+ move(char_type* __s1, const char_type* __s2, size_t __n)
+ { return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
+
+ static char_type*
+ copy(char_type* __s1, const char_type* __s2, size_t __n)
+ { return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
+
+ static char_type*
+ assign(char_type* __s, size_t __n, char_type __a)
+ {
+ for (char_type* __p = __s; __p < __s + __n; ++__p)
+ assign(*__p, __a);
+ return __s;
+ }
+
+ static char_type
+ to_char_type(const int_type& __c)
+ { return char_type(); }
+
+ static int_type
+ to_int_type(const char_type& __c) { return int_type(); }
+
+ static bool
+ eq_int_type(const int_type& __c1, const int_type& __c2)
+ { return __c1 == __c2; }
+
+ static int_type
+ eof() { return static_cast<int_type>(-1); }
+
+ static int_type
+ not_eof(const int_type& __c)
+ { return eq_int_type(__c, eof()) ? int_type(0) : __c; }
+ };
+ } // namespace std
+
class gnu_filebuf: public std::filebuf
{
int i;
Index: testsuite/27_io/istream.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/istream.cc,v
retrieving revision 1.5
diff -c -p -r1.5 istream.cc
*** testsuite/27_io/istream.cc 26 Jul 2002 01:49:36 -0000 1.5
--- testsuite/27_io/istream.cc 31 Jul 2002 02:27:03 -0000
***************
*** 31,36 ****
--- 31,37 ----
// NB: This file is for testing istream with NO OTHER INCLUDES.
#include <istream>
+ #include <testsuite_hooks.h>
// { dg-do compile }
*************** namespace test
*** 51,56 ****
--- 52,58 ----
using namespace std;
typedef short type_t;
template class basic_istream<type_t, char_traits<type_t> >;
+ template class basic_istream<gnu_char, char_traits<gnu_char> >;
} // test
int main()
Index: testsuite/27_io/ostream.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/ostream.cc,v
retrieving revision 1.5
diff -c -p -r1.5 ostream.cc
*** testsuite/27_io/ostream.cc 26 Jul 2002 01:49:36 -0000 1.5
--- testsuite/27_io/ostream.cc 31 Jul 2002 02:27:03 -0000
***************
*** 31,36 ****
--- 31,37 ----
// NB: This file is for testing ostream with NO OTHER INCLUDES.
#include <ostream>
+ #include <testsuite_hooks.h>
// { dg-do compile }
*************** namespace test
*** 51,56 ****
--- 52,58 ----
using namespace std;
typedef short type_t;
template class basic_ostream<type_t, char_traits<type_t> >;
+ template class basic_ostream<gnu_char, char_traits<gnu_char> >;
} // test
int main()
Index: testsuite/27_io/streambuf.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/streambuf.cc,v
retrieving revision 1.12
diff -c -p -r1.12 streambuf.cc
*** testsuite/27_io/streambuf.cc 26 Jul 2002 01:49:36 -0000 1.12
--- testsuite/27_io/streambuf.cc 31 Jul 2002 02:27:03 -0000
***************
*** 31,36 ****
--- 31,37 ----
// NB: This file is for testing basic_streambuf with NO OTHER INCLUDES.
#include <streambuf>
+ #include <testsuite_hooks.h>
// { dg-do compile }
*************** namespace test
*** 51,56 ****
--- 52,58 ----
using namespace std;
typedef short type_t;
template class basic_streambuf<type_t, char_traits<type_t> >;
+ template class basic_streambuf<gnu_char, char_traits<gnu_char> >;
} // test
int main()
Index: testsuite/27_io/stringbuf.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/stringbuf.cc,v
retrieving revision 1.9
diff -c -p -r1.9 stringbuf.cc
*** testsuite/27_io/stringbuf.cc 26 Jul 2002 01:49:36 -0000 1.9
--- testsuite/27_io/stringbuf.cc 31 Jul 2002 02:27:03 -0000
***************
*** 31,36 ****
--- 31,37 ----
// NB: This file is for testing basic_stringbuf with NO OTHER INCLUDES.
#include <sstream>
+ #include <testsuite_hooks.h>
// { dg-do compile }
*************** namespace test
*** 51,56 ****
--- 52,58 ----
using namespace std;
typedef short type_t;
template class basic_stringbuf<type_t, char_traits<type_t> >;
+ template class basic_stringbuf<gnu_char, char_traits<gnu_char> >;
} // test
int main()
Index: testsuite/27_io/stringstream.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/stringstream.cc,v
retrieving revision 1.9
diff -c -p -r1.9 stringstream.cc
*** testsuite/27_io/stringstream.cc 26 Jul 2002 01:49:36 -0000 1.9
--- testsuite/27_io/stringstream.cc 31 Jul 2002 02:27:03 -0000
***************
*** 31,36 ****
--- 31,37 ----
// NB: This file is for testing basic_stringstream with NO OTHER INCLUDES.
#include <sstream>
+ #include <testsuite_hooks.h>
// { dg-do compile }
*************** namespace test
*** 51,56 ****
--- 52,58 ----
using namespace std;
typedef short type_t;
template class basic_stringstream<type_t, char_traits<type_t> >;
+ template class basic_stringstream<gnu_char, char_traits<gnu_char> >;
} // test
int main()