diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-08-30 17:11:33 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-08-30 17:11:33 +0200 |
commit | 4dee1bb0dbcfd4c8aa22533f99603dd337b73ab0 (patch) | |
tree | 6449a545ee94a04e53504a3a71b73526091a0f3f | |
parent | 4e4f529792c27442b7ad7222cff329907ec389fe (diff) | |
download | vim-git-4dee1bb0dbcfd4c8aa22533f99603dd337b73ab0.tar.gz |
updated for version 7.4.015v7.4.015
Problem: MS-Windows: Detecting node type does not work for multi-byte
characters.
Solution: Use wide character function when needed. (Ken Takata)
-rw-r--r-- | src/os_win32.c | 44 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 39 insertions, 7 deletions
diff --git a/src/os_win32.c b/src/os_win32.c index 4013353cf..33a72565a 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -3107,6 +3107,9 @@ mch_nodetype(char_u *name) { HANDLE hFile; int type; +#ifdef FEAT_MBYTE + WCHAR *wn = NULL; +#endif /* We can't open a file with a name "\\.\con" or "\\.\prn" and trying to * read from it later will cause Vim to hang. Thus return NODE_WRITABLE @@ -3114,14 +3117,41 @@ mch_nodetype(char_u *name) if (STRNCMP(name, "\\\\.\\", 4) == 0) return NODE_WRITABLE; - hFile = CreateFile(name, /* file name */ - GENERIC_WRITE, /* access mode */ - 0, /* share mode */ - NULL, /* security descriptor */ - OPEN_EXISTING, /* creation disposition */ - 0, /* file attributes */ - NULL); /* handle to template file */ +#ifdef FEAT_MBYTE + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + { + wn = enc_to_utf16(name, NULL); + if (wn != NULL) + { + hFile = CreateFileW(wn, /* file name */ + GENERIC_WRITE, /* access mode */ + 0, /* share mode */ + NULL, /* security descriptor */ + OPEN_EXISTING, /* creation disposition */ + 0, /* file attributes */ + NULL); /* handle to template file */ + if (hFile == INVALID_HANDLE_VALUE + && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + /* Retry with non-wide function (for Windows 98). */ + vim_free(wn); + wn = NULL; + } + } + } + if (wn == NULL) +#endif + hFile = CreateFile(name, /* file name */ + GENERIC_WRITE, /* access mode */ + 0, /* share mode */ + NULL, /* security descriptor */ + OPEN_EXISTING, /* creation disposition */ + 0, /* file attributes */ + NULL); /* handle to template file */ +#ifdef FEAT_MBYTE + vim_free(wn); +#endif if (hFile == INVALID_HANDLE_VALUE) return NODE_NORMAL; diff --git a/src/version.c b/src/version.c index e8b935966..fb1459331 100644 --- a/src/version.c +++ b/src/version.c @@ -739,6 +739,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 15, +/**/ 14, /**/ 13, |