summaryrefslogtreecommitdiffstats
path: root/src/os_mswin.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-12-11 20:10:50 +0100
committerBram Moolenaar <Bram@vim.org>2020-12-11 20:10:50 +0100
commit0ea7421ae6618fe8efe9e3afc8fdcf7a4d89739a (patch)
tree5ea2bb73090fb5ef95c6108b518dc53bba3eadd0 /src/os_mswin.c
parent100118c73ac068137cd298d22953896242752523 (diff)
patch 8.2.2129: MS-Windows: Checking if a file name is absolute is slowv8.2.2129
Problem: MS-Windows: Checking if a file name is absolute is slow. Solution: Do not use mch_FullName(). (closes #7033)
Diffstat (limited to 'src/os_mswin.c')
-rw-r--r--src/os_mswin.c22
1 files changed, 7 insertions, 15 deletions
diff --git a/src/os_mswin.c b/src/os_mswin.c
index 80009533c6..096ac1bc5b 100644
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -387,21 +387,13 @@ mch_FullName(
int
mch_isFullName(char_u *fname)
{
- // WinNT and later can use _MAX_PATH wide characters for a pathname, which
- // means that the maximum pathname is _MAX_PATH * 3 bytes when 'enc' is
- // UTF-8.
- char szName[_MAX_PATH * 3 + 1];
-
- // A name like "d:/foo" and "//server/share" is absolute
- if ((fname[0] && fname[1] == ':' && (fname[2] == '/' || fname[2] == '\\'))
- || (fname[0] == fname[1] && (fname[0] == '/' || fname[0] == '\\')))
- return TRUE;
-
- // A name that can't be made absolute probably isn't absolute.
- if (mch_FullName(fname, (char_u *)szName, sizeof(szName) - 1, FALSE) == FAIL)
- return FALSE;
-
- return pathcmp((const char *)fname, (const char *)szName, -1) == 0;
+ // A name like "d:/foo" and "//server/share" is absolute. "d:foo" is not.
+ // Another way to check is to use mch_FullName() and see if the result is
+ // the same as the name or mch_FullName() fails. However, this has quite a
+ // bit of overhead, so let's not do that.
+ return ((ASCII_ISALPHA(fname[0]) && fname[1] == ':'
+ && (fname[2] == '/' || fname[2] == '\\'))
+ || (fname[0] == fname[1] && (fname[0] == '/' || fname[0] == '\\')));
}
/*