Commits

Anonymous committed 5094102

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>

Comments (0)

Files changed (2)

 	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;

git-compat-util.h

 	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);