summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorKarl Williamson <khw@cpan.org>2018-01-10 22:35:12 -0700
committerKarl Williamson <khw@cpan.org>2018-01-31 06:33:03 -0700
commit6de6aebdf89cb5abd8296cf686184e4b9461d11b (patch)
tree05707342df15cc53eeb1fd400d1d639d8b679411 /ext
parent6c9ff7e96e919b8b1290145c5f7c63b8f52365bc (diff)
downloadperl-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.xs15
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)