(internal_fnmatch): Use it, support new LC_CTYPE locale format.
authordrepper <drepper>
Tue, 1 Aug 2000 23:44:05 +0000 (23:44 +0000)
committerdrepper <drepper>
Tue, 1 Aug 2000 23:44:05 +0000 (23:44 +0000)
posix/fnmatch_loop.c

index 38cb8f1..86526a1 100644 (file)
@@ -256,35 +256,41 @@ FCT (pattern, string, no_leading_period, flags)
                      /* Invalid character class name.  */
                      return FNM_NOMATCH;
 
-                   /* The following code is glibc specific but does
-                      there a good job in sppeding up the code since
-                      we can avoid the btowc() call.  The
-                      IS_CHAR_CLASS call will return a bit mask for
-                      the 32-bit table.  We have to convert it to a
-                      bitmask for the __ctype_b table.  This has to
-                      be done based on the byteorder as can be seen
-                      below.  In any case we will fall back on the
-                      code using btowc() if the class is not one of
-                      the standard classes.  */
 # if defined _LIBC && ! WIDE_CHAR_VERSION
-#  if __BYTE_ORDER == __LITTLE_ENDIAN
-                   if ((wt & 0xf0ffff) == 0)
+                   /* The following code is glibc specific but does
+                      there a good job in speeding up the code since
+                      we can avoid the btowc() call.  */
+                   if (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_HASH_SIZE) != 0)
                      {
-                       wt >>= 16;
-                       if ((__ctype_b[(UCHAR) *n] & wt) != 0)
-                         goto matched;
-                     }
+                       /* Old locale format.  */
+#  if __BYTE_ORDER == __LITTLE_ENDIAN
+                       if ((wt & 0xf0ffff) == 0)
+                         {
+                           wt >>= 16;
+                           if ((__ctype_b[(UCHAR) *n] & wt) != 0)
+                             goto matched;
+                         }
 #  else
-                   if (wt <= 0x800)
+                       if (wt <= 0x800)
+                         {
+                           if ((__ctype_b[(UCHAR) *n] & wt) != 0)
+                             goto matched;
+                         }
+#  endif
+                       else
+                         if (ISWCTYPE (BTOWC ((UCHAR) *n), wt))
+                           goto matched;
+                     }
+                   else
                      {
-                       if ((__ctype_b[(UCHAR) *n] & wt) != 0)
+                       /* New locale format.  */
+                       if (_ISCTYPE ((UCHAR) *n, wt))
                          goto matched;
                      }
-#  endif
-                   else
+# else
+                   if (ISWCTYPE (BTOWC ((UCHAR) *n), wt))
+                     goto matched;
 # endif
-                     if (ISWCTYPE (BTOWC ((UCHAR) *n), wt))
-                       goto matched;
 #else
                    if ((STREQ (str, L("alnum")) && ISALNUM ((UCHAR) *n))
                        || (STREQ (str, L("alpha")) && ISALPHA ((UCHAR) *n))