Imported from ../bash-3.1.tar.gz.
[platform/upstream/bash.git] / lib / glob / smatch.c
index 8c54702..12fde3d 100644 (file)
@@ -1,7 +1,7 @@
 /* strmatch.c -- ksh-like extended pattern matching for the shell and filename
                globbing. */
 
-/* Copyright (C) 1991-2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991-2005 Free Software Foundation, Inc.
 
    This file is part of GNU Bash, the Bourne Again SHell.
    
@@ -93,14 +93,16 @@ collequiv (c1, c2)
 
 static int
 collsym (s, len)
-     char *s;
+     CHAR *s;
      int len;
 {
   register struct _collsym *csp;
+  char *x;
 
+  x = (char *)s;
   for (csp = posix_collsyms; csp->name; csp++)
     {
-      if (STREQN(csp->name, s, len) && csp->name[len] == '\0')
+      if (STREQN(csp->name, x, len) && csp->name[len] == '\0')
        return (csp->code);
     }
   if (len == 1)
@@ -362,44 +364,25 @@ xstrmatch (pattern, string, flags)
 {
 #if HANDLE_MULTIBYTE
   int ret;
-  mbstate_t ps;
   size_t n;
-  char *pattern_bak;
   wchar_t *wpattern, *wstring;
 
   if (MB_CUR_MAX == 1)
-    return (internal_strmatch (pattern, string, flags));
+    return (internal_strmatch ((unsigned char *)pattern, (unsigned char *)string, flags));
 
-  pattern_bak = (char *)xmalloc (strlen (pattern) + 1);
-  strcpy (pattern_bak, pattern);
-
-  memset (&ps, '\0', sizeof (mbstate_t));
-  n = xmbsrtowcs (NULL, (const char **)&pattern, 0, &ps);
+  n = xdupmbstowcs (&wpattern, NULL, pattern);
   if (n == (size_t)-1 || n == (size_t)-2)
-    {
-      free (pattern_bak);
-      return (internal_strmatch ((unsigned char *)pattern, (unsigned char *)string, flags));
-    }
+    return (internal_strmatch ((unsigned char *)pattern, (unsigned char *)string, flags));
 
-  wpattern = (wchar_t *)xmalloc ((n + 1) * sizeof (wchar_t));
-  (void) xmbsrtowcs (wpattern, (const char **)&pattern, n + 1, &ps);
-
-  memset (&ps, '\0', sizeof (mbstate_t));
-  n = xmbsrtowcs (NULL, (const char **)&string, 0, &ps);
+  n = xdupmbstowcs (&wstring, NULL, string);
   if (n == (size_t)-1 || n == (size_t)-2)
     {
       free (wpattern);
-      ret = internal_strmatch (pattern_bak, string, flags);
-      free (pattern_bak);
-      return ret;
+      return (internal_strmatch ((unsigned char *)pattern, (unsigned char *)string, flags));
     }
 
-  wstring = (wchar_t *)xmalloc ((n + 1) * sizeof (wchar_t));
-  (void) xmbsrtowcs (wstring, (const char **)&string, n + 1, &ps);
-
   ret = internal_wstrmatch (wpattern, wstring, flags);
 
-  free (pattern_bak);
   free (wpattern);
   free (wstring);