aboutsummaryrefslogtreecommitdiff
path: root/src/string.cpp
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-10-30 10:54:26 +0000
committergingerBill <gingerBill@users.noreply.github.com>2025-10-30 10:54:26 +0000
commit35a28053b8779ea7ab9845c31ad52fd55888667a (patch)
tree0808c843adc86b33da72bfa2739ca0f5597a6532 /src/string.cpp
parentbb44b02b3e220d7019aba8b547a6d3e6fbd49dba (diff)
parent074a8d7df5e024117d7f91944ccf053cad27ca0e (diff)
Merge branch 'master' into vendor/curl
Diffstat (limited to 'src/string.cpp')
-rw-r--r--src/string.cpp25
1 files changed, 15 insertions, 10 deletions
diff --git a/src/string.cpp b/src/string.cpp
index 2087a5fee..9c08114a7 100644
--- a/src/string.cpp
+++ b/src/string.cpp
@@ -633,23 +633,28 @@ gb_internal String normalize_path(gbAllocator a, String const &path, String cons
return WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, widechar_input, input_length, output, output_size, nullptr, nullptr);
}
#elif defined(GB_SYSTEM_UNIX) || defined(GB_SYSTEM_OSX)
-
- #include <iconv.h>
+ #include <wchar.h>
gb_internal int convert_multibyte_to_widechar(char const *multibyte_input, usize input_length, wchar_t *output, usize output_size) {
- iconv_t conv = iconv_open("WCHAR_T", "UTF-8");
- size_t result = iconv(conv, cast(char **)&multibyte_input, &input_length, cast(char **)&output, &output_size);
- iconv_close(conv);
+ String string = copy_string(heap_allocator(), make_string(cast(u8 const*)multibyte_input, input_length)); /* Guarantee NULL terminator */
+ u8* input = string.text;
+
+ mbstate_t ps = { 0 };
+ size_t result = mbsrtowcs(output, cast(const char**)&input, output_size, &ps);
- return cast(int)result;
+ gb_free(heap_allocator(), string.text);
+ return (result == (size_t)-1) ? -1 : (int)result;
}
gb_internal int convert_widechar_to_multibyte(wchar_t const *widechar_input, usize input_length, char* output, usize output_size) {
- iconv_t conv = iconv_open("UTF-8", "WCHAR_T");
- size_t result = iconv(conv, cast(char**) &widechar_input, &input_length, cast(char **)&output, &output_size);
- iconv_close(conv);
+ String string = copy_string(heap_allocator(), make_string(cast(u8 const*)widechar_input, input_length)); /* Guarantee NULL terminator */
+ u8* input = string.text;
+
+ mbstate_t ps = { 0 };
+ size_t result = wcsrtombs(output, cast(const wchar_t**)&input, output_size, &ps);
- return cast(int)result;
+ gb_free(heap_allocator(), string.text);
+ return (result == (size_t)-1) ? -1 : (int)result;
}
#else
#error Implement system