diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index d7d22224c09..cd6d447813f 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2003-09-25 Benjamin Kosnik + + * config/locale/gnu/ctype_members.cc (ctype::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. + 2003-09-25 Ulrich Weigand * src/Makefile.am (version_dep): New variable. diff --git a/libstdc++-v3/config/locale/generic/c_locale.h b/libstdc++-v3/config/locale/generic/c_locale.h index 8e2072a75b3..c20b98ba24d 100644 --- a/libstdc++-v3/config/locale/generic/c_locale.h +++ b/libstdc++-v3/config/locale/generic/c_locale.h @@ -56,7 +56,7 @@ namespace std template int __convert_from_v(char* __out, - const int __size __attribute__ ((__unused__)), + const int __size __attribute__((__unused__)), const char* __fmt, _Tv __v, const __c_locale&, int __prec = -1) { diff --git a/libstdc++-v3/config/locale/generic/ctype_members.cc b/libstdc++-v3/config/locale/generic/ctype_members.cc index 2035cd8c4f4..814672a4a1e 100644 --- a/libstdc++-v3/config/locale/generic/ctype_members.cc +++ b/libstdc++-v3/config/locale/generic/ctype_members.cc @@ -1,6 +1,6 @@ // std::ctype implementation details, generic version -*- C++ -*- -// Copyright (C) 2001, 2002 Free Software Foundation, Inc. +// 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 @@ -126,15 +126,39 @@ namespace std bool ctype:: do_is(mask __m, char_type __c) const - { return static_cast(iswctype(__c, _M_convert_to_wmask(__m))); } + { + bool __ret = true; + bool __match_any = false; + const size_t __bitmasksize = 10; + for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) + { + mask __bit = static_cast(1 << __bitcur); + if (__m & __bit) + { + __match_any = true; + __ret &= iswctype(__c, _M_convert_to_wmask(__bit)); + } + } + return __ret & __match_any; + } const wchar_t* ctype:: - do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __m) const + do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const { - while (__lo < __hi && !this->do_is(*__m, *__lo)) - ++__lo; - return __lo; + 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(1 << __bitcur); + if (iswctype(*__lo, _M_convert_to_wmask(__bit))) + __m |= __bit; + } + *__vec = __m; + } + return __hi; } const wchar_t* diff --git a/libstdc++-v3/config/locale/gnu/ctype_members.cc b/libstdc++-v3/config/locale/gnu/ctype_members.cc index 142040c9d12..7ab4f196cb8 100644 --- a/libstdc++-v3/config/locale/gnu/ctype_members.cc +++ b/libstdc++-v3/config/locale/gnu/ctype_members.cc @@ -1,6 +1,6 @@ // std::ctype implementation details, GNU version -*- C++ -*- -// Copyright (C) 2001, 2002 Free Software Foundation, Inc. +// 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 @@ -129,19 +129,46 @@ namespace std bool ctype:: - do_is(mask __m, char_type __c) const + do_is(mask __m, wchar_t __c) const { - return static_cast(__iswctype_l(__c, _M_convert_to_wmask(__m), - _M_c_locale_ctype)); + // 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(_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:: - do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __m) const + do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const { - while (__lo < __hi && !this->do_is(*__m, *__lo)) - ++__lo; - return __lo; + 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(_ISbit(__bitcur)); + if (__iswctype_l(*__lo, _M_convert_to_wmask(__bit), + _M_c_locale_ctype)) + __m |= __bit; + } + *__vec = __m; + } + return __hi; } const wchar_t* diff --git a/libstdc++-v3/config/os/generic/ctype_inline.h b/libstdc++-v3/config/os/generic/ctype_inline.h index be43c47fd0a..0da0c7ccfb5 100644 --- a/libstdc++-v3/config/os/generic/ctype_inline.h +++ b/libstdc++-v3/config/os/generic/ctype_inline.h @@ -50,13 +50,15 @@ else { bool __ret = true; - const int __bitmasksize = 11; - int __bitcur = 0; // Lowest bitmask in ctype_base == 0 - for (;__ret && __bitcur < __bitmasksize; ++__bitcur) + 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(1 << __bitcur); if (__m & __bit) { + __any_match = true; bool __testis; switch (__bit) { @@ -100,7 +102,7 @@ __ret &= __testis; } } - return __ret; + return __ret & __any_match; } } @@ -114,13 +116,13 @@ else { // Highest bitmask in ctype_base == 10. - const int __bitmasksize = 11; + const size_t __bitmasksize = 10; for (;__low < __high; ++__vec, ++__low) { mask __m = 0; // Lowest bitmask in ctype_base == 0 - int __i = 0; - for (;__i < __bitmasksize; ++__i) + size_t __i = 0; + for (;__i <= __bitmasksize; ++__i) { mask __bit = static_cast(1 << __i); if (this->is(__bit, *__low)) diff --git a/libstdc++-v3/testsuite/22_locale/ctype/is/char/1.cc b/libstdc++-v3/testsuite/22_locale/ctype/is/char/1.cc index 523044f6d32..4900665eb55 100644 --- a/libstdc++-v3/testsuite/22_locale/ctype/is/char/1.cc +++ b/libstdc++-v3/testsuite/22_locale/ctype/is/char/1.cc @@ -97,9 +97,8 @@ void test01() const char_type* cc2 = NULL; cc0 = strlit00; - m01[0] = m00; - m01[1] = m00; - m01[2] = m00; + 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 ); @@ -107,9 +106,8 @@ void test01() VERIFY( m01[2] == m00 ); cc0 = strlit00; - m01[0] = m00; - m01[1] = m00; - m01[2] = m00; + 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 ); @@ -120,6 +118,8 @@ void test01() 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 ); diff --git a/libstdc++-v3/testsuite/22_locale/ctype/is/wchar_t/1.cc b/libstdc++-v3/testsuite/22_locale/ctype/is/wchar_t/1.cc index 29fdfe97c7e..48cd849d622 100644 --- a/libstdc++-v3/testsuite/22_locale/ctype/is/wchar_t/1.cc +++ b/libstdc++-v3/testsuite/22_locale/ctype/is/wchar_t/1.cc @@ -94,30 +94,34 @@ void test01() std::ctype_base::mask m02[13]; const char_type* cc0 = strlit00; const char_type* cc1 = NULL; + const char_type* cc2 = NULL; cc0 = strlit00; - m01[0] = m00; - m01[1] = m00; - m01[2] = m00; + 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 ); -#if 0 + 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]) ); -#endif 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); -#if 0 VERIFY( m02[6] != m00 ); VERIFY( m02[7] != m00 ); VERIFY( m02[8] != m00 ); @@ -131,7 +135,6 @@ void test01() VERIFY( gctype.is(m02[6], cc0[6]) ); VERIFY( gctype.is(m02[7], cc0[7]) ); VERIFY( gctype.is(m02[8], cc0[8]) ); -#endif } int main()