diff options
author | Loren J. Rittle <ljrittle@acm.org> | 2003-03-11 07:07:25 +0000 |
---|---|---|
committer | Loren J. Rittle <ljrittle@gcc.gnu.org> | 2003-03-11 07:07:25 +0000 |
commit | b0649028b4627e6e5e2eb9fd999be8a67da65566 (patch) | |
tree | a0727aa953187193ceff6df4027bee0b2f1ff9ab | |
parent | cb60f38d5b06fd610dbf5216d8751f8db0274edd (diff) | |
download | gcc-b0649028b4627e6e5e2eb9fd999be8a67da65566.zip gcc-b0649028b4627e6e5e2eb9fd999be8a67da65566.tar.gz gcc-b0649028b4627e6e5e2eb9fd999be8a67da65566.tar.bz2 |
ctype_inline.h: Support _M_table when so installed.
* config/os/bsd/freebsd/ctype_inline.h: Support _M_table
when so installed.
* testsuite/22_locale/ctype/cons/char/1.cc: Fix typo.
From-SVN: r64163
-rw-r--r-- | libstdc++-v3/ChangeLog | 4 | ||||
-rw-r--r-- | libstdc++-v3/config/os/bsd/freebsd/ctype_inline.h | 72 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/22_locale/ctype/cons/char/1.cc | 2 |
3 files changed, 47 insertions, 31 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 9689c58..f66c6e4 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,9 @@ 2003-03-11 Loren J. Rittle <ljrittle@acm.org> + * config/os/bsd/freebsd/ctype_inline.h: Support _M_table + when so installed. + * testsuite/22_locale/ctype/cons/char/1.cc: Fix typo. + * testsuite/testsuite_hooks.h (run_tests_wrapped_env): Do not report lack of setenv(). diff --git a/libstdc++-v3/config/os/bsd/freebsd/ctype_inline.h b/libstdc++-v3/config/os/bsd/freebsd/ctype_inline.h index b4ba03f..d69324a 100644 --- a/libstdc++-v3/config/os/bsd/freebsd/ctype_inline.h +++ b/libstdc++-v3/config/os/bsd/freebsd/ctype_inline.h @@ -1,6 +1,6 @@ // Locale support -*- C++ -*- -// Copyright (C) 2000 Free Software Foundation, Inc. +// 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,35 +38,42 @@ ctype<char>:: is(mask __m, char __c) const { - return __istype(__c, __m); + 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 { - for (;__low < __high; ++__vec, ++__low) - { + 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); + *__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; + 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,8 +81,13 @@ ctype<char>:: scan_is(mask __m, const char* __low, const char* __high) const { - while (__low < __high && !this->is(__m, *__low)) - ++__low; + 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,12 +95,12 @@ ctype<char>:: scan_not(mask __m, const char* __low, const char* __high) const { - while (__low < __high && this->is(__m, *__low) != 0) - ++__low; + 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; } - - - - - diff --git a/libstdc++-v3/testsuite/22_locale/ctype/cons/char/1.cc b/libstdc++-v3/testsuite/22_locale/ctype/cons/char/1.cc index 65fc626..5ad3877 100644 --- a/libstdc++-v3/testsuite/22_locale/ctype/cons/char/1.cc +++ b/libstdc++-v3/testsuite/22_locale/ctype/cons/char/1.cc @@ -57,7 +57,7 @@ void test01() comma_ctype obj2(tmp); const ctype_base::mask* ctable = obj2.get_table(); - VERIFY ( tmp = ctable ); + VERIFY ( tmp == ctable ); } int main() |