svn commit: r223010 - head/bin/sh

Jilles Tjoelker jilles at FreeBSD.org
Sun Jun 12 12:54:52 UTC 2011


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
 					   )


More information about the svn-src-head mailing list