+\r
+static LPTSTR nextpath(LPCTSTR src, LPTSTR dst, UINT maxlen)\r
+{\r
+ LPCTSTR orgsrc;\r
+\r
+ while (*src == _T(';'))\r
+ src++;\r
+\r
+ orgsrc = src;\r
+\r
+ if (!--maxlen)\r
+ goto nullterm;\r
+\r
+ while (*src && *src != _T(';'))\r
+ {\r
+ if (*src != _T('"'))\r
+ {\r
+ *dst++ = *src++;\r
+ if (!--maxlen)\r
+ {\r
+ orgsrc = src;\r
+ goto nullterm;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ src++;\r
+ while (*src && *src != _T('"'))\r
+ {\r
+ *dst++ = *src++;\r
+ if (!--maxlen)\r
+ {\r
+ orgsrc = src;\r
+ goto nullterm;\r
+ }\r
+ }\r
+\r
+ if (*src)\r
+ src++;\r
+ }\r
+ }\r
+\r
+ while (*src == _T(';'))\r
+ src++;\r
+\r
+nullterm:\r
+\r
+ *dst = 0;\r
+\r
+ return (orgsrc != src) ? (LPTSTR)src : NULL;\r
+}\r
+\r
+static inline BOOL FileExists(LPCTSTR lpszFileName)\r
+{\r
+ struct _stat st;\r
+ return _tstat(lpszFileName, &st) == 0;\r
+}\r
+\r
+static BOOL FindGitPath()\r
+{\r
+ size_t size;\r
+ _tgetenv_s(&size, NULL, 0, _T("PATH"));\r
+\r
+ if (!size)\r
+ {\r
+ return FALSE;\r
+ }\r
+\r
+ TCHAR *env = (TCHAR*)alloca(size * sizeof(TCHAR));\r
+ _tgetenv_s(&size, env, size, _T("PATH"));\r
+\r
+ TCHAR buf[_MAX_PATH];\r
+\r
+ // search in all paths defined in PATH\r
+ while ((env = nextpath(env, buf, _MAX_PATH-1)) && *buf)\r
+ {\r
+ TCHAR *pfin = buf + _tcslen(buf)-1;\r
+\r
+ // ensure trailing slash\r
+ if (*pfin != _T('/') && *pfin != _T('\\'))\r
+ _tcscpy(++pfin, _T("\\"));\r
+\r
+ const int len = _tcslen(buf);\r
+\r
+ if ((len + 7) < _MAX_PATH)\r
+ _tcscpy(pfin+1, _T("git.exe"));\r
+ else\r
+ break;\r
+\r
+ if ( FileExists(buf) )\r
+ {\r
+ // dir found\r
+ return TRUE;\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+\r