aboutsummaryrefslogtreecommitdiffstats
path: root/dfa.c
diff options
context:
space:
mode:
Diffstat (limited to 'dfa.c')
-rw-r--r--dfa.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/dfa.c b/dfa.c
index 82910fb7..f3269a27 100644
--- a/dfa.c
+++ b/dfa.c
@@ -3970,6 +3970,9 @@ dfamust (struct dfa const *d)
bool begline = false;
bool endline = false;
size_t rj;
+ bool need_begline = false;
+ bool need_endline = false;
+ bool case_fold_unibyte = case_fold && MB_CUR_MAX == 1;
struct dfamust *dm;
for (ri = 0; ri < d->tindex; ++ri)
@@ -3980,10 +3983,12 @@ dfamust (struct dfa const *d)
case BEGLINE:
mp = allocmust (mp, 2);
mp->begline = true;
+ need_begline = true;
break;
case ENDLINE:
mp = allocmust (mp, 2);
mp->endline = true;
+ need_endline = true;
break;
case LPAREN:
case RPAREN:
@@ -4060,7 +4065,9 @@ dfamust (struct dfa const *d)
result = mp->in[i];
if (STREQ (result, mp->is))
{
- exact = true;
+ if ((!need_begline || mp->begline) && (!need_endline
+ || mp->endline))
+ exact = true;
begline = mp->begline;
endline = mp->endline;
}
@@ -4133,7 +4140,7 @@ dfamust (struct dfa const *d)
t = j;
while (++j < NOTCHAR)
if (tstbit (j, *ccl)
- && ! (case_fold && MB_CUR_MAX == 1
+ && ! (case_fold_unibyte
&& toupper (j) == toupper (t)))
break;
if (j < NOTCHAR)
@@ -4156,17 +4163,17 @@ dfamust (struct dfa const *d)
}
mp = allocmust (mp, ((rj - ri) >> 1) + 1);
mp->is[0] = mp->left[0] = mp->right[0]
- = case_fold && MB_CUR_MAX == 1 ? toupper (t) : t;
+ = case_fold_unibyte ? toupper (t) : t;
for (i = 1; ri + 2 < rj; i++)
{
ri += 2;
t = d->tokens[ri];
mp->is[i] = mp->left[i] = mp->right[i]
- = case_fold && MB_CUR_MAX == 1 ? toupper (t) : t;
+ = case_fold_unibyte ? toupper (t) : t;
}
mp->is[i] = mp->left[i] = mp->right[i] = '\0';
- mp->in = enlist (mp->in, mp->is, i - 1);
+ mp->in = enlist (mp->in, mp->is, i);
break;
}
}