From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2155) id AD4DB3858C30; Wed, 22 Feb 2023 11:21:14 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AD4DB3858C30 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677064874; bh=BCya6fRs5uyINWaVUKYhNZV7x4SEECEAgGIaqf2c4RY=; h=From:To:Subject:Date:From; b=NymtGG5lrtUkbjXCzV6e2+kW1rWKKJD+ZdhFRM+jL/UPK16n6Uil5d4jkgWCmCKFK kKmIjfA65NFk7LoV/8Z/QjNGK5esNH3MCfCZjnmS25EZCNgWuNtSLqMWZarMnncq4p msH+jbmRduQQ+l9gTKssCb2enqosfNFXRWDbQ1Uc= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Corinna Vinschen To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin/main] Cygwin: glob: perform correct utf-32 -> multibyte conversion X-Act-Checkin: newlib-cygwin X-Git-Author: Corinna Vinschen X-Git-Refname: refs/heads/main X-Git-Oldrev: 4349a1e4db294808b11a1bb50594c5ea1072d000 X-Git-Newrev: f3f20038c480e43ae264b760f4d8b14b618ca973 Message-Id: <20230222112114.AD4DB3858C30@sourceware.org> Date: Wed, 22 Feb 2023 11:21:14 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dnewlib-cygwin.git;h=3Df3f20038c48= 0e43ae264b760f4d8b14b618ca973 commit f3f20038c480e43ae264b760f4d8b14b618ca973 Author: Corinna Vinschen AuthorDate: Wed Feb 22 10:03:03 2023 +0100 Commit: Corinna Vinschen CommitDate: Wed Feb 22 10:03:03 2023 +0100 Cygwin: glob: perform correct utf-32 -> multibyte conversion =20 g_Ctoc, converting the UTF-32 filenames to multibyte, still used UTF-16 to multibyte conversion. Introduce a wirtomb helper and fix that. =20 Signed-off-by: Corinna Vinschen Diff: --- winsup/cygwin/glob.cc | 2 +- winsup/cygwin/local_includes/wchar.h | 4 ++++ winsup/cygwin/strfuncs.cc | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/glob.cc b/winsup/cygwin/glob.cc index 8bcdd61b2032..2f86e46985d7 100644 --- a/winsup/cygwin/glob.cc +++ b/winsup/cygwin/glob.cc @@ -1024,7 +1024,7 @@ g_Ctoc(const Char *str, char *buf, size_t len) =20 memset(&mbs, 0, sizeof(mbs)); while (len >=3D (size_t) MB_CUR_MAX) { - clen =3D wcrtomb(buf, *str, &mbs); + clen =3D wirtomb(buf, *str, &mbs); if (clen =3D=3D (size_t)-1) return (1); if (*str =3D=3D L'\0') diff --git a/winsup/cygwin/local_includes/wchar.h b/winsup/cygwin/local_inc= ludes/wchar.h index 6f2a4ad10f20..3907732a260f 100644 --- a/winsup/cygwin/local_includes/wchar.h +++ b/winsup/cygwin/local_includes/wchar.h @@ -44,6 +44,10 @@ extern wctomb_f __utf8_wctomb; for surrogate pairs, plus a wchar_t NUL. */ void wcintowcs (wchar_t *, wint_t *, size_t); =20 +/* replacement function for wcrtomb, converting a UTF-32 char to a + multibyte string. */ +size_t wirtomb (char *, wint_t, mbstate_t *); + /* replacement function for mbrtowc, returning a wint_t representing a UTF-32 value. Defined in strfuncs.cc */ extern size_t mbrtowi (wint_t *, const char *, size_t, mbstate_t *); diff --git a/winsup/cygwin/strfuncs.cc b/winsup/cygwin/strfuncs.cc index e343a2fcc6e8..80e3eb0ad6a8 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 =3D '\0'; } =20 +/* 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] =3D { (wchar_t) wi, '\0', '\0' }; + const wchar_t *wcp =3D wc; + size_t nwc =3D 1; + + if (wi >=3D 0x10000) + { + wi -=3D 0x10000; + wc[0] =3D (wi >> 10) + 0xd800; + wc[1] =3D (wi & 0x3ff) + 0xdc00; + nwc =3D 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