summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2014-02-20 19:42:03 +0200
committerArnold D. Robbins <arnold@skeeve.com>2014-02-20 19:42:03 +0200
commit5e3f96e34832b2db0b33e38280643ff336c34450 (patch)
tree2f9da3c848990c8392f14b7852f822bcb5fb0561
parent5a41f696c4b8251583f5516084eaba3b752cb7f6 (diff)
downloadgawk-5e3f96e34832b2db0b33e38280643ff336c34450.tar.gz
Sync dfa.c with grep.
-rw-r--r--ChangeLog2
-rw-r--r--dfa.c27
2 files changed, 29 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 4e830e42..404ba03c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,8 @@
* regex.h, regex.c, regex_internal.c, regex_internal.h: Sync
with GLIBC. Mainly copyright updates.
+ * dfa.c (parse_bracket_exp): Sync with grep, where they restored
+ the buggy code. Sigh.
2014-02-15 Arnold D. Robbins <arnold@skeeve.com>
diff --git a/dfa.c b/dfa.c
index d5e7fdf6..19ca737f 100644
--- a/dfa.c
+++ b/dfa.c
@@ -1148,6 +1148,7 @@ parse_bracket_exp (void)
}
else
{
+#ifdef GAWK
c1 = c;
if (case_fold)
{
@@ -1156,6 +1157,32 @@ parse_bracket_exp (void)
}
for (c = c1; c <= c2; c++)
setbit_case_fold_c (c, ccl);
+#else
+ /* Defer to the system regex library about the meaning
+ of range expressions. */
+ regex_t re;
+ char pattern[6] = { '[', 0, '-', 0, ']', 0 };
+ char subject[2] = { 0, 0 };
+ c1 = c;
+ if (case_fold)
+ {
+ c1 = tolower (c1);
+ c2 = tolower (c2);
+ }
+
+ pattern[1] = c1;
+ pattern[3] = c2;
+ regcomp (&re, pattern, REG_NOSUB);
+ for (c = 0; c < NOTCHAR; ++c)
+ {
+ if ((case_fold && isupper (c)))
+ continue;
+ subject[0] = c;
+ if (regexec (&re, subject, 0, NULL, 0) != REG_NOMATCH)
+ setbit_case_fold_c (c, ccl);
+ }
+ regfree (&re);
+#endif
}
colon_warning_state |= 8;