diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2023-02-22 12:03:03 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2023-02-22 12:03:03 +0300 |
commit | f3f20038c480e43ae264b760f4d8b14b618ca973 (patch) | |
tree | 0ac985cb83b8d745b20ae20b9bb018e55138b42d /winsup/cygwin/strfuncs.cc | |
parent | 4349a1e4db294808b11a1bb50594c5ea1072d000 (diff) |
Cygwin: glob: perform correct utf-32 -> multibyte conversion
g_Ctoc, converting the UTF-32 filenames to multibyte, still
used UTF-16 to multibyte conversion. Introduce a wirtomb
helper and fix that.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin/strfuncs.cc')
-rw-r--r-- | winsup/cygwin/strfuncs.cc | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/winsup/cygwin/strfuncs.cc b/winsup/cygwin/strfuncs.cc index e343a2fcc..80e3eb0ad 100644 --- a/winsup/cygwin/strfuncs.cc +++ b/winsup/cygwin/strfuncs.cc @@ -129,6 +129,25 @@ wcintowcs (wchar_t *dest, wint_t *src, size_t len) *dest = '\0'; } +/* replacement function for wcrtomb, converting a UTF-32 char to a + multibyte string. */ +extern "C" size_t +wirtomb (char *s, wint_t wi, mbstate_t *ps) +{ + wchar_t wc[3] = { (wchar_t) wi, '\0', '\0' }; + const wchar_t *wcp = wc; + size_t nwc = 1; + + if (wi >= 0x10000) + { + wi -= 0x10000; + wc[0] = (wi >> 10) + 0xd800; + wc[1] = (wi & 0x3ff) + 0xdc00; + nwc = 2; + } + return wcsnrtombs (s, &wcp, nwc, SIZE_MAX, ps); +} + /* replacement function for mbrtowc, returning a wint_t representing a UTF-32 value. */ extern "C" size_t |