aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/mbyte.c80
-rw-r--r--src/nvim/os/fs.c85
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