Thu May 8 16:47:50 CEST 2003 Stepan Kasal * src/search.c (Fexecute): fix the bug for match_words; overall cleanup of the function. --- grep-2.5.1/src/search.c Thu Apr 19 05:42:14 2001 +++ grep-2.5.1.tst/src/search.c Thu May 8 16:55:27 2003 @@ -502,7 +502,7 @@ Fcompile (char const *pattern, size_t si static size_t Fexecute (char const *buf, size_t size, size_t *match_size, int exact) { - register char const *beg, *try, *end; + register char const *beg, *end; register size_t len; char eol = eolbyte; struct kwsmatch kwsmatch; @@ -516,13 +516,7 @@ Fexecute (char const *buf, size_t size, { size_t offset = kwsexec (kwset, beg, buf + size - beg, &kwsmatch); if (offset == (size_t) -1) - { -#ifdef MBS_SUPPORT - if (MB_CUR_MAX > 1) - free(mb_properties); -#endif /* MBS_SUPPORT */ - return offset; - } + break; #ifdef MBS_SUPPORT if (MB_CUR_MAX > 1 && mb_properties[offset+beg-buf] == 0) continue; /* It is a part of multibyte character. */ @@ -532,42 +526,31 @@ Fexecute (char const *buf, size_t size, if (exact) { *match_size = len; -#ifdef MBS_SUPPORT - if (MB_CUR_MAX > 1) - free (mb_properties); -#endif /* MBS_SUPPORT */ - return beg - buf; + goto have_match; } if (match_lines) { - if (beg > buf && beg[-1] != eol) - continue; - if (beg + len < buf + size && beg[len] != eol) - continue; - goto success; + if ((beg == buf || beg[-1] == eol) && + (beg + len == buf + size || beg[len] == eol)) + goto success; } else if (match_words) - for (try = beg; len; ) - { - if (try > buf && WCHAR((unsigned char) try[-1])) - break; - if (try + len < buf + size && WCHAR((unsigned char) try[len])) - { - offset = kwsexec (kwset, beg, --len, &kwsmatch); - if (offset == (size_t) -1) - { -#ifdef MBS_SUPPORT - if (MB_CUR_MAX > 1) - free (mb_properties); -#endif /* MBS_SUPPORT */ - return offset; - } - try = beg + offset; - len = kwsmatch.size[0]; - } - else - goto success; - } + { + if (beg == buf || !WCHAR((unsigned char) beg[-1])) + { + if (beg + len == buf + size || !WCHAR((unsigned char) beg[len])) + goto success; + /* If start is at word boundary but the end is not, + try to search for a shorter pattern. */ + while (len > 0 && kwsexec (kwset, beg, len - 1, &kwsmatch) == 0) + { + len = kwsmatch.size[0]; + /* beg+len must be < buf+size */ + if (!WCHAR((unsigned char) beg[len])) + goto success; + } + } + } else goto success; } @@ -584,6 +567,8 @@ Fexecute (char const *buf, size_t size, while (buf < beg && beg[-1] != eol) --beg; *match_size = end - beg; + + have_match: #ifdef MBS_SUPPORT if (MB_CUR_MAX > 1) free (mb_properties);