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
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html| Sunil Naidu | Re: Linux 2.6.20-rc6 |
| Alan Cox | Re: Dual-Licensing Linux Kernel with GPL V2 and GPL V3 |
| Chris Snook | Re: init's children list is long and slows reaping children. |
| Greg Kroah-Hartman | [PATCH 001/196] Chinese: Add the known_regression URI to the HOWTO |
git: | |
| Jarek Poplawski | [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| David Miller | [GIT]: Networking |
| Gerrit Renker | [PATCH 27/37] dccp: Integration of dynamic feature activation - part 2 (server side) |
| Eric W. Biederman | Re: [PATCH 10/11] avoid kobject name conflict with different namespaces |
