diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-04-06 22:56:28 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-04-06 22:56:28 +0200 |
commit | c74fbfedfa2df384cca5f6763e2c9e5c0ca6d513 (patch) | |
tree | 7a0441a2dc781a5d0cf2031702f3622d688d920a /src/filepath.c | |
parent | 00d253e2b2f435a5386582c3f857008e7ac355c2 (diff) | |
download | vim-git-c74fbfedfa2df384cca5f6763e2c9e5c0ca6d513.tar.gz |
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.c | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/src/filepath.c b/src/filepath.c index 15372af8e..c37455e85 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(®match, p, (colnr_T)0)) + && (vim_regexec(®match, p, (colnr_T)0) + || (p_alt != NULL + && vim_regexec(®match, 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); |