Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 13 Jul 2016 18:51:19 +0000 (UTC)
From:      "Andrey A. Chernov" <ache@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r302780 - head/contrib/libgnuregex
Message-ID:  <201607131851.u6DIpJKT002214@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ache
Date: Wed Jul 13 18:51:19 2016
New Revision: 302780
URL: https://svnweb.freebsd.org/changeset/base/302780

Log:
  After removing collation for [a-z] ranges in r302512, do it here too.
  
  Instead of trying to expand whole range at regcomp() stage as we do,
  GNU regex allocates separate ranges [start,end] set each character
  is checked against, so collation is possible and turned on for ranges here.
  
  When something like that will be implemented or our obsoleted regex code
  will be replaced to something like TRE, and in case we decide to use
  collation in [a-z] ranges, all changes related to r302512 can be backed out,
  but now we need consistency.

Modified:
  head/contrib/libgnuregex/regcomp.c
  head/contrib/libgnuregex/regexec.c

Modified: head/contrib/libgnuregex/regcomp.c
==============================================================================
--- head/contrib/libgnuregex/regcomp.c	Wed Jul 13 18:26:05 2016	(r302779)
+++ head/contrib/libgnuregex/regcomp.c	Wed Jul 13 18:51:19 2016	(r302780)
@@ -2664,7 +2664,11 @@ build_range_exp (bitset_t sbcset, bracke
       return REG_ECOLLATE;
     cmp_buf[0] = start_wc;
     cmp_buf[4] = end_wc;
+#ifdef __FreeBSD__
+    if (wcscmp (cmp_buf, cmp_buf + 4) > 0)
+#else
     if (wcscoll (cmp_buf, cmp_buf + 4) > 0)
+#endif
       return REG_ERANGE;
 
     /* Got valid collation sequence values, add them as a new entry.
@@ -2706,8 +2710,13 @@ build_range_exp (bitset_t sbcset, bracke
     for (wc = 0; wc < SBC_MAX; ++wc)
       {
 	cmp_buf[2] = wc;
+#ifdef __FreeBSD__
+	if (wcscmp (cmp_buf, cmp_buf + 2) <= 0
+	    && wcscmp (cmp_buf + 2, cmp_buf + 4) <= 0)
+#else
 	if (wcscoll (cmp_buf, cmp_buf + 2) <= 0
 	    && wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0)
+#endif
 	  bitset_set (sbcset, wc);
       }
   }

Modified: head/contrib/libgnuregex/regexec.c
==============================================================================
--- head/contrib/libgnuregex/regexec.c	Wed Jul 13 18:26:05 2016	(r302779)
+++ head/contrib/libgnuregex/regexec.c	Wed Jul 13 18:51:19 2016	(r302780)
@@ -3964,8 +3964,13 @@ check_node_accept_bytes (const re_dfa_t 
 	    {
 	      cmp_buf[0] = cset->range_starts[i];
 	      cmp_buf[4] = cset->range_ends[i];
+#ifdef __FreeBSD__
+	      if (wcscmp (cmp_buf, cmp_buf + 2) <= 0
+		  && wcscmp (cmp_buf + 2, cmp_buf + 4) <= 0)
+#else
 	      if (wcscoll (cmp_buf, cmp_buf + 2) <= 0
 		  && wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0)
+#endif
 		{
 		  match_len = char_len;
 		  goto check_node_accept_bytes_match;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201607131851.u6DIpJKT002214>