patches/glibc/ports-2.12.1/370-fnmatch.patch
author Michael Hope <michael.hope@linaro.org>
Wed Oct 19 15:27:32 2011 +1300 (2011-10-19)
changeset 2739 f320e22f2cba
permissions -rw-r--r--
arch: add softfp support

Some architectures support a mixed hard/soft floating point, where
the compiler emits hardware floating point instructions, but passes
the operands in core (aka integer) registers.

For example, ARM supports this mode (to come in the next changeset).

Add support for softfp cross compilers to the GCC and GLIBC
configuration. Needed for Ubuntu and other distros that are softfp.

Signed-off-by: Michael Hope <michael.hope@linaro.org>
[yann.morin.1998@anciens.enib.fr: split the original patch]
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
yann@2437
     1
http://sourceware.org/ml/libc-hacker/2002-11/msg00071.html
yann@2437
     2
yann@2437
     3
When fnmatch detects an invalid multibyte character it should fall back to
yann@2437
     4
single byte matching, so that "*" has a chance to match such a string.
yann@2437
     5
yann@2437
     6
Andreas.
yann@2437
     7
yann@2437
     8
2005-04-12  Andreas Schwab  <schwab@suse.de>
yann@2437
     9
yann@2437
    10
	* posix/fnmatch.c (fnmatch): If conversion to wide character
yann@2437
    11
	fails fall back to single byte matching.
yann@2437
    12
yann@2437
    13
Index: posix/fnmatch.c
yann@2437
    14
===================================================================
yann@2437
    15
yann@2437
    16
diff -durN glibc-2.12.1.orig/posix/fnmatch.c glibc-2.12.1/posix/fnmatch.c
yann@2437
    17
--- glibc-2.12.1.orig/posix/fnmatch.c	2007-07-28 22:35:00.000000000 +0200
yann@2437
    18
+++ glibc-2.12.1/posix/fnmatch.c	2009-11-13 00:50:39.000000000 +0100
yann@2437
    19
@@ -327,6 +327,7 @@
yann@2437
    20
 # if HANDLE_MULTIBYTE
yann@2437
    21
   if (__builtin_expect (MB_CUR_MAX, 1) != 1)
yann@2437
    22
     {
yann@2437
    23
+      const char *orig_pattern = pattern;
yann@2437
    24
       mbstate_t ps;
yann@2437
    25
       size_t n;
yann@2437
    26
       const char *p;
yann@2437
    27
@@ -382,10 +383,8 @@
yann@2437
    28
 	  wstring = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t));
yann@2437
    29
 	  n = mbsrtowcs (wstring, &p, n + 1, &ps);
yann@2437
    30
 	  if (__builtin_expect (n == (size_t) -1, 0))
yann@2437
    31
-	    /* Something wrong.
yann@2437
    32
-	       XXX Do we have to set `errno' to something which mbsrtows hasn't
yann@2437
    33
-	       already done?  */
yann@2437
    34
-	    return -1;
yann@2437
    35
+	    /* Something wrong.  Fall back to single byte matching.  */
yann@2437
    36
+	    goto try_singlebyte;
yann@2437
    37
 	  if (p)
yann@2437
    38
 	    {
yann@2437
    39
 	      memset (&ps, '\0', sizeof (ps));
yann@2437
    40
@@ -397,10 +396,8 @@
yann@2437
    41
 	prepare_wstring:
yann@2437
    42
 	  n = mbsrtowcs (NULL, &string, 0, &ps);
yann@2437
    43
 	  if (__builtin_expect (n == (size_t) -1, 0))
yann@2437
    44
-	    /* Something wrong.
yann@2437
    45
-	       XXX Do we have to set `errno' to something which mbsrtows hasn't
yann@2437
    46
-	       already done?  */
yann@2437
    47
-	    return -1;
yann@2437
    48
+	    /* Something wrong.  Fall back to single byte matching.  */
yann@2437
    49
+	    goto try_singlebyte;
yann@2437
    50
 	  wstring = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t));
yann@2437
    51
 	  assert (mbsinit (&ps));
yann@2437
    52
 	  (void) mbsrtowcs (wstring, &string, n + 1, &ps);
yann@2437
    53
@@ -408,6 +405,9 @@
yann@2437
    54
 
yann@2437
    55
       return internal_fnwmatch (wpattern, wstring, wstring + n,
yann@2437
    56
 				flags & FNM_PERIOD, flags, NULL);
yann@2437
    57
+
yann@2437
    58
+    try_singlebyte:
yann@2437
    59
+      pattern = orig_pattern;
yann@2437
    60
     }
yann@2437
    61
 # endif  /* mbstate_t and mbsrtowcs or _LIBC.  */
yann@2437
    62