]> Savannah Git Hosting - gnulib.git/commitdiff
dfa: new option DFA_CONFUSING_BRACKETS_ERROR
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 23 May 2022 17:04:18 +0000 (10:04 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 23 May 2022 19:18:53 +0000 (12:18 -0700)
This is for grep, which wants [:alpha:] to be an error
at the top level.
* lib/dfa.c (struct regex_syntax): New member dfaopts,
replacing anchor.  All uses changed.
(parse_bracket_exp): Error, not warn, if DFA_CONFUSING_BRACKETS_ERROR.
* lib/dfa.h (DFA_CONFUSING_BRACKETS_ERROR): New constant.

ChangeLog
lib/dfa.c
lib/dfa.h

index 327100aaf1079054f3fffda9b495082bcaa7175a..407baca335542db81678943e41b6e3f1e3136beb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2022-05-23  Paul Eggert  <eggert@cs.ucla.edu>
+
+       dfa: new option DFA_CONFUSING_BRACKETS_ERROR
+       This is for grep, which wants [:alpha:] to be an error
+       at the top level.
+       * lib/dfa.c (struct regex_syntax): New member dfaopts,
+       replacing anchor.  All uses changed.
+       (parse_bracket_exp): Error, not warn, if DFA_CONFUSING_BRACKETS_ERROR.
+       * lib/dfa.h (DFA_CONFUSING_BRACKETS_ERROR): New constant.
+
 2022-05-21  Paul Eggert  <eggert@cs.ucla.edu>
 
        strstr-simple: pacify GCC 12.1
index 5f290ec58e32970c34e86d037688957d24102af9..ba216395213f406a307acf5bfcfa6dd678e8d3e5 100644 (file)
--- a/lib/dfa.c
+++ b/lib/dfa.c
@@ -399,15 +399,12 @@ struct regex_syntax
 {
   /* Syntax bits controlling the behavior of the lexical analyzer.  */
   reg_syntax_t syntax_bits;
+  int dfaopts;
   bool syntax_bits_set;
 
   /* Flag for case-folding letters into sets.  */
   bool case_fold;
 
-  /* True if ^ and $ match only the start and end of data, and do not match
-     end-of-line within data.  */
-  bool anchor;
-
   /* End-of-line byte in data.  */
   unsigned char eolbyte;
 
@@ -836,7 +833,7 @@ unibyte_word_constituent (struct dfa const *dfa, unsigned char c)
 static int
 char_context (struct dfa const *dfa, unsigned char c)
 {
-  if (c == dfa->syntax.eolbyte && !dfa->syntax.anchor)
+  if (c == dfa->syntax.eolbyte && !(dfa->syntax.dfaopts & DFA_ANCHOR))
     return CTX_NEWLINE;
   if (unibyte_word_constituent (dfa, c))
     return CTX_LETTER;
@@ -1140,7 +1137,9 @@ parse_bracket_exp (struct dfa *dfa)
   while ((wc = wc1, (c = c1) != ']'));
 
   if (colon_warning_state == 7)
-    dfawarn (_("character class syntax is [[:space:]], not [:space:]"));
+    ((dfa->syntax.dfaopts & DFA_CONFUSING_BRACKETS_ERROR
+      ? dfaerror : dfawarn)
+     (_("character class syntax is [[:space:]], not [:space:]")));
 
   if (! known_bracket_exp)
     return BACKREF;
@@ -4327,9 +4326,9 @@ dfasyntax (struct dfa *dfa, struct localeinfo const *linfo,
   dfa->canychar = -1;
   dfa->syntax.syntax_bits_set = true;
   dfa->syntax.case_fold = (bits & RE_ICASE) != 0;
-  dfa->syntax.anchor = (dfaopts & DFA_ANCHOR) != 0;
   dfa->syntax.eolbyte = dfaopts & DFA_EOL_NUL ? '\0' : '\n';
   dfa->syntax.syntax_bits = bits;
+  dfa->syntax.dfaopts = dfaopts;
 
   for (int i = CHAR_MIN; i <= CHAR_MAX; ++i)
     {
index e94e43546d2a3c049f2656e29a3ef10f35c0f16c..327b9c7cdf4a4d7e58740b153058c3cdd105febf 100644 (file)
--- a/lib/dfa.h
+++ b/lib/dfa.h
@@ -73,7 +73,11 @@ enum
     DFA_ANCHOR = 1 << 0,
 
     /* '\0' in data is end-of-line, instead of the traditional '\n'.  */
-    DFA_EOL_NUL = 1 << 1
+    DFA_EOL_NUL = 1 << 1,
+
+    /* Treat [:alpha:] etc. as an error at the top level, instead of
+       merely a warning.  */
+    DFA_CONFUSING_BRACKETS_ERROR = 1 << 2,
   };
 
 /* Initialize or reinitialize a DFA.  The arguments are: