Update.
authorUlrich Drepper <drepper@redhat.com>
Tue, 4 Jul 2000 21:32:15 +0000 (21:32 +0000)
committerUlrich Drepper <drepper@redhat.com>
Tue, 4 Jul 2000 21:32:15 +0000 (21:32 +0000)
* posix/fnmatch_loop.c: Improve performance for single-byte
character sets by not using btowc.

ChangeLog
posix/fnmatch_loop.c

index fd4f79401b18b9969714a5f97c6a092995f9af05..1dc63d3ba021aa74ebf2ce9770aa8a7717368399 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2000-07-04  Ulrich Drepper  <drepper@redhat.com>
 
+       * posix/fnmatch_loop.c: Improve performance for single-byte
+       character sets by not using btowc.
+
        * posix/tst-fnmatch.input: Add tests for locale dependent
        behaviour.
        * posix/tst-fnmatch.c (main): Also set LC_CTYPE category.
index 3a6dffb1e42e090abcd06ae0d69f50ce21833755..ad729d2d8f8c0c039d513eb74659867bc565e360 100644 (file)
@@ -256,8 +256,35 @@ FCT (pattern, string, no_leading_period, flags)
                      /* Invalid character class name.  */
                      return FNM_NOMATCH;
 
-                   if (ISWCTYPE (BTOWC ((UCHAR) *n), wt))
-                     goto matched;
+                   /* 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)
+                     {
+                       wt >>= 16;
+                       if ((__ctype_b[(UCHAR) *n] & wt) != 0)
+                         goto matched;
+                     }
+#  else
+                   if (wt <= 0x800)
+                     {
+                       if ((__ctype_b[(UCHAR) *n] & wt) != 0)
+                         goto matched;
+                     }
+#  endif
+                   else
+# 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))