[PATCH] diffcore-pickaxe: switch to "counting" behaviour.
authorJunio C Hamano <junkio@cox.net>
Sat, 23 Jul 2005 23:35:25 +0000 (16:35 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sun, 24 Jul 2005 03:27:49 +0000 (20:27 -0700)
Instead of finding old/new pair that one side has and the
other side does not have the specified string, find old/new pair
that contains the specified string as a substring different
number of times.  This would still not catch a case where you
introduce two static variable declarations and remove two static
function definitions from a file with -S"static", but would make
it behave a bit more intuitively.

Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
diffcore-pickaxe.c

index 4c26b42..50e46ab 100644 (file)
@@ -5,19 +5,30 @@
 #include "diff.h"
 #include "diffcore.h"
 
-static int contains(struct diff_filespec *one,
-                   const char *needle, unsigned long len)
+static unsigned int contains(struct diff_filespec *one,
+                            const char *needle, unsigned long len)
 {
+       unsigned int cnt;
        unsigned long offset, sz;
        const char *data;
        if (diff_populate_filespec(one, 0))
                return 0;
+
        sz = one->size;
        data = one->data;
-       for (offset = 0; offset + len <= sz; offset++)
-                    if (!strncmp(needle, data + offset, len))
-                            return 1;
-       return 0;
+       cnt = 0;
+
+       /* Yes, I've heard of strstr(), but the thing is *data may
+        * not be NUL terminated.  Sue me.
+        */
+       for (offset = 0; offset + len <= sz; offset++) {
+               /* we count non-overlapping occurrences of needle */
+               if (!memcmp(needle, data + offset, len)) {
+                       offset += len - 1;
+                       cnt++;
+               }
+       }
+       return cnt;
 }
 
 void diffcore_pickaxe(const char *needle, int opts)