From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Subject: [PATCH 03/13] builtin-apply.c: push match-beginning/end logic down
Date: Sat, 2 Feb 2008 02:54:09 -0800 [thread overview]
Message-ID: <1201949659-27725-4-git-send-email-gitster@pobox.com> (raw)
In-Reply-To: <1201949659-27725-3-git-send-email-gitster@pobox.com>
This moves the logic to force match at the beginning and/or at
the end of the buffer to the actual function that finds the
match from its caller. This is a necessary preparation for the
next step to allow matching disregarding certain differences,
such as whitespace changes.
We probably could optimize this even more by taking advantage of
the fact that match_beginning and match_end forces the match to
be at an exact location (anchored at the beginning and/or the
end), but that's for another commit.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
builtin-apply.c | 46 ++++++++++++++++++++++++++++++++--------------
1 files changed, 32 insertions(+), 14 deletions(-)
diff --git a/builtin-apply.c b/builtin-apply.c
index 0a304ab..f84a405 100644
--- a/builtin-apply.c
+++ b/builtin-apply.c
@@ -1439,18 +1439,36 @@ static int read_old_data(struct stat *st, const char *path, struct strbuf *buf)
static int match_fragment(const char *buf, unsigned long size,
unsigned long try,
- const char *fragment, unsigned long fragsize)
+ const char *fragment, unsigned long fragsize,
+ int match_beginning, int match_end)
{
- if (try + fragsize > size)
+ if (match_beginning && try)
return 0;
- if (memcmp(buf + try, fragment, fragsize))
- return 0;
- return 1;
+
+ /*
+ * Do we have an exact match? If we were told to match
+ * at the end, size must be exactly at try+fragsize,
+ * otherwise try+fragsize must be still within the preimage,
+ * and either case, the old piece should match the preimage
+ * exactly.
+ */
+ if ((match_end
+ ? (try + fragsize == size)
+ : (try + fragsize <= size)) &&
+ !memcmp(buf + try, fragment, fragsize))
+ return 1;
+
+ /*
+ * NEEDSWORK: We can optionally match fuzzily here, but
+ * that is for a later round.
+ */
+ return 0;
}
static int find_offset(const char *buf, unsigned long size,
const char *fragment, unsigned long fragsize,
- int line, int *lines)
+ int line, int *lines,
+ int match_beginning, int match_end)
{
int i, no_more_backwards, no_more_forwards;
unsigned long start, backwards, forwards, try;
@@ -1483,7 +1501,8 @@ static int find_offset(const char *buf, unsigned long size,
no_more_backwards = !backwards;
no_more_forwards = (forwards + fragsize > size);
- if (match_fragment(buf, size, try, fragment, fragsize)) {
+ if (match_fragment(buf, size, try, fragment, fragsize,
+ match_beginning, match_end)) {
int shift = ((i+1) >> 1);
if (i & 1)
shift = -shift;
@@ -1765,17 +1784,16 @@ static int apply_one_fragment(struct strbuf *buf, struct fragment *frag,
pos = frag->newpos;
for (;;) {
offset = find_offset(buf->buf, buf->len,
- oldlines, oldsize, pos, &lines);
- if (match_end && offset + oldsize != buf->len)
- offset = -1;
- if (match_beginning && offset)
- offset = -1;
+ oldlines, oldsize, pos, &lines,
+ match_beginning, match_end);
if (offset >= 0) {
if (ws_error_action == correct_ws_error &&
- (buf->len - oldsize - offset == 0)) /* end of file? */
+ (buf->len - oldsize - offset == 0))
+ /* end of file? */
newsize -= new_blank_lines_at_end;
- /* Warn if it was necessary to reduce the number
+ /*
+ * Warn if it was necessary to reduce the number
* of context lines.
*/
if ((leading != frag->leading) ||
--
1.5.4.2.g41ac4
next prev parent reply other threads:[~2008-02-02 10:55 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-02 10:54 [PATCH/RFC 00/13] git-apply --whitespace=fix updates Junio C Hamano
2008-02-02 10:54 ` [PATCH 01/13] builtin-apply.c: refactor small part that matches context Junio C Hamano
2008-02-02 10:54 ` [PATCH 02/13] builtin-apply.c: restructure "offset" matching Junio C Hamano
2008-02-02 10:54 ` Junio C Hamano [this message]
2008-02-02 10:54 ` [PATCH 04/13] builtin-apply.c: make it more line oriented Junio C Hamano
2008-02-02 10:54 ` [PATCH 05/13] builtin-apply.c: optimize match_beginning/end processing a bit Junio C Hamano
2008-02-02 10:54 ` [PATCH 06/13] builtin-apply.c: mark common context lines in lineinfo structure Junio C Hamano
2008-02-02 10:54 ` [PATCH 07/13] builtin-apply.c: clean-up apply_one_fragment() Junio C Hamano
2008-02-02 10:54 ` [PATCH 08/13] builtin-apply.c: simplify calling site to apply_line() Junio C Hamano
2008-02-02 10:54 ` [PATCH 09/13] builtin-apply.c: do not feed copy_wsfix() leading '+' Junio C Hamano
2008-02-02 10:54 ` [PATCH 10/13] builtin-apply.c: move copy_wsfix() function a bit higher Junio C Hamano
2008-02-02 10:54 ` [PATCH 11/13] builtin-apply.c: pass ws_rule down to match_fragment() Junio C Hamano
2008-02-02 10:54 ` [PATCH 12/13] git-apply --whitespace=fix: fix whitespace fuzz introduced by previous run Junio C Hamano
2008-02-02 10:54 ` [PATCH 13/13] core.whitespace: cr-at-eol Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1201949659-27725-4-git-send-email-gitster@pobox.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).