Commit 8b3de0b6b8104019def3ddedcf2750539ea7409f

Sven Strickroth 2012-10-02T17:16:22

Optimized win32_nextpath Based on a suggestion by Russell Belfer. Signed-off-by: Sven Strickroth <email@cs-ware.de> Signed-off-by: Russell Belfer <rb@github.com>

diff --git a/src/fileops.c b/src/fileops.c
index cbc7419..d99e117 100644
--- a/src/fileops.c
+++ b/src/fileops.c
@@ -418,55 +418,23 @@ static int win32_find_file(git_buf *path, const struct win32_path *root, const c
 	git__free(file_utf16);
 	return 0;
 }
-
-static wchar_t * win32_nextpath(wchar_t * src, wchar_t * dst, size_t maxlen)
+static wchar_t* win32_nextpath(wchar_t *path, wchar_t *buf, size_t buflen)
 {
-	wchar_t * orgsrc;
-
-	while (*src == L';')
-		src++;
+	wchar_t term, *base = path;
 
-	orgsrc = src;
+	assert(path && buf && buflen);
 
-	if (!--maxlen)
-		goto nullterm;
+	term = (*path == L'"') ? *path++ : L';';
 
-	while (*src && *src != L';')
-	{
-		if (*src != L'"')
-		{
-			*dst++ = *src++;
-			if (!--maxlen)
-			{
-				orgsrc = src;
-				goto nullterm;
-			}
-		}
-		else
-		{
-			src++;
-			while (*src && *src != L'"')
-			{
-				*dst++ = *src++;
-				if (!--maxlen)
-				{
-					orgsrc = src;
-					goto nullterm;
-				}
-			}
-
-			if (*src)
-				src++;
-		}
-	}
+	for (buflen--; *path && *path != term && buflen; buflen--)
+		*buf++ = *path++;
 
-	while (*src == L';')
-		src++;
+	*buf = L'\0'; /* reserved a byte via initial subtract */
 
-nullterm:
-	*dst = 0;
+	while (*path == term || *path == L';')
+		path++;
 
-	return (orgsrc != src) ? (wchar_t *)src : NULL;
+	return (path != base) ? path : NULL;
 }
 
 static int win32_find_system_file_using_path(git_buf *path, const char *filename)