PATCH (libstdc++-v3, 3.3): Fix unconditional non-usage of installed _M_table
Loren James Rittle
rittle@latour.rsch.comm.mot.com
Fri Apr 18 10:35:00 GMT 2003
On *-*-freebsd*, this patch fixes:
FAIL: 22_locale/ctype/is/char/3.cc execution test (which is only on mainline)
As committed to 3.3 branch:
* config/os/bsd/freebsd/ctype_inline.h: Support _M_table
when so installed.
Index: config/os/bsd/freebsd/ctype_inline.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config/os/bsd/freebsd/ctype_inline.h,v
retrieving revision 1.1
diff -c -r1.1 ctype_inline.h
*** config/os/bsd/freebsd/ctype_inline.h 24 Jun 2002 05:48:49 -0000 1.1
--- config/os/bsd/freebsd/ctype_inline.h 18 Apr 2003 10:12:08 -0000
***************
*** 1,6 ****
// Locale support -*- C++ -*-
! // Copyright (C) 2000 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 ----
// Locale support -*- C++ -*-
! // Copyright (C) 2000, 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
***************
*** 38,72 ****
ctype<char>::
is(mask __m, char __c) const
{
! return __istype(__c, __m);
}
const char*
ctype<char>::
is(const char* __low, const char* __high, mask* __vec) const
{
! for (;__low < __high; ++__vec, ++__low)
! {
#if defined (_CTYPE_S) || defined (__istype)
! *__vec = __maskrune (*__low, upper | lower | alpha | digit | xdigit
! | space | print | graph | cntrl | punct | alnum);
#else
! mask __m = 0;
! if (this->is(upper, *__low)) __m |= upper;
! if (this->is(lower, *__low)) __m |= lower;
! if (this->is(alpha, *__low)) __m |= alpha;
! if (this->is(digit, *__low)) __m |= digit;
! if (this->is(xdigit, *__low)) __m |= xdigit;
! if (this->is(space, *__low)) __m |= space;
! if (this->is(print, *__low)) __m |= print;
! if (this->is(graph, *__low)) __m |= graph;
! if (this->is(cntrl, *__low)) __m |= cntrl;
! if (this->is(punct, *__low)) __m |= punct;
! // Do not include explicit line for alnum mask since it is a
! // pure composite of masks on FreeBSD.
! *__vec = __m;
#endif
! }
return __high;
}
--- 38,79 ----
ctype<char>::
is(mask __m, char __c) const
{
! if (_M_table)
! return _M_table[static_cast<unsigned char>(__c)] & __m;
! else
! return __istype(__c, __m);
}
const char*
ctype<char>::
is(const char* __low, const char* __high, mask* __vec) const
{
! if (_M_table)
! while (__low < __high)
! *__vec++ = _M_table[static_cast<unsigned char>(*__low++)];
! else
! for (;__low < __high; ++__vec, ++__low)
! {
#if defined (_CTYPE_S) || defined (__istype)
! *__vec = __maskrune (*__low, upper | lower | alpha | digit | xdigit
! | space | print | graph | cntrl | punct | alnum);
#else
! mask __m = 0;
! if (this->is(upper, *__low)) __m |= upper;
! if (this->is(lower, *__low)) __m |= lower;
! if (this->is(alpha, *__low)) __m |= alpha;
! if (this->is(digit, *__low)) __m |= digit;
! if (this->is(xdigit, *__low)) __m |= xdigit;
! if (this->is(space, *__low)) __m |= space;
! if (this->is(print, *__low)) __m |= print;
! if (this->is(graph, *__low)) __m |= graph;
! if (this->is(cntrl, *__low)) __m |= cntrl;
! if (this->is(punct, *__low)) __m |= punct;
! // Do not include explicit line for alnum mask since it is a
! // pure composite of masks on FreeBSD.
! *__vec = __m;
#endif
! }
return __high;
}
***************
*** 74,81 ****
ctype<char>::
scan_is(mask __m, const char* __low, const char* __high) const
{
! while (__low < __high && !this->is(__m, *__low))
! ++__low;
return __low;
}
--- 81,93 ----
ctype<char>::
scan_is(mask __m, const char* __low, const char* __high) const
{
! if (_M_table)
! while (__low < __high
! && !(_M_table[static_cast<unsigned char>(*__low)] & __m))
! ++__low;
! else
! while (__low < __high && !this->is(__m, *__low))
! ++__low;
return __low;
}
***************
*** 83,94 ****
ctype<char>::
scan_not(mask __m, const char* __low, const char* __high) const
{
! while (__low < __high && this->is(__m, *__low) != 0)
! ++__low;
return __low;
}
-
-
-
-
-
--- 95,106 ----
ctype<char>::
scan_not(mask __m, const char* __low, const char* __high) const
{
! if (_M_table)
! while (__low < __high
! && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0)
! ++__low;
! else
! while (__low < __high && this->is(__m, *__low) != 0)
! ++__low;
return __low;
}
More information about the Gcc-patches
mailing list