+2016-11-27 Norihiro Tanaka <noritnk@kcn.ne.jp>
+
+ dfa: avoid match middle in multibyte character
+ * lib/dfa.c (transit_state): If fails in matching single byte characters
+ on a state including period expression in non-UTF8 multibyte locales,
+ skip trailing bytes.
+ (dfa_supported): Revert previous change.
+
2016-11-27 Jim Meyering <meyering@fb.com>
dfa: avoid false match in non-UTF8 multibyte locales
/* Calculate the state which can be reached from the state 's' by
consuming 'mbclen' single bytes from the buffer. */
s1 = s;
- for (i = 0; i < mbclen && 0 <= s; i++)
+ for (i = 0; i < mbclen && (i == 0 || d->min_trcount <= s); i++)
s = transit_state_singlebyte (d, s, pp);
*pp += mbclen - i;
static bool _GL_ATTRIBUTE_PURE
dfa_supported (struct dfa const *d)
{
- /* Declare any non-UTF8 multibyte locale "not supported." Otherwise, a
- regexp like ".*7" would mistakenly match \uC9, e.g., via this command:
- (export LC_ALL=zh_CN.gb18030; printf '\uC9\n' | grep '.*7') */
- if (d->localeinfo.multibyte && !d->localeinfo.using_utf8)
- return false;
-
size_t i;
for (i = 0; i < d->tindex; i++)
{