PR-3716425.diff   [plain text]


diff -ur ../../old/grep/src/dfa.c ./src/dfa.c
--- ../../old/grep/src/dfa.c	2004-12-20 17:33:01.000000000 -0800
+++ ./src/dfa.c	2004-12-20 19:20:16.000000000 -0800
@@ -1053,11 +1053,18 @@
 		  if (!match) {
 		    dfaerror(_("invalid collating element or class"));
 		  } else {
-		      char *cp = match;
-		      for(; *cp; ++cp) {
-			setbit(*cp, ccl);
+		      if (*match && !match[1]) {
+			c1 = *match;
+			lexptr += used;
+			lexleft -= used;
+			goto skip;
+		      } else {
+			char *cp = match;
+			for(; *cp; ++cp) {
+			  setbit(*cp, ccl);
+			}
+			free(match);
 		      }
-		      free(match);
 		  }
 		  lexptr += used;
 		  lexleft -= used;
@@ -1097,6 +1104,15 @@
 		      if (c2 == '\\'
 			  && (syntax_bits & RE_BACKSLASH_ESCAPE_IN_LISTS))
 			FETCH(c2, _("Unbalanced ["));
+		      if (c2 == '[' && lexleft >= 1 && (*lexptr == '.' || *lexptr == '=')) {
+			int used = 0;
+			char *match = try_collating_thing(lexptr, lexleft, &used);
+			if (match && *match && !match[1]) {
+			    c2 = *match;
+			    lexptr += used;
+			    lexleft -= used;
+			}
+		      }
 		      FETCH(c1, _("Unbalanced ["));
 		      if (!hard_LC_COLLATE) {
 		        for (; c <= c2; c++)