summaryrefslogtreecommitdiff
path: root/src/os_win32.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2013-08-30 17:11:33 +0200
committerBram Moolenaar <Bram@vim.org>2013-08-30 17:11:33 +0200
commit4dee1bb0dbcfd4c8aa22533f99603dd337b73ab0 (patch)
tree6449a545ee94a04e53504a3a71b73526091a0f3f /src/os_win32.c
parent4e4f529792c27442b7ad7222cff329907ec389fe (diff)
downloadvim-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)
Diffstat (limited to 'src/os_win32.c')
-rw-r--r--src/os_win32.c44
1 files changed, 37 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;