diff options
-rw-r--r-- | ext/XS-APItest/APItest.pm | 2 | ||||
-rw-r--r-- | ext/XS-APItest/APItest.xs | 7 | ||||
-rw-r--r-- | ext/XS-APItest/t/utf8.t | 9 | ||||
-rw-r--r-- | utf8.h | 5 |
4 files changed, 21 insertions, 2 deletions
diff --git a/ext/XS-APItest/APItest.pm b/ext/XS-APItest/APItest.pm index b586c8f3cd..85787d1c94 100644 --- a/ext/XS-APItest/APItest.pm +++ b/ext/XS-APItest/APItest.pm @@ -4,7 +4,7 @@ use strict; use warnings; use Carp; -our $VERSION = '1.21'; +our $VERSION = '1.22'; require XSLoader; diff --git a/ext/XS-APItest/APItest.xs b/ext/XS-APItest/APItest.xs index 088afff840..4cdcc2abc7 100644 --- a/ext/XS-APItest/APItest.xs +++ b/ext/XS-APItest/APItest.xs @@ -6200,6 +6200,13 @@ test_isPSXSPC_LC_utf8(U8 * p, int type) OUTPUT: RETVAL +STRLEN +test_UTF8_IS_REPLACEMENT(char *s, STRLEN len) + CODE: + RETVAL = UTF8_IS_REPLACEMENT(s, s + len); + OUTPUT: + RETVAL + bool test_isQUOTEMETA(UV ord) CODE: diff --git a/ext/XS-APItest/t/utf8.t b/ext/XS-APItest/t/utf8.t index 1edc02d643..50d1a4e0fd 100644 --- a/ext/XS-APItest/t/utf8.t +++ b/ext/XS-APItest/t/utf8.t @@ -1227,4 +1227,13 @@ SKIP: } } +{ + my $replacement = chr(0xFFFD); + use bytes; + is(test_UTF8_IS_REPLACEMENT($replacement, length $replacement), 1, + "UTF8_IS_REPLACEMENT returns 1 on a REPLACEMENT character"); + is(test_UTF8_IS_REPLACEMENT($replacement, length $replacement) - 1, 0, + "UTF8_IS_REPLACEMENT returns 0 on too short an input"); +} + done_testing; @@ -917,7 +917,10 @@ representation. */ #define UNICODE_REPLACEMENT 0xFFFD #define UNICODE_IS_REPLACEMENT(uv) UNLIKELY((UV) (uv) == UNICODE_REPLACEMENT) -#define UTF8_IS_REPLACEMENT(s, send) is_REPLACEMENT_utf8_safe(s,send) +#define UTF8_IS_REPLACEMENT(s, send) \ + UNLIKELY( ((send) - (s)) >= (sizeof(REPLACEMENT_CHARACTER_UTF8) - 1) \ + && memEQ((s), REPLACEMENT_CHARACTER_UTF8, \ + sizeof(REPLACEMENT_CHARACTER_UTF8) - 1)) /* Max legal code point according to Unicode */ #define PERL_UNICODE_MAX 0x10FFFF |