svn commit: r301461 - in head/lib/libc: gen locale regex

Pedro F. Giffuni pfg at FreeBSD.org
Sun Jun 5 19:12:54 UTC 2016


Author: pfg
Date: Sun Jun  5 19:12:52 2016
New Revision: 301461
URL: https://svnweb.freebsd.org/changeset/base/301461

Log:
  libc/locale: Fix type breakage in __collate_range_cmp().
  
  When collation support was brought in, the second and third
  arguments in __collate_range_cmp() were changed from int to
  wchar_t, breaking the ABI. Change them to a "char" type which
  makes more sense and keeps the ABI compatible.
  
  Also introduce __wcollate_range_cmp() which does work with wide
  characters. This function is used only internally in libc so
  we don't export it. Use the new function in glob(3), fnmatch(3),
  and regexec(3).
  
  PR:		179721
  Suggested by:	ache. jilles
  MFC after:	3 weeks (perhaps partial only)

Modified:
  head/lib/libc/gen/fnmatch.c
  head/lib/libc/gen/glob.c
  head/lib/libc/locale/collate.h
  head/lib/libc/locale/collcmp.c
  head/lib/libc/regex/regcomp.c

Modified: head/lib/libc/gen/fnmatch.c
==============================================================================
--- head/lib/libc/gen/fnmatch.c	Sun Jun  5 18:16:33 2016	(r301460)
+++ head/lib/libc/gen/fnmatch.c	Sun Jun  5 19:12:52 2016	(r301461)
@@ -296,8 +296,8 @@ rangematch(const char *pattern, wchar_t 
 
 			if (table->__collate_load_error ?
 			    c <= test && test <= c2 :
-			       __collate_range_cmp(table, c, test) <= 0
-			    && __collate_range_cmp(table, test, c2) <= 0
+			       __wcollate_range_cmp(table, c, test) <= 0
+			    && __wcollate_range_cmp(table, test, c2) <= 0
 			   )
 				ok = 1;
 		} else if (c == test)

Modified: head/lib/libc/gen/glob.c
==============================================================================
--- head/lib/libc/gen/glob.c	Sun Jun  5 18:16:33 2016	(r301460)
+++ head/lib/libc/gen/glob.c	Sun Jun  5 19:12:52 2016	(r301461)
@@ -832,8 +832,8 @@ match(Char *name, Char *pat, Char *paten
 				if ((*pat & M_MASK) == M_RNG) {
 					if (table->__collate_load_error ?
 					    CHAR(c) <= CHAR(k) && CHAR(k) <= CHAR(pat[1]) :
-					       __collate_range_cmp(table, CHAR(c), CHAR(k)) <= 0
-					    && __collate_range_cmp(table, CHAR(k), CHAR(pat[1])) <= 0
+					       __wcollate_range_cmp(table, CHAR(c), CHAR(k)) <= 0
+					    && __wcollate_range_cmp(table, CHAR(k), CHAR(pat[1])) <= 0
 					   )
 						ok = 1;
 					pat += 2;

Modified: head/lib/libc/locale/collate.h
==============================================================================
--- head/lib/libc/locale/collate.h	Sun Jun  5 18:16:33 2016	(r301460)
+++ head/lib/libc/locale/collate.h	Sun Jun  5 19:12:52 2016	(r301461)
@@ -128,7 +128,8 @@ int	__collate_load_tables(const char *);
 int	__collate_equiv_value(locale_t, const wchar_t *, size_t);
 void	_collate_lookup(struct xlocale_collate *,const wchar_t *, int *, int *,
 	int, const int **);
-int	__collate_range_cmp(struct xlocale_collate *, wchar_t, wchar_t);
+int	__collate_range_cmp(struct xlocale_collate *, char, char);
+int	__wcollate_range_cmp(struct xlocale_collate *, wchar_t, wchar_t);
 size_t	_collate_wxfrm(struct xlocale_collate *, const wchar_t *, wchar_t *,
 	size_t);
 size_t	_collate_sxfrm(struct xlocale_collate *, const wchar_t *, char *,

Modified: head/lib/libc/locale/collcmp.c
==============================================================================
--- head/lib/libc/locale/collcmp.c	Sun Jun  5 18:16:33 2016	(r301460)
+++ head/lib/libc/locale/collcmp.c	Sun Jun  5 19:12:52 2016	(r301461)
@@ -41,14 +41,27 @@ __FBSDID("$FreeBSD$");
  * Compare two characters using collate
  */
 
-int __collate_range_cmp(struct xlocale_collate *table, wchar_t c1, wchar_t c2)
+int __collate_range_cmp(struct xlocale_collate *table, char c1, char c2)
+{
+	char s1[2], s2[2];
+
+	s1[0] = c1;
+	s1[1] = '\0';
+	s2[0] = c2;
+	s2[1] = '\0';
+	struct _xlocale l = {{0}};
+	l.components[XLC_COLLATE] = (struct xlocale_component *)table;
+	return (strcoll_l(s1, s2, &l));
+}
+
+int __wcollate_range_cmp(struct xlocale_collate *table, wchar_t c1, wchar_t c2)
 {
 	wchar_t s1[2], s2[2];
 
 	s1[0] = c1;
-	s1[1] = 0;
+	s1[1] = L'\0';
 	s2[0] = c2;
-	s2[1] = 0;
+	s2[1] = L'\0';
 	struct _xlocale l = {{0}};
 	l.components[XLC_COLLATE] = (struct xlocale_component *)table;
 	return (wcscoll_l(s1, s2, &l));

Modified: head/lib/libc/regex/regcomp.c
==============================================================================
--- head/lib/libc/regex/regcomp.c	Sun Jun  5 18:16:33 2016	(r301460)
+++ head/lib/libc/regex/regcomp.c	Sun Jun  5 19:12:52 2016	(r301461)
@@ -821,10 +821,10 @@ p_b_term(struct parse *p, cset *cs)
 				(void)REQUIRE((uch)start <= (uch)finish, REG_ERANGE);
 				CHaddrange(p, cs, start, finish);
 			} else {
-				(void)REQUIRE(__collate_range_cmp(table, start, finish) <= 0, REG_ERANGE);
+				(void)REQUIRE(__wcollate_range_cmp(table, start, finish) <= 0, REG_ERANGE);
 				for (i = 0; i <= UCHAR_MAX; i++) {
-					if (   __collate_range_cmp(table, start, i) <= 0
-					    && __collate_range_cmp(table, i, finish) <= 0
+					if (   __wcollate_range_cmp(table, start, i) <= 0
+					    && __wcollate_range_cmp(table, i, finish) <= 0
 					   )
 						CHadd(p, cs, i);
 				}


More information about the svn-src-head mailing list