From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Subject: [PATCH 02/13] builtin-apply.c: restructure "offset" matching
Date: Sat, 2 Feb 2008 02:54:08 -0800 [thread overview]
Message-ID: <1201949659-27725-3-git-send-email-gitster@pobox.com> (raw)
In-Reply-To: <1201949659-27725-2-git-send-email-gitster@pobox.com>
This restructures code to find matching location with offset
in find_offset() function, so that there is need for only one
call site of match_fragment() function. There still isn't a
change in the logic of the program.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
builtin-apply.c | 49 +++++++++++++++++++++++++------------------------
1 files changed, 25 insertions(+), 24 deletions(-)
diff --git a/builtin-apply.c b/builtin-apply.c
index 2c052f8..0a304ab 100644
--- a/builtin-apply.c
+++ b/builtin-apply.c
@@ -1452,8 +1452,8 @@ static int find_offset(const char *buf, unsigned long size,
const char *fragment, unsigned long fragsize,
int line, int *lines)
{
- int i;
- unsigned long start, backwards, forwards;
+ int i, no_more_backwards, no_more_forwards;
+ unsigned long start, backwards, forwards, try;
if (fragsize > size)
return -1;
@@ -1471,32 +1471,44 @@ static int find_offset(const char *buf, unsigned long size,
}
}
- /* Exact line number? */
- if (match_fragment(buf, size, start, fragment, fragsize))
- return start;
-
/*
* There's probably some smart way to do this, but I'll leave
* that to the smart and beautiful people. I'm simple and stupid.
*/
backwards = start;
forwards = start;
+ try = start;
+
for (i = 0; ; i++) {
- unsigned long try;
- int n;
+ no_more_backwards = !backwards;
+ no_more_forwards = (forwards + fragsize > size);
+
+ if (match_fragment(buf, size, try, fragment, fragsize)) {
+ int shift = ((i+1) >> 1);
+ if (i & 1)
+ shift = -shift;
+ *lines = shift;
+ return try;
+ }
+
+ again:
+ if (no_more_backwards && no_more_forwards)
+ break;
- /* "backward" */
if (i & 1) {
- if (!backwards) {
- if (forwards + fragsize > size)
- break;
- continue;
+ if (no_more_backwards) {
+ i++;
+ goto again;
}
do {
--backwards;
} while (backwards && buf[backwards-1] != '\n');
try = backwards;
} else {
+ if (no_more_forwards) {
+ i++;
+ goto again;
+ }
while (forwards + fragsize <= size) {
if (buf[forwards++] == '\n')
break;
@@ -1504,18 +1516,7 @@ static int find_offset(const char *buf, unsigned long size,
try = forwards;
}
- if (!match_fragment(buf, size, try, fragment, fragsize))
- continue;
- n = (i >> 1)+1;
- if (i & 1)
- n = -n;
- *lines = n;
- return try;
}
-
- /*
- * We should start searching forward and backward.
- */
return -1;
}
--
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 ` Junio C Hamano [this message]
2008-02-02 10:54 ` [PATCH 03/13] builtin-apply.c: push match-beginning/end logic down Junio C Hamano
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-3-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).