summaryrefslogtreecommitdiffstats
path: root/src/filepath.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-04-06 22:56:28 +0200
committerBram Moolenaar <Bram@vim.org>2020-04-06 22:56:28 +0200
commitc74fbfedfa2df384cca5f6763e2c9e5c0ca6d513 (patch)
tree7a0441a2dc781a5d0cf2031702f3622d688d920a /src/filepath.c
parent00d253e2b2f435a5386582c3f857008e7ac355c2 (diff)
patch 8.2.0524: Win32: searching for file matches is slowv8.2.0524
Problem: Win32: searching for file matches is slow. Solution: Instead of making another round to find any short filename, check for the short name right away. Avoid using an ordinary file like a directory. (Nir Lichtman, closes #5883)
Diffstat (limited to 'src/filepath.c')
-rw-r--r--src/filepath.c33
1 files changed, 15 insertions, 18 deletions
diff --git a/src/filepath.c b/src/filepath.c
index 15372af8e2..c37455e852 100644
--- a/src/filepath.c
+++ b/src/filepath.c
@@ -64,6 +64,7 @@ get_short_pathname(char_u **fnamep, char_u **bufp, int *fnamelen)
if (l != 0)
{
char_u *p = utf16_to_enc(newbuf, NULL);
+
if (p != NULL)
{
vim_free(*bufp);
@@ -3047,6 +3048,7 @@ dos_expandpath(
WCHAR *wn = NULL; // UCS-2 name, NULL when not used.
char_u *matchname;
int ok;
+ char_u *p_alt;
// Expanding "**" may take a long time, check for CTRL-C.
if (stardepth > 0)
@@ -3161,9 +3163,15 @@ dos_expandpath(
while (ok)
{
p = utf16_to_enc(wfb.cFileName, NULL); // p is allocated here
+
if (p == NULL)
break; // out of memory
+ if (*wfb.cAlternateFileName == NUL)
+ p_alt == NULL;
+ else
+ p_alt = utf16_to_enc(wfb.cAlternateFileName, NULL);
+
// Ignore entries starting with a dot, unless when asked for. Accept
// all entries found with "matchname".
if ((p[0] != '.' || starts_with_dot
@@ -3171,14 +3179,18 @@ dos_expandpath(
&& p[1] != NUL && (p[1] != '.' || p[2] != NUL)))
&& (matchname == NULL
|| (regmatch.regprog != NULL
- && vim_regexec(&regmatch, p, (colnr_T)0))
+ && (vim_regexec(&regmatch, p, (colnr_T)0)
+ || (p_alt != NULL
+ && vim_regexec(&regmatch, p_alt, (colnr_T)0)))
+ ))
|| ((flags & EW_NOTWILD)
&& fnamencmp(path + (s - buf), p, e - s) == 0)))
{
STRCPY(s, p);
len = (int)STRLEN(buf);
- if (starstar && stardepth < 100)
+ if (starstar && stardepth < 100
+ && (wfb.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
// For "**" in the pattern first go deeper in the tree to
// find matches.
@@ -3207,24 +3219,9 @@ dos_expandpath(
}
}
+ vim_free(p_alt);
vim_free(p);
ok = FindNextFileW(hFind, &wfb);
-
- // If no more matches and no match was used, try expanding the name
- // itself. Finds the long name of a short filename.
- if (!ok && matchname != NULL && gap->ga_len == start_len)
- {
- STRCPY(s, matchname);
- FindClose(hFind);
- vim_free(wn);
- wn = enc_to_utf16(buf, NULL);
- if (wn != NULL)
- hFind = FindFirstFileW(wn, &wfb);
- else
- hFind = INVALID_HANDLE_VALUE;
- ok = (hFind != INVALID_HANDLE_VALUE);
- VIM_CLEAR(matchname);
- }
}
FindClose(hFind);