about summary refs log tree commit diff
path: root/third_party/git/compat/win32
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/git/compat/win32')
-rw-r--r--third_party/git/compat/win32/path-utils.c24
-rw-r--r--third_party/git/compat/win32/path-utils.h10
-rw-r--r--third_party/git/compat/win32/pthread.h8
3 files changed, 36 insertions, 6 deletions
diff --git a/third_party/git/compat/win32/path-utils.c b/third_party/git/compat/win32/path-utils.c
index d9d3641de8..ebf2f12eb6 100644
--- a/third_party/git/compat/win32/path-utils.c
+++ b/third_party/git/compat/win32/path-utils.c
@@ -1,5 +1,29 @@
 #include "../../git-compat-util.h"
 
+int win32_has_dos_drive_prefix(const char *path)
+{
+	int i;
+
+	/*
+	 * Does it start with an ASCII letter (i.e. highest bit not set),
+	 * followed by a colon?
+	 */
+	if (!(0x80 & (unsigned char)*path))
+		return *path && path[1] == ':' ? 2 : 0;
+
+	/*
+	 * While drive letters must be letters of the English alphabet, it is
+	 * possible to assign virtually _any_ Unicode character via `subst` as
+	 * a drive letter to "virtual drives". Even `1`, or `ä`. Or fun stuff
+	 * like this:
+	 *
+	 *      subst ֍: %USERPROFILE%\Desktop
+	 */
+	for (i = 1; i < 4 && (0x80 & (unsigned char)path[i]); i++)
+		; /* skip first UTF-8 character */
+	return path[i] == ':' ? i + 1 : 0;
+}
+
 int win32_skip_dos_drive_prefix(char **path)
 {
 	int ret = has_dos_drive_prefix(*path);
diff --git a/third_party/git/compat/win32/path-utils.h b/third_party/git/compat/win32/path-utils.h
index 0f70d43920..f2e70872cd 100644
--- a/third_party/git/compat/win32/path-utils.h
+++ b/third_party/git/compat/win32/path-utils.h
@@ -1,5 +1,9 @@
-#define has_dos_drive_prefix(path) \
-	(isalpha(*(path)) && (path)[1] == ':' ? 2 : 0)
+#ifndef WIN32_PATH_UTILS_H
+#define WIN32_PATH_UTILS_H
+
+int win32_has_dos_drive_prefix(const char *path);
+#define has_dos_drive_prefix win32_has_dos_drive_prefix
+
 int win32_skip_dos_drive_prefix(char **path);
 #define skip_dos_drive_prefix win32_skip_dos_drive_prefix
 static inline int win32_is_dir_sep(int c)
@@ -18,3 +22,5 @@ static inline char *win32_find_last_dir_sep(const char *path)
 #define find_last_dir_sep win32_find_last_dir_sep
 int win32_offset_1st_component(const char *path);
 #define offset_1st_component win32_offset_1st_component
+
+#endif
diff --git a/third_party/git/compat/win32/pthread.h b/third_party/git/compat/win32/pthread.h
index c6cb8dd219..737983d00b 100644
--- a/third_party/git/compat/win32/pthread.h
+++ b/third_party/git/compat/win32/pthread.h
@@ -50,8 +50,8 @@ typedef struct {
 	DWORD tid;
 } pthread_t;
 
-extern int pthread_create(pthread_t *thread, const void *unused,
-			  void *(*start_routine)(void*), void *arg);
+int pthread_create(pthread_t *thread, const void *unused,
+		   void *(*start_routine)(void*), void *arg);
 
 /*
  * To avoid the need of copying a struct, we use small macro wrapper to pass
@@ -59,10 +59,10 @@ extern int pthread_create(pthread_t *thread, const void *unused,
  */
 #define pthread_join(a, b) win32_pthread_join(&(a), (b))
 
-extern int win32_pthread_join(pthread_t *thread, void **value_ptr);
+int win32_pthread_join(pthread_t *thread, void **value_ptr);
 
 #define pthread_equal(t1, t2) ((t1).tid == (t2).tid)
-extern pthread_t pthread_self(void);
+pthread_t pthread_self(void);
 
 static inline void NORETURN pthread_exit(void *ret)
 {