law@redhat.com
Benjamin Kosnik
bkoz@redhat.com
Thu Sep 25 16:40:00 GMT 2003
This fixes up the uninitialized memory bits that Jeff Law noticed here:
http://gcc.gnu.org/ml/gcc/2003-09/msg00863.html
In addition, it fixes up ctype<wchar_t>::is to work in accordance with
ISO C99. Apparently this was never working, thus the ifdef 0 bits of
that testsuite.
-benjamin
tested x86/linux
tested x86/linux --enable-clocale=generic
2003-09-24 Benjamin Kosnik <bkoz@redhat.com>
* config/locale/gnu/ctype_members.cc (ctype<wchar_t>::do_is): Fix.
* config/locale/generic/ctype_members.cc: Same.
* testsuite/22_locale/ctype/is/char/1.cc: Initialize mask.
* testsuite/22_locale/ctype/is/wchar_t/1.cc: Same.
* config/os/generic/ctype_inline.h: Update.
Index: config/locale/generic/ctype_members.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config/locale/generic/ctype_members.cc,v
retrieving revision 1.4
diff -c -p -r1.4 ctype_members.cc
*** config/locale/generic/ctype_members.cc 5 Jul 2003 04:05:30 -0000 1.4
--- config/locale/generic/ctype_members.cc 25 Sep 2003 07:15:12 -0000
***************
*** 1,6 ****
// std::ctype implementation details, generic version -*- C++ -*-
! // Copyright (C) 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
--- 1,6 ----
// std::ctype implementation details, generic version -*- C++ -*-
! // Copyright (C) 2001, 2002, 2003 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
*** 126,140 ****
bool
ctype<wchar_t>::
do_is(mask __m, char_type __c) const
! { return static_cast<bool>(iswctype(__c, _M_convert_to_wmask(__m))); }
const wchar_t*
ctype<wchar_t>::
! do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __m) const
{
! while (__lo < __hi && !this->do_is(*__m, *__lo))
! ++__lo;
! return __lo;
}
const wchar_t*
--- 126,164 ----
bool
ctype<wchar_t>::
do_is(mask __m, char_type __c) const
! {
! bool __ret = true;
! bool __match_any = false;
! const size_t __bitmasksize = 10;
! for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
! {
! mask __bit = static_cast<mask>(1 << __bitcur);
! if (__m & __bit)
! {
! __match_any = true;
! __ret &= iswctype(__c, _M_convert_to_wmask(__bit));
! }
! }
! return __ret & __match_any;
! }
const wchar_t*
ctype<wchar_t>::
! do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const
{
! for (;__lo < __hi; ++__vec, ++__lo)
! {
! const size_t __bitmasksize = 10;
! mask __m = 0;
! for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
! {
! mask __bit = static_cast<mask>(1 << __bitcur);
! if (iswctype(*__lo, _M_convert_to_wmask(__bit)))
! __m |= __bit;
! }
! *__vec = __m;
! }
! return __hi;
}
const wchar_t*
Index: config/locale/gnu/ctype_members.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config/locale/gnu/ctype_members.cc,v
retrieving revision 1.10
diff -c -p -r1.10 ctype_members.cc
*** config/locale/gnu/ctype_members.cc 5 Jul 2003 04:05:30 -0000 1.10
--- config/locale/gnu/ctype_members.cc 25 Sep 2003 07:15:12 -0000
***************
*** 1,6 ****
// std::ctype implementation details, GNU version -*- C++ -*-
! // Copyright (C) 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
--- 1,6 ----
// std::ctype implementation details, GNU version -*- C++ -*-
! // Copyright (C) 2001, 2002, 2003 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
*** 129,147 ****
bool
ctype<wchar_t>::
! do_is(mask __m, char_type __c) const
{
! return static_cast<bool>(__iswctype_l(__c, _M_convert_to_wmask(__m),
! _M_c_locale_ctype));
}
const wchar_t*
ctype<wchar_t>::
! do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __m) const
{
! while (__lo < __hi && !this->do_is(*__m, *__lo))
! ++__lo;
! return __lo;
}
const wchar_t*
--- 129,174 ----
bool
ctype<wchar_t>::
! do_is(mask __m, wchar_t __c) const
{
! // Highest bitmask in ctype_base == 10, but extra in "C"
! // library for blank.
! bool __ret = true;
! bool __match_any = false;
! const size_t __bitmasksize = 11;
! for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
! {
! mask __bit = static_cast<mask>(_ISbit(__bitcur));
! if (__m & __bit)
! {
! __match_any = true;
! __ret &= __iswctype_l(__c, _M_convert_to_wmask(__bit),
! _M_c_locale_ctype);
! }
! }
! return __ret & __match_any;
}
const wchar_t*
ctype<wchar_t>::
! do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const
{
! for (;__lo < __hi; ++__vec, ++__lo)
! {
! // Highest bitmask in ctype_base == 10, but extra in "C"
! // library for blank.
! const size_t __bitmasksize = 11;
! mask __m = 0;
! for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
! {
! mask __bit = static_cast<mask>(_ISbit(__bitcur));
! if (__iswctype_l(*__lo, _M_convert_to_wmask(__bit),
! _M_c_locale_ctype))
! __m |= __bit;
! }
! *__vec = __m;
! }
! return __hi;
}
const wchar_t*
Index: config/os/generic/ctype_inline.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config/os/generic/ctype_inline.h,v
retrieving revision 1.2
diff -c -p -r1.2 ctype_inline.h
*** config/os/generic/ctype_inline.h 15 Apr 2003 06:36:26 -0000 1.2
--- config/os/generic/ctype_inline.h 25 Sep 2003 07:15:12 -0000
***************
*** 50,62 ****
else
{
bool __ret = true;
! const int __bitmasksize = 11;
! int __bitcur = 0; // Lowest bitmask in ctype_base == 0
! for (;__ret && __bitcur < __bitmasksize; ++__bitcur)
{
mask __bit = static_cast<mask>(1 << __bitcur);
if (__m & __bit)
{
bool __testis;
switch (__bit)
{
--- 50,64 ----
else
{
bool __ret = true;
! bool __any_match = false;
! const size_t __bitmasksize = 10;
! size_t __bitcur = 0; // Lowest bitmask in ctype_base == 0
! for (;__ret && __bitcur <= __bitmasksize; ++__bitcur)
{
mask __bit = static_cast<mask>(1 << __bitcur);
if (__m & __bit)
{
+ __any_match = true;
bool __testis;
switch (__bit)
{
***************
*** 100,106 ****
__ret &= __testis;
}
}
! return __ret;
}
}
--- 102,108 ----
__ret &= __testis;
}
}
! return __ret & __any_match;
}
}
***************
*** 114,126 ****
else
{
// Highest bitmask in ctype_base == 10.
! const int __bitmasksize = 11;
for (;__low < __high; ++__vec, ++__low)
{
mask __m = 0;
// Lowest bitmask in ctype_base == 0
! int __i = 0;
! for (;__i < __bitmasksize; ++__i)
{
mask __bit = static_cast<mask>(1 << __i);
if (this->is(__bit, *__low))
--- 116,128 ----
else
{
// Highest bitmask in ctype_base == 10.
! const size_t __bitmasksize = 10;
for (;__low < __high; ++__vec, ++__low)
{
mask __m = 0;
// Lowest bitmask in ctype_base == 0
! size_t __i = 0;
! for (;__i <= __bitmasksize; ++__i)
{
mask __bit = static_cast<mask>(1 << __i);
if (this->is(__bit, *__low))
Index: testsuite/22_locale/ctype/is/char/1.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/22_locale/ctype/is/char/1.cc,v
retrieving revision 1.2
diff -c -p -r1.2 1.cc
*** testsuite/22_locale/ctype/is/char/1.cc 23 Sep 2003 20:02:20 -0000 1.2
--- testsuite/22_locale/ctype/is/char/1.cc 25 Sep 2003 07:15:14 -0000
*************** void test01()
*** 97,105 ****
const char_type* cc2 = NULL;
cc0 = strlit00;
! m01[0] = m00;
! m01[1] = m00;
! m01[2] = m00;
cc1 = gctype.is(cc0, cc0, m01);
VERIFY( cc1 == strlit00 );
VERIFY( m01[0] == m00 );
--- 97,104 ----
const char_type* cc2 = NULL;
cc0 = strlit00;
! for (std::size_t i = 0; i < 3; ++i)
! m01[i] = m00;
cc1 = gctype.is(cc0, cc0, m01);
VERIFY( cc1 == strlit00 );
VERIFY( m01[0] == m00 );
*************** void test01()
*** 107,115 ****
VERIFY( m01[2] == m00 );
cc0 = strlit00;
! m01[0] = m00;
! m01[1] = m00;
! m01[2] = m00;
cc2 = gctype.is(cc0, cc0 + 3, m01);
VERIFY( cc2 == strlit00 + 3);
VERIFY( m01[0] != m00 );
--- 106,113 ----
VERIFY( m01[2] == m00 );
cc0 = strlit00;
! for (std::size_t i = 0; i < 3; ++i)
! m01[i] = m00;
cc2 = gctype.is(cc0, cc0 + 3, m01);
VERIFY( cc2 == strlit00 + 3);
VERIFY( m01[0] != m00 );
*************** void test01()
*** 120,125 ****
--- 118,125 ----
VERIFY( gctype.is(m01[2], cc0[2]) );
cc0 = strlit01;
+ for (std::size_t i = 0; i < 13; ++i)
+ m02[i] = m00;
cc1 = gctype.is(cc0, cc0 + 13, m02);
VERIFY( cc1 == strlit01 + 13);
VERIFY( m02[6] != m00 );
Index: testsuite/22_locale/ctype/is/wchar_t/1.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/22_locale/ctype/is/wchar_t/1.cc,v
retrieving revision 1.2
diff -c -p -r1.2 1.cc
*** testsuite/22_locale/ctype/is/wchar_t/1.cc 23 Sep 2003 20:02:21 -0000 1.2
--- testsuite/22_locale/ctype/is/wchar_t/1.cc 25 Sep 2003 07:15:14 -0000
*************** void test01()
*** 94,123 ****
std::ctype_base::mask m02[13];
const char_type* cc0 = strlit00;
const char_type* cc1 = NULL;
cc0 = strlit00;
! m01[0] = m00;
! m01[1] = m00;
! m01[2] = m00;
cc1 = gctype.is(cc0, cc0, m01);
VERIFY( cc1 == strlit00 );
VERIFY( m01[0] == m00 );
VERIFY( m01[1] == m00 );
VERIFY( m01[2] == m00 );
! #if 0
VERIFY( m01[0] != m00 );
VERIFY( m01[1] != m00 );
VERIFY( m01[2] != m00 );
VERIFY( gctype.is(m01[0], cc0[0]) );
VERIFY( gctype.is(m01[1], cc0[1]) );
VERIFY( gctype.is(m01[2], cc0[2]) );
- #endif
cc0 = strlit01;
cc1 = gctype.is(cc0, cc0 + 13, m02);
VERIFY( cc1 == strlit01 + 13);
- #if 0
VERIFY( m02[6] != m00 );
VERIFY( m02[7] != m00 );
VERIFY( m02[8] != m00 );
--- 94,127 ----
std::ctype_base::mask m02[13];
const char_type* cc0 = strlit00;
const char_type* cc1 = NULL;
+ const char_type* cc2 = NULL;
cc0 = strlit00;
! for (std::size_t i = 0; i < 3; ++i)
! m01[i] = m00;
cc1 = gctype.is(cc0, cc0, m01);
VERIFY( cc1 == strlit00 );
VERIFY( m01[0] == m00 );
VERIFY( m01[1] == m00 );
VERIFY( m01[2] == m00 );
! cc0 = strlit00;
! for (std::size_t i = 0; i < 3; ++i)
! m01[i] = m00;
! cc2 = gctype.is(cc0, cc0 + 3, m01);
! VERIFY( cc2 == strlit00 + 3);
VERIFY( m01[0] != m00 );
VERIFY( m01[1] != m00 );
VERIFY( m01[2] != m00 );
VERIFY( gctype.is(m01[0], cc0[0]) );
VERIFY( gctype.is(m01[1], cc0[1]) );
VERIFY( gctype.is(m01[2], cc0[2]) );
cc0 = strlit01;
+ for (std::size_t i = 0; i < 13; ++i)
+ m02[i] = m00;
cc1 = gctype.is(cc0, cc0 + 13, m02);
VERIFY( cc1 == strlit01 + 13);
VERIFY( m02[6] != m00 );
VERIFY( m02[7] != m00 );
VERIFY( m02[8] != m00 );
*************** void test01()
*** 131,137 ****
VERIFY( gctype.is(m02[6], cc0[6]) );
VERIFY( gctype.is(m02[7], cc0[7]) );
VERIFY( gctype.is(m02[8], cc0[8]) );
- #endif
}
int main()
--- 135,140 ----
More information about the Gcc-patches
mailing list