I fixed the bug in the patch. Added call of resetmust().
From ac54299352bf5feb5cb7a5f24f49c4d019dcc23b Mon Sep 17 00:00:00 2001
From: Norihiro Tanaka <[email protected]>
Date: Tue, 18 Mar 2014 21:01:47 +0900
Subject: [PATCH] grep: open CSET and transform into the upper case when
MB_CUR_MAX == 1 in dfamust
* src/dfa.c (dfamust): open CSET and transform into the upper case when
MB_CUR_MAX == 1 in dfamust.
---
src/dfa.c | 35 +++++++++++++++++++++++++++++++++--
1 file changed, 33 insertions(+), 2 deletions(-)
diff --git a/src/dfa.c b/src/dfa.c
index f88ff2a..1552467 100644
--- a/src/dfa.c
+++ b/src/dfa.c
@@ -4111,7 +4111,37 @@ dfamust (struct dfa *d)
/* not on *my* shift */
goto done;
}
- else if (t >= CSET || !MBS_SUPPORT || t == ANYCHAR || t == MBCSET)
+ else if (t >= CSET)
+ {
+ charclass ccl;
+ int j;
+ copyset (d->charclasses[t - CSET], ccl);
+ for (j = 0; j < NOTCHAR; ++j)
+ if (tstbit (j, ccl))
+ break;
+ if (j < NOTCHAR)
+ {
+ int c = (case_fold && MB_CUR_MAX == 1) ? toupper (j) : j;
+ for (; j < NOTCHAR; j++)
+ if (tstbit (j, ccl)
+ && (!(case_fold && MB_CUR_MAX == 1) || c != toupper
(j)))
+ break;
+ if (j < NOTCHAR)
+ resetmust (mp);
+ else
+ {
+ resetmust (mp);
+ mp->is[0] = mp->left[0] = mp->right[0] = c;
+ mp->is[1] = mp->left[1] = mp->right[1] = '\0';
+ mp->in = enlist (mp->in, mp->is, (size_t) 1);
+ if (mp->in == NULL)
+ goto done;
+ }
+ }
+ else
+ resetmust (mp);
+ }
+ else if (!MBS_SUPPORT || t == ANYCHAR || t == MBCSET)
{
/* easy enough */
resetmust (mp);
@@ -4120,7 +4150,8 @@ dfamust (struct dfa *d)
{
/* plain character */
resetmust (mp);
- mp->is[0] = mp->left[0] = mp->right[0] = t;
+ mp->is[0] = mp->left[0] = mp->right[0] =
+ (case_fold && MB_CUR_MAX == 1) ? toupper (t) : t;
mp->is[1] = mp->left[1] = mp->right[1] = '\0';
mp->in = enlist (mp->in, mp->is, (size_t) 1);
if (mp->in == NULL)
--
1.9.1