Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2023-02-22 12:03:03 +0300
committerCorinna Vinschen <corinna@vinschen.de>2023-02-22 12:03:03 +0300
commitf3f20038c480e43ae264b760f4d8b14b618ca973 (patch)
tree0ac985cb83b8d745b20ae20b9bb018e55138b42d /winsup/cygwin/strfuncs.cc
parent4349a1e4db294808b11a1bb50594c5ea1072d000 (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.cc19
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