--- grep-2.5.1/src/search.c.fgrep 2001-04-19 04:42:14.000000000 +0100 +++ grep-2.5.1/src/search.c 2004-02-26 13:09:32.000000000 +0000 @@ -360,13 +360,7 @@ /* Find a possible match using the KWset matcher. */ size_t offset = kwsexec (kwset, beg, buflim - beg, &kwsm); if (offset == (size_t) -1) - { -#ifdef MBS_SUPPORT - if (MB_CUR_MAX > 1) - free(mb_properties); -#endif - return (size_t)-1; - } + goto failure; beg += offset; /* Narrow down to the line containing the candidate, and run it through DFA. */ @@ -379,7 +373,7 @@ while (beg > buf && beg[-1] != eol) --beg; if (kwsm.index < kwset_exact_matches) - goto success; + goto success_in_beg_and_end; if (dfaexec (&dfa, beg, end - beg, &backref) == (size_t) -1) continue; } @@ -398,7 +392,7 @@ } /* Successful, no backreferences encountered! */ if (!backref) - goto success; + goto success_in_beg_and_end; } else end = beg + size; @@ -413,14 +407,11 @@ end - beg - 1, &(patterns[i].regs)))) { len = patterns[i].regs.end[0] - start; - if (exact) - { - *match_size = len; - return start; - } + if (exact && !match_words) + goto success_in_start_and_len; if ((!match_lines && !match_words) || (match_lines && len == end - beg - 1)) - goto success; + goto success_in_beg_and_end; /* If -w, check if the match aligns with word boundaries. We do this iteratively because: (a) the line may contain more than one occurence of the @@ -434,7 +425,7 @@ if ((start == 0 || !WCHAR ((unsigned char) beg[start - 1])) && (len == end - beg - 1 || !WCHAR ((unsigned char) beg[start + len]))) - goto success; + goto success_in_beg_and_end; if (len > 0) { /* Try a shorter length anchored at the same place. */ @@ -461,19 +452,26 @@ } } /* for Regex patterns. */ } /* for (beg = end ..) */ + + failure: #ifdef MBS_SUPPORT if (MB_CUR_MAX > 1 && mb_properties) free (mb_properties); #endif /* MBS_SUPPORT */ return (size_t) -1; - success: + success_in_beg_and_end: + len = end - beg; + start = beg - buf; + /* FALLTHROUGH */ + + success_in_start_and_len: #ifdef MBS_SUPPORT if (MB_CUR_MAX > 1 && mb_properties) free (mb_properties); #endif /* MBS_SUPPORT */ - *match_size = end - beg; - return beg - buf; + *match_size = len; + return start; } static void @@ -516,28 +514,15 @@ { 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; - } + goto failure; #ifdef MBS_SUPPORT if (MB_CUR_MAX > 1 && mb_properties[offset+beg-buf] == 0) continue; /* It is a part of multibyte character. */ #endif /* MBS_SUPPORT */ beg += offset; len = kwsmatch.size[0]; - if (exact) - { - *match_size = len; -#ifdef MBS_SUPPORT - if (MB_CUR_MAX > 1) - free (mb_properties); -#endif /* MBS_SUPPORT */ - return beg - buf; - } + if (exact && !match_words) + goto success_in_beg_and_len; if (match_lines) { if (beg > buf && beg[-1] != eol) @@ -551,6 +536,7 @@ goto success; } + failure: #ifdef MBS_SUPPORT if (MB_CUR_MAX > 1) free (mb_properties); @@ -583,7 +569,11 @@ end++; while (buf < beg && beg[-1] != eol) --beg; - *match_size = end - beg; + len = end - beg; + /* FALLTHROUGH */ + + success_in_beg_and_len: + *match_size = len; #ifdef MBS_SUPPORT if (MB_CUR_MAX > 1) free (mb_properties);