about summary refs log tree commit diff
path: root/posix/fnmatch_loop.c
diff options
context:
space:
mode:
Diffstat (limited to 'posix/fnmatch_loop.c')
-rw-r--r--posix/fnmatch_loop.c50
1 files changed, 28 insertions, 22 deletions
diff --git a/posix/fnmatch_loop.c b/posix/fnmatch_loop.c
index 38cb8f1d76..86526a15ff 100644
--- a/posix/fnmatch_loop.c
+++ b/posix/fnmatch_loop.c
@@ -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))