From 5094102e13640d7559a02fd7c77b44dc9254cbbb Mon Sep 17 00:00:00 2001
From: Daniel Barkalow <barkalow@iabervon.org>
Date: Wed, 2 May 2007 22:49:41 -0400
Subject: [PATCH] Make xstrndup common

This also improves the implementation to match how strndup is
specified (by GNU): if the length given is longer than the string,
only the string's length is allocated and copied, but the string need
not be null-terminated if it is at least as long as the given length.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 commit.c          |  8 --------
 git-compat-util.h | 13 +++++++++++++
 2 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/commit.c b/commit.c
index 754d1b8a0b..eb911f44d7 100644
--- a/commit.c
+++ b/commit.c
@@ -720,14 +720,6 @@ static char *logmsg_reencode(const struct commit *commit,
 	return out;
 }
 
-static char *xstrndup(const char *text, int len)
-{
-	char *result = xmalloc(len + 1);
-	memcpy(result, text, len);
-	result[len] = '\0';
-	return result;
-}
-
 static void fill_person(struct interp *table, const char *msg, int len)
 {
 	int start, end, tz = 0;
diff --git a/git-compat-util.h b/git-compat-util.h
index e3cf3703bb..bd93b62578 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -189,6 +189,19 @@ static inline void *xmalloc(size_t size)
 	return ret;
 }
 
+static inline char *xstrndup(const char *str, size_t len)
+{
+	char *p;
+
+	p = memchr(str, '\0', len);
+	if (p)
+		len = p - str;
+	p = xmalloc(len + 1);
+	memcpy(p, str, len);
+	p[len] = '\0';
+	return p;
+}
+
 static inline void *xrealloc(void *ptr, size_t size)
 {
 	void *ret = realloc(ptr, size);
-- 
2.48.1