mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
parent
1813076c44
commit
13352c00f1
@ -1304,6 +1304,7 @@ static int utf_strnicmp(const char_u *s1, const char_u *s2, size_t n1,
|
|||||||
# define CP_UTF8 65001 /* magic number from winnls.h */
|
# define CP_UTF8 65001 /* magic number from winnls.h */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/// Reassigns `strw` to a new, allocated pointer to a UTF16 string.
|
||||||
int utf8_to_utf16(const char *str, WCHAR **strw)
|
int utf8_to_utf16(const char *str, WCHAR **strw)
|
||||||
FUNC_ATTR_NONNULL_ALL
|
FUNC_ATTR_NONNULL_ALL
|
||||||
{
|
{
|
||||||
@ -1345,11 +1346,12 @@ int utf8_to_utf16(const char *str, WCHAR **strw)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Reassigns `str` to a new, allocated pointer to a UTF8 string.
|
||||||
int utf16_to_utf8(const WCHAR *strw, char **str)
|
int utf16_to_utf8(const WCHAR *strw, char **str)
|
||||||
FUNC_ATTR_NONNULL_ALL
|
FUNC_ATTR_NONNULL_ALL
|
||||||
{
|
{
|
||||||
// Compute the space required to store the string as UTF-8.
|
// Compute the space required to store the string as UTF-8.
|
||||||
ssize_t utf8_len = WideCharToMultiByte(CP_UTF8,
|
DWORD utf8_len = WideCharToMultiByte(CP_UTF8,
|
||||||
0,
|
0,
|
||||||
strw,
|
strw,
|
||||||
-1,
|
-1,
|
||||||
@ -1361,24 +1363,23 @@ int utf16_to_utf8(const WCHAR *strw, char **str)
|
|||||||
return GetLastError();
|
return GetLastError();
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t buf_sz = utf8_len * sizeof(char);
|
*str = xmalloc(utf8_len);
|
||||||
char *buf = xmalloc(buf_sz);
|
|
||||||
char *pos = buf;
|
|
||||||
|
|
||||||
// Convert string to UTF-8.
|
// Convert to UTF-8.
|
||||||
int r = WideCharToMultiByte(CP_UTF8,
|
utf8_len = WideCharToMultiByte(CP_UTF8,
|
||||||
0,
|
0,
|
||||||
strw,
|
strw,
|
||||||
-1,
|
-1,
|
||||||
pos,
|
*str,
|
||||||
utf8_len,
|
utf8_len,
|
||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
assert(r == utf8_len);
|
if (utf8_len == 0) {
|
||||||
if (r != utf8_len) {
|
free(*str);
|
||||||
EMSG2("WideCharToMultiByte failed: %d", r);
|
*str = NULL;
|
||||||
|
return GetLastError();
|
||||||
}
|
}
|
||||||
*str = pos;
|
(*str)[utf8_len] = '\0';
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -118,7 +118,6 @@ char *os_getenvname_at_index(size_t index)
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Get the process ID of the Neovim process.
|
/// Get the process ID of the Neovim process.
|
||||||
///
|
///
|
||||||
/// @return the process ID.
|
/// @return the process ID.
|
||||||
@ -145,10 +144,27 @@ void os_get_hostname(char *hostname, size_t size)
|
|||||||
} else {
|
} else {
|
||||||
xstrlcpy(hostname, vutsname.nodename, size);
|
xstrlcpy(hostname, vutsname.nodename, size);
|
||||||
}
|
}
|
||||||
|
#elif defined(WIN32)
|
||||||
|
WCHAR host_utf16[MAX_COMPUTERNAME_LENGTH + 1];
|
||||||
|
DWORD host_wsize = sizeof(host_utf16) / sizeof(host_utf16[0]);
|
||||||
|
if (GetComputerNameW(host_utf16, &host_wsize) == 0) {
|
||||||
|
*hostname = '\0';
|
||||||
|
DWORD err = GetLastError();
|
||||||
|
EMSG2("GetComputerNameW failed: %d", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
host_utf16[host_wsize] = '\0';
|
||||||
|
|
||||||
|
char *host_utf8;
|
||||||
|
int conversion_result = utf16_to_utf8(host_utf16, &host_utf8);
|
||||||
|
if (conversion_result != 0) {
|
||||||
|
EMSG2("utf16_to_utf8 failed: %d", conversion_result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
xstrlcpy(hostname, host_utf8, size);
|
||||||
|
xfree(host_utf8);
|
||||||
#else
|
#else
|
||||||
// TODO(unknown): Implement this for windows.
|
EMSG("os_get_hostname failed: missing uname()");
|
||||||
// See the implementation used in vim:
|
|
||||||
// https://code.google.com/p/vim/source/browse/src/os_win32.c?r=6b69d8dde19e32909f4ee3a6337e6a2ecfbb6f72#2899
|
|
||||||
*hostname = '\0';
|
*hostname = '\0';
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -1009,7 +1009,7 @@ char *os_resolve_shortcut(const char *fname)
|
|||||||
WCHAR *p;
|
WCHAR *p;
|
||||||
const int conversion_result = utf8_to_utf16(fname, &p);
|
const int conversion_result = utf8_to_utf16(fname, &p);
|
||||||
if (conversion_result != 0) {
|
if (conversion_result != 0) {
|
||||||
EMSG2("utf8_to_utf16 failed: %s", uv_strerror(conversion_result));
|
EMSG2("utf8_to_utf16 failed: %d", conversion_result);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
|
17
test/functional/eval/hostname_spec.lua
Normal file
17
test/functional/eval/hostname_spec.lua
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
local helpers = require('test.functional.helpers')(after_each)
|
||||||
|
local ok = helpers.ok
|
||||||
|
local call = helpers.call
|
||||||
|
local clear = helpers.clear
|
||||||
|
|
||||||
|
describe('hostname()', function()
|
||||||
|
before_each(clear)
|
||||||
|
|
||||||
|
it('returns hostname string', function()
|
||||||
|
local actual = call('hostname')
|
||||||
|
ok(string.len(actual) > 1)
|
||||||
|
if call('executable', 'hostname') == 1 then
|
||||||
|
local expected = string.gsub(call('system', 'hostname'), '[\n\r]', '')
|
||||||
|
helpers.eq(expected, actual)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end)
|
Loading…
Reference in New Issue
Block a user