]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ctype_inline.h: Support _M_table when so installed.
authorLoren J. Rittle <ljrittle@acm.org>
Tue, 11 Mar 2003 07:07:25 +0000 (07:07 +0000)
committerLoren J. Rittle <ljrittle@gcc.gnu.org>
Tue, 11 Mar 2003 07:07:25 +0000 (07:07 +0000)
* 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
libstdc++-v3/config/os/bsd/freebsd/ctype_inline.h
libstdc++-v3/testsuite/22_locale/ctype/cons/char/1.cc

index 9689c582f78fee41d0a69e9f3e8cd30024352d67..f66c6e40d8847b1941dc61ac92cc9042be541165 100644 (file)
@@ -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().
 
index b4ba03f30f5f6db75db8bc38af663ab628053465..d69324ad572039e96c538d0b8a11580f0d6626a2 100644 (file)
@@ -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
   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;
   }
 
   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;
   }
 
   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;
   }
-
-
-
-
-
index 65fc62667d5ac5c7b1bc2e4484ecab10b199c510..5ad3877cfd8c227261b8636ac5252d5192107651 100644 (file)
@@ -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()