diff options
-rw-r--r-- | src/nvim/mbyte.c | 80 | ||||
-rw-r--r-- | src/nvim/os/fs.c | 85 |
2 files changed, 87 insertions, 78 deletions
diff --git a/src/nvim/mbyte.c b/src/nvim/mbyte.c index 0ba9f8b076..26d94aa6fa 100644 --- a/src/nvim/mbyte.c +++ b/src/nvim/mbyte.c @@ -1885,6 +1885,86 @@ static int utf_strnicmp(char_u *s1, char_u *s2, size_t n1, size_t n2) return n1 == 0 ? -1 : 1; } +#ifdef WIN32 +#ifndef CP_UTF8 +# define CP_UTF8 65001 /* magic number from winnls.h */ +#endif + +int utf8_to_utf16(const char *str, WCHAR **strw) + FUNC_ATTR_NONNULL_ALL +{ + ssize_t wchar_len = 0; + + // Compute the length needed to store the converted widechar string. + wchar_len = MultiByteToWideChar(CP_UTF8, + 0, // dwFlags: must be 0 for utf8 + str, // lpMultiByteStr: string to convert + -1, // -1 => process up to NUL + NULL, // lpWideCharStr: converted string + 0); // 0 => return length, don't convert + if (wchar_len == 0) { + return GetLastError(); + } + + ssize_t buf_sz = wchar_len * sizeof(WCHAR); + + if (buf_sz == 0) { + *strw = NULL; + return 0; + } + + char *buf = xmalloc(buf_sz); + char *pos = buf; + + int r = MultiByteToWideChar(CP_UTF8, + 0, + str, + -1, + (WCHAR *)pos, + wchar_len); + assert(r == wchar_len); + *strw = (WCHAR *)pos; + + return 0; +} + +int utf16_to_utf8(const WCHAR *strw, char **str) + FUNC_ATTR_NONNULL_ALL +{ + // Compute the space required to store the string as UTF-8. + ssize_t utf8_len = WideCharToMultiByte(CP_UTF8, + 0, + strw, + -1, + NULL, + 0, + NULL, + NULL); + if (utf8_len == 0) { + return GetLastError(); + } + + ssize_t buf_sz = utf8_len * sizeof(char); + char *buf = xmalloc(buf_sz); + char *pos = buf; + + // Convert string to UTF-8. + int r = WideCharToMultiByte(CP_UTF8, + 0, + strw, + -1, + (LPSTR *)pos, + utf8_len, + NULL, + NULL); + assert(r == utf8_len); + *str = pos; + + return 0; +} + +#endif + /* * Version of strnicmp() that handles multi-byte characters. * Needed for Big5, Shift-JIS and UTF-8 encoding. Other DBCS encodings can diff --git a/src/nvim/os/fs.c b/src/nvim/os/fs.c index ce43eb9422..5a990cd042 100644 --- a/src/nvim/os/fs.c +++ b/src/nvim/os/fs.c @@ -25,6 +25,10 @@ #include "nvim/path.h" #include "nvim/strings.h" +#ifdef WIN32 +#include "nvim/mbyte.h" // for utf8_to_utf16, utf16_to_utf8 +#endif + #ifdef INCLUDE_GENERATED_DECLARATIONS # include "os/fs.c.generated.h" #endif @@ -931,82 +935,6 @@ bool os_fileid_equal_fileinfo(const FileID *file_id, #ifdef WIN32 # include <shlobj.h> -#ifndef CP_UTF8 -# define CP_UTF8 65001 /* magic number from winnls.h */ -#endif - -static int utf8_to_utf16(const char *str, WCHAR **strw) - FUNC_ATTR_NONNULL_ALL -{ - ssize_t wchar_len = 0; - - // Compute the length needed to store the converted widechar string. - wchar_len = MultiByteToWideChar(CP_UTF8, - 0, // dwFlags: must be 0 for utf8 - str, // lpMultiByteStr: string to convert - -1, // -1 => process up to NUL - NULL, // lpWideCharStr: converted string - 0); // 0 => return length, don't convert - if (wchar_len == 0) { - return GetLastError(); - } - - ssize_t buf_sz = wchar_len * sizeof(WCHAR); - - if (buf_sz == 0) { - *strw = NULL; - return 0; - } - - char* buf = xmalloc(buf_sz); - char* pos = buf; - - int r = MultiByteToWideChar(CP_UTF8, - 0, - str, - -1, - (WCHAR*) pos, - wchar_len); - assert(r == wchar_len); - *strw = (WCHAR*) pos; - - return 0; -} - -static int utf16_to_utf8(const WCHAR *strw, char **str) - FUNC_ATTR_NONNULL_ALL -{ - // Compute the space required to store the string as UTF-8. - ssize_t utf8_len = WideCharToMultiByte(CP_UTF8, - 0, - strw, - -1, - NULL, - 0, - NULL, - NULL); - if (utf8_len == 0) { - return GetLastError(); - } - - ssize_t buf_sz = utf8_len * sizeof(char); - char* buf = xmalloc(buf_sz); - char* pos = buf; - - // Convert string to UTF-8. - int r = WideCharToMultiByte(CP_UTF8, - 0, - strw, - -1, - (LPSTR*) pos, - utf8_len, - NULL, - NULL); - assert(r == utf8_len); - *str = pos; - - return 0; -} /// When "fname" is the name of a shortcut (*.lnk) resolve the file it points /// to and return that name in allocated memory. @@ -1035,7 +963,7 @@ char_u * os_resolve_shortcut(char_u *fname) // create a link manager object and request its interface hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, - &IID_IShellLinkW, (void**)&pslw); + &IID_IShellLinkW, (void **)&pslw); if (hr == S_OK) { WCHAR *p; //TODO(jkeyes): if this returns non-zero, report the error @@ -1044,7 +972,7 @@ char_u * os_resolve_shortcut(char_u *fname) if (p != NULL) { // Get a pointer to the IPersistFile interface. hr = pslw->lpVtbl->QueryInterface( - pslw, &IID_IPersistFile, (void**)&ppf); + pslw, &IID_IPersistFile, (void **)&ppf); if (hr != S_OK) { goto shortcut_errorw; } @@ -1088,4 +1016,5 @@ shortcut_end: CoUninitialize(); return rfname; } + #endif |