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
path: root/winsup
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2023-08-15 23:34:29 +0300
committerCorinna Vinschen <corinna@vinschen.de>2023-08-15 23:34:29 +0300
commit46c4a9072436b01f9239bbac2e9a24bc08755026 (patch)
treea732ca85c3db086218c9bf439fb8d758cdd59fc7 /winsup
parentb5111e46424b693e04bc0e964a01f871a71c26ef (diff)
Cygwin: cXXrtomb, mbrtcXX: use function-specific internal state
As described in the previous commit b5111e46424b ("struct _reent: add state for unicode functions") every unicode conversion function has to use their own state object, if the state parameter is NULL. Fixes: 4f258c55e87f ("Cygwin: Add ISO C11 functions c16rtomb, c32rtomb, mbrtoc16, mbrtoc32.") Fixes: c49bc478b4a7 ("Cygwin: Add ISO C2X functions c8rtomb, mbrtoc8") Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/strfuncs.cc24
1 files changed, 21 insertions, 3 deletions
diff --git a/winsup/cygwin/strfuncs.cc b/winsup/cygwin/strfuncs.cc
index cbcd0ec46..66667bdb3 100644
--- a/winsup/cygwin/strfuncs.cc
+++ b/winsup/cygwin/strfuncs.cc
@@ -135,6 +135,12 @@ wcintowcs (wchar_t *dest, wint_t *src, size_t len)
extern "C" size_t
c32rtomb (char *s, char32_t wc, mbstate_t *ps)
{
+ if (ps == NULL)
+ {
+ _REENT_CHECK_MISC(_REENT);
+ ps = &(_REENT_C32RTOMB_STATE(_REENT));
+ }
+
/* If s is NULL, behave as if s pointed to an internal buffer and wc
was a null wide character (L''). wcrtomb will do that for us*/
if (wc <= 0xffff || !s)
@@ -152,6 +158,12 @@ c32rtomb (char *s, char32_t wc, mbstate_t *ps)
extern "C" size_t
c16rtomb (char *s, char16_t wc, mbstate_t *ps)
{
+ if (ps == NULL)
+ {
+ _REENT_CHECK_MISC(_REENT);
+ ps = &(_REENT_C16RTOMB_STATE(_REENT));
+ }
+
return wcrtomb (s, (wchar_t) wc, ps);
}
@@ -164,7 +176,7 @@ c8rtomb (char *s, char8_t c8, mbstate_t *ps)
if (ps == NULL)
{
_REENT_CHECK_MISC(reent);
- ps = &(_REENT_MBRTOWC_STATE(reent));
+ ps = &(_REENT_C8RTOMB_STATE(reent));
}
if (s == NULL)
@@ -258,6 +270,12 @@ mbrtoc32 (char32_t *pwc, const char *s, size_t n, mbstate_t *ps)
size_t len, len2;
wchar_t w1, w2;
+ if (ps == NULL)
+ {
+ _REENT_CHECK_MISC(_REENT);
+ ps = &(_REENT_MBRTOC32_STATE(_REENT));
+ }
+
len = mbrtowc (&w1, s, n, ps);
if (len == (size_t) -1 || len == (size_t) -2)
return len;
@@ -299,7 +317,7 @@ mbrtoc16 (char16_t *pwc, const char *s, size_t n, mbstate_t *ps)
if (ps == NULL)
{
_REENT_CHECK_MISC(reent);
- ps = &(_REENT_MBRTOWC_STATE(reent));
+ ps = &(_REENT_MBRTOC16_STATE(reent));
}
if (s == NULL)
@@ -352,7 +370,7 @@ mbrtoc8 (char8_t *pc8, const char *s, size_t n, mbstate_t *ps)
if (ps == NULL)
{
_REENT_CHECK_MISC(reent);
- ps = &(_REENT_MBRTOWC_STATE(reent));
+ ps = &(_REENT_MBRTOC8_STATE(reent));
}
if (s == NULL)