function executable() is too slow on windows. it seems that using
SearchPath() API.
SearchPath() tries following sequence if lp.
1. Location at executable.
2. Current directory
3. Windows System Direction which can get with GetSystemDirectory().
4. Windows Directory.
5. Specified as PATH environment variable.
* see remarks at
http://msdn.microsoft.com/en-us/library/aa365527%28VS.85%29.aspx
I guess that No3, No4, No5 is duplicated and I guess that No5 include
No3 and No4.
For size, I tried following patch and function executable() had few
speed-up. :-)
If i use netrw.vim then it took 3 seconds for getting password prompt
from type ':e ftp://xxx'.
But it took 1.5 seconds for them with following patch.
Thanks.
Index: src/os_win32.c
===================================================================
--- src/os_win32.c (revision 1326)
+++ src/os_win32.c (working copy)
@@ -1594,7 +1594,7 @@
if (p != NULL)
{
- n = (long)SearchPathW(NULL, p, NULL, _MAX_PATH, fnamew, &dumw);
+ n = (long)SearchPathW(_wgetenv(L"PATH"), p, NULL, _MAX_PATH,
fnamew, &dumw);
vim_free(p);
if (n > 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
{
@@ -1608,7 +1608,7 @@
}
}
#endif
- if (SearchPath(NULL, name, NULL, _MAX_PATH, fname, &dum) == 0)
+ if (SearchPath(getenv("PATH"), name, NULL, _MAX_PATH, fname, &dum) == 0)
return FALSE;
if (mch_isdir(fname))
return FALSE;
--
- Yasuhiro Matsumoto
---------------------
function executable() is too slow on windows. it seems that using
SearchPath() API.
SearchPath() tries following sequence if lpPath was set NULL.
---------------------
--
- Yasuhiro Matsumoto
--
- Yasuhiro Matsumoto
BTW)
I have which.exe command line program which is downloaded on
http://gnuwin32.sf.net.
It is better faster than executable(). maybe it does not use SearchPath() API.
Index: src/os_win32.c
===================================================================
--- src/os_win32.c (revision 1341)
+++ src/os_win32.c (working copy)
@@ -1583,6 +1583,8 @@
{
char *dum;
char fname[_MAX_PATH];
+ char *path, *newpath;
+ long n;
#ifdef FEAT_MBYTE
if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
@@ -1590,11 +1592,18 @@
WCHAR *p = enc_to_utf16(name, NULL);
WCHAR fnamew[_MAX_PATH];
WCHAR *dumw;
- long n;
+ WCHAR *wpath, *wnewpath;
if (p != NULL)
{
- n = (long)SearchPathW(NULL, p, NULL, _MAX_PATH, fnamew, &dumw);
+ wpath = _wgetenv(L"PATH");
+ wnewpath = (WCHAR*)alloc((unsigned)(wcslen(wpath) + 4) * sizeof(WCHAR));
+ if (wnewpath == NULL)
+ return FALSE;
+ wcscpy(wnewpath, L";.;");
+ wcscat(wnewpath, wpath);
+ n = (long)SearchPathW(wnewpath, p, NULL, _MAX_PATH, fnamew, &dumw);
+ vim_free(wnewpath);
vim_free(p);
if (n > 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
{
@@ -1608,8 +1617,17 @@
}
}
#endif
- if (SearchPath(NULL, name, NULL, _MAX_PATH, fname, &dum) == 0)
+
+ path = getenv("PATH");
+ newpath = (char*)alloc((unsigned)(STRLEN(path) + 4));
+ if (newpath == NULL)
return FALSE;
+ STRCPY(newpath, ";.;");
+ STRCAT(newpath, path);
+ n = (long)SearchPath(newpath, name, NULL, _MAX_PATH, fname, &dum);
+ vim_free(newpath);
+ if (n == 0)
+ return FALSE;
if (mch_isdir(fname))
return FALSE;
return TRUE;