Re: [PATCH v3] skip_prefix: rewrite so that prefix is scanned once

Subsystems: the rest

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

Re: [PATCH v3] skip_prefix: rewrite so that prefix is scanned once

From: Junio C Hamano <hidden>
Date: 2016-06-15 23:00:10

Junio C Hamano [off-list ref] writes:
Siddharth Goel [off-list ref] writes:
quoted
Helped-by: Eric Sunshine [off-list ref]
Signed-off-by: Siddharth Goel <redacted>
---
Added a space after colon in the subject as compared to previous 
patch [PATCH v2].

[PATCH v2]: http://thread.gmane.org/gmane.comp.version-control.git/243150
Whenever you see "Change", "Rewrite", etc. in the subject of a patch
that touches existing code, think twice.  The subject line is a
scarce real estate to be wasted on a noiseword that carries no real
information, and we already know a patch that touches existing code
changes or rewrites things.

    Subject: [PATCH v3] skip_prefix: scan prefix only once

perhaps?
quoted
 git-compat-util.h | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/git-compat-util.h b/git-compat-util.h
index 614a5e9..550dce3 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -357,8 +357,11 @@ extern int suffixcmp(const char *str, const char *suffix);
 
 static inline const char *skip_prefix(const char *str, const char *prefix)
 {
-	size_t len = strlen(prefix);
-	return strncmp(str, prefix, len) ? NULL : str + len;
+	while (*prefix != '\0' && *str == *prefix) {
+		str++;
+		prefix++;
+	}
+	return (*prefix == '\0' ? str : NULL);
Unlike another patch I saw the other day on the same topic, this
checks *prefix twice for the last round, even though I think this
one is probably slightly easier to read.  I dunno.
That is, something like this instead.  After looking at it again, I
do not think it is less readable than the above.

 git-compat-util.h | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/git-compat-util.h b/git-compat-util.h
index cbd86c3..68ffaef 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -357,8 +357,14 @@ extern int suffixcmp(const char *str, const char *suffix);
 
 static inline const char *skip_prefix(const char *str, const char *prefix)
 {
-	size_t len = strlen(prefix);
-	return strncmp(str, prefix, len) ? NULL : str + len;
+	while (1) {
+		if (!*prefix)
+			return str;
+		if (*str != *prefix)
+			return NULL;
+		prefix++;
+		str++;
+	}
 }
 
 #if defined(NO_MMAP) || defined(USE_WIN32_MMAP)

Re: [PATCH v3] skip_prefix: rewrite so that prefix is scanned once

From: Duy Nguyen <hidden>
Date: 2016-06-15 23:00:10

On Tue, Mar 4, 2014 at 5:43 AM, Junio C Hamano [off-list ref] wrote:
quoted hunk
diff --git a/git-compat-util.h b/git-compat-util.h
index cbd86c3..68ffaef 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -357,8 +357,14 @@ extern int suffixcmp(const char *str, const char *suffix);

 static inline const char *skip_prefix(const char *str, const char *prefix)
 {
-       size_t len = strlen(prefix);
-       return strncmp(str, prefix, len) ? NULL : str + len;
Just a note. gcc does optimize strlen("abcdef") to 6, and with that
information at compile time built-in strncmp might do better.
+       while (1) {
+               if (!*prefix)
+                       return str;
+               if (*str != *prefix)
+                       return NULL;
+               prefix++;
+               str++;
+       }
 }

 #if defined(NO_MMAP) || defined(USE_WIN32_MMAP)
-- 
Duy
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help