Author: jilles
Date: Sun Jun 12 12:54:52 2011
New Revision: 223010
URL: http://svn.freebsd.org/changeset/base/223010

Log:
  sh: Fix locale-dependent ranges in bracket expressions.
  
  When I added UTF-8 support in r221646, the LC_COLLATE-based ordering broke
  because of sign extension of char.
  
  Because of libc restrictions, this does not work for UTF-8. For UTF-8
  locales, ranges always use character code order.

Modified:
  head/bin/sh/expand.c

Modified: head/bin/sh/expand.c
==============================================================================
--- head/bin/sh/expand.c        Sun Jun 12 12:51:58 2011        (r223009)
+++ head/bin/sh/expand.c        Sun Jun 12 12:54:52 2011        (r223010)
@@ -1430,7 +1430,7 @@ patmatch(const char *pattern, const char
                        if (localeisutf8)
                                wc = get_wc(&q);
                        else
-                               wc = *q++;
+                               wc = (unsigned char)*q++;
                        if (wc == '\0')
                                return 0;
                        break;
@@ -1487,7 +1487,7 @@ patmatch(const char *pattern, const char
                        if (localeisutf8)
                                chr = get_wc(&q);
                        else
-                               chr = *q++;
+                               chr = (unsigned char)*q++;
                        if (chr == '\0')
                                return 0;
                        c = *p++;
@@ -1502,7 +1502,7 @@ patmatch(const char *pattern, const char
                                        if (wc == 0) /* bad utf-8 */
                                                return 0;
                                } else
-                                       wc = c;
+                                       wc = (unsigned char)c;
                                if (*p == '-' && p[1] != ']') {
                                        p++;
                                        while (*p == CTLQUOTEMARK)
@@ -1514,7 +1514,7 @@ patmatch(const char *pattern, const char
                                                if (wc2 == 0) /* bad utf-8 */
                                                        return 0;
                                        } else
-                                               wc2 = *p++;
+                                               wc2 = (unsigned char)*p++;
                                        if (   collate_range_cmp(chr, wc) >= 0
                                            && collate_range_cmp(chr, wc2) <= 0
                                           )
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to