Re: [PATCH v4] Threaded grep
- From
Benjamin Kramer <benny.kra@googlemail.com>
- Date
- Jan 26, 2010, 16:30 UTC
- Message-ID
- <4B5F1894.4070509@googlemail.com>
- In-Reply-To
- <alpine.LFD.2.00.1001260728260.3574@localhost.localdomain>
BSD and glibc have an extension to regexec which takes a buffer + length pair instead of a NUL-terminated string. Since we already have the length computed this can save us a strlen call. ---
On 26.01.10 16:28, Linus Torvalds wrote:
> so it's sadly internal to regex. It would be nice if there was a > non-string interface to regexec (ie a "buffer + length" instead of a > NUL-terminated string).
BSD and glibc have an "REG_STARTEND" flag to do that. I made a small PoC patch to use it if it's available but it didn't give any significant speedup on my system.
grep.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/grep.c b/grep.c index d281a02..60cce46 100644 --- a/grep.c +++ b/grep.c @@ -675,8 +675,15 @@ static int look_ahead(struct grep_opt *opt, if (p->fixed) hit = !fixmatch(p->pattern, bol, p->ignore_case, &m); - else + else { +#ifdef REG_STARTEND + m.rm_so = 0; + m.rm_eo = *left_p; + hit = !regexec(&p->regexp, bol, 1, &m, REG_STARTEND); +#else hit = !regexec(&p->regexp, bol, 1, &m, 0); +#endif + } if (!hit || m.rm_so < 0 || m.rm_eo < 0) continue; if (earliest < 0 || m.rm_so < earliest) -- 1.7.0.rc0.12.gc33c3