diff options
author | Karl Williamson <khw@cpan.org> | 2018-01-10 22:35:12 -0700 |
---|---|---|
committer | Karl Williamson <khw@cpan.org> | 2018-01-31 06:33:03 -0700 |
commit | 6de6aebdf89cb5abd8296cf686184e4b9461d11b (patch) | |
tree | 05707342df15cc53eeb1fd400d1d639d8b679411 /ext | |
parent | 6c9ff7e96e919b8b1290145c5f7c63b8f52365bc (diff) | |
download | perl-6de6aebdf89cb5abd8296cf686184e4b9461d11b.tar.gz |
POSIX.xs: Prefer mbrtowc() over mbtowc()
mbrtowc is reentrant, so use it on threaded perls if available when
POSIX::mbtowc() is called.
Diffstat (limited to 'ext')
-rw-r--r-- | ext/POSIX/POSIX.xs | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/ext/POSIX/POSIX.xs b/ext/POSIX/POSIX.xs index 07864edf4f..7d481c41f3 100644 --- a/ext/POSIX/POSIX.xs +++ b/ext/POSIX/POSIX.xs @@ -3285,6 +3285,21 @@ mbtowc(pwc, s, n) wchar_t * pwc char * s size_t n + PREINIT: +#if defined(USE_ITHREADS) && defined(HAS_MBRTOWC) + mbstate_t ps; +#endif + CODE: +#if defined(USE_ITHREADS) && defined(HAS_MBRTOWC) + memset(&ps, 0, sizeof(ps));; + PERL_UNUSED_RESULT(mbrtowc(pwc, NULL, 0, &ps));/* Reset any shift state */ + errno = 0; + RETVAL = mbrtowc(pwc, s, n, &ps); /* Prefer reentrant version */ +#else + RETVAL = mbtowc(pwc, s, n); +#endif + OUTPUT: + RETVAL int wcstombs(s, pwcs, n) |