summaryrefslogtreecommitdiff
path: root/re.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2017-01-19 21:08:19 +0200
committerArnold D. Robbins <arnold@skeeve.com>2017-01-19 21:08:19 +0200
commit5a619e1986724cf8e27b637509925a8da36837e8 (patch)
treeffe527c6bc2bd170ca225d459b74d70cb74dfa70 /re.c
parentbaadccc7297fa9a0cd1bcc276385872fa0ca8b6e (diff)
downloadgawk-5a619e1986724cf8e27b637509925a8da36837e8.tar.gz
Speed up programs that toggle IGNORECASE a lot.
Diffstat (limited to 're.c')
-rw-r--r--re.c60
1 files changed, 29 insertions, 31 deletions
diff --git a/re.c b/re.c
index 5be3d178..73e75cbb 100644
--- a/re.c
+++ b/re.c
@@ -349,50 +349,48 @@ re_update(NODE *t)
NODE *t1;
if (t->type == Node_val && (t->flags & REGEX) != 0)
- return t->typed_re->re_reg;
-
- if ((t->re_flags & CASE) == IGNORECASE) {
- /* regex was compiled with settings matching IGNORECASE */
- if ((t->re_flags & CONSTANT) != 0) {
- /* it's a constant, so just return it as is */
- assert(t->type == Node_regex);
- return t->re_reg;
- }
- t1 = t->re_exp;
- if (t->re_text != NULL) {
- /* if contents haven't changed, just return it */
- if (cmp_nodes(t->re_text, t1, true) == 0)
- return t->re_reg;
- /* things changed, fall through to recompile */
- unref(t->re_text);
- }
- /* get fresh copy of the text of the regexp */
- t->re_text = dupnode(t1);
+ return t->typed_re->re_reg[IGNORECASE];
+
+ if ((t->re_flags & CONSTANT) != 0) {
+ /* it's a constant, so just return it as is */
+ assert(t->type == Node_regex);
+ return t->re_reg[IGNORECASE];
}
- /* was compiled with different IGNORECASE or text changed */
+ t1 = t->re_exp;
+ if (t->re_text != NULL) {
+ /* if contents haven't changed, just return it */
+ if (cmp_nodes(t->re_text, t1, true) == 0)
+ return t->re_reg[IGNORECASE];
+ /* things changed, fall through to recompile */
+ unref(t->re_text);
+ }
+ /* get fresh copy of the text of the regexp */
+ t->re_text = dupnode(t1);
+
+ /* text changed */
/* free old */
- if (t->re_reg != NULL)
- refree(t->re_reg);
+ if (t->re_reg[0] != NULL)
+ refree(t->re_reg[0]);
+ if (t->re_reg[1] != NULL)
+ refree(t->re_reg[1]);
if (t->re_cnt > 0)
t->re_cnt++;
if (t->re_cnt > 10)
t->re_cnt = 0;
- if (t->re_text == NULL || (t->re_flags & CASE) != IGNORECASE) {
+ if (t->re_text == NULL) {
/* reset regexp text if needed */
t1 = t->re_exp;
unref(t->re_text);
t->re_text = dupnode(t1);
}
/* compile it */
- t->re_reg = make_regexp(t->re_text->stptr, t->re_text->stlen,
- IGNORECASE, t->re_cnt, true);
-
- /* clear case flag */
- t->re_flags &= ~CASE;
- /* set current value of case flag */
- t->re_flags |= IGNORECASE;
- return t->re_reg;
+ t->re_reg[0] = make_regexp(t->re_text->stptr, t->re_text->stlen,
+ false, t->re_cnt, true);
+ t->re_reg[1] = make_regexp(t->re_text->stptr, t->re_text->stlen,
+ true, t->re_cnt, true);
+
+ return t->re_reg[IGNORECASE];
}
/* resetup --- choose what kind of regexps we match */