mbyte.c: Move utf8/utf16 functions to mbyte.c

This commit is contained in:
Justin M. Keyes 2016-07-30 14:00:06 -04:00
parent 23aadb6948
commit f2d5ba65b5
2 changed files with 87 additions and 78 deletions

View File

@ -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

View File

@ -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