svn commit: r290240 - projects/collation/lib/libc/locale

Baptiste Daroussin bapt at FreeBSD.org
Sun Nov 1 21:02:32 UTC 2015


Author: bapt
Date: Sun Nov  1 21:02:30 2015
New Revision: 290240
URL: https://svnweb.freebsd.org/changeset/base/290240

Log:
  locales: Fix eucJP sorting (broken upstream?)
  
  Sorting eucJP text with "sort" resulted in an illegal sequence while
  "gsort" worked.  This was traced back to mbrtowc handling which was
  broken for eucJP (probably eucCN, eucKR, and eucTW as well).  This
  small fix took hours to figure out.  The OR operation to build the
  wide character requires an unsigned character to work correctly.  The
  euc wcrtowc conversion is probably broken upstream in Illumos as well.
  
  Triggered by: misc/freebsd-doc-ja in ports (encoded in eucJP)
  
  Submitted by:	marino
  Obtained from:	DragonflyBSD

Modified:
  projects/collation/lib/libc/locale/euc.c

Modified: projects/collation/lib/libc/locale/euc.c
==============================================================================
--- projects/collation/lib/libc/locale/euc.c	Sun Nov  1 19:59:04 2015	(r290239)
+++ projects/collation/lib/libc/locale/euc.c	Sun Nov  1 21:02:30 2015	(r290240)
@@ -317,8 +317,8 @@ _EUC_mbrtowc_impl(wchar_t * __restrict p
 {
 	_EucState *es;
 	int i, want;
-	wchar_t wc;
-	unsigned char ch;
+	wchar_t wc = 0;
+	unsigned char ch, chs;
 
 	es = (_EucState *)ps;
 
@@ -367,7 +367,8 @@ _EUC_mbrtowc_impl(wchar_t * __restrict p
 
 	for (i = 0; i < MIN(want, n); i++) {
 		wc <<= 8;
-		wc |= *s;
+		chs = *s;
+		wc |= chs;
 		s++;
 	}
 	if (i < want) {


More information about the svn-src-projects mailing list