From b0649028b4627e6e5e2eb9fd999be8a67da65566 Mon Sep 17 00:00:00 2001 From: "Loren J. Rittle" Date: Tue, 11 Mar 2003 07:07:25 +0000 Subject: [PATCH] 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 --- libstdc++-v3/ChangeLog | 4 ++ .../config/os/bsd/freebsd/ctype_inline.h | 72 +++++++++++-------- .../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 9689c582f78..f66c6e40d88 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,9 @@ 2003-03-11 Loren J. Rittle + * 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 b4ba03f30f5..d69324ad572 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:: is(mask __m, char __c) const { - return __istype(__c, __m); + if (_M_table) + return _M_table[static_cast(__c)] & __m; + else + return __istype(__c, __m); } const char* ctype:: 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(*__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:: 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(*__low)] & __m)) + ++__low; + else + while (__low < __high && !this->is(__m, *__low)) + ++__low; return __low; } @@ -83,12 +95,12 @@ ctype:: 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(*__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 65fc62667d5..5ad3877cfd8 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() -- 2.30.2