UV nchar = 0;
UV nwide = 0;
U8 * const send = tmps + len;
+ U8 * const origtmps = tmps;
+ const UV utf8flags = UTF8_ALLOW_ANYUV;
while (tmps < send) {
- const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
- tmps += UTF8SKIP(tmps);
+ const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
+ tmps += l;
targlen += UNISKIP(~c);
nchar++;
if (c > 0xff)
}
/* Now rewind strings and write them. */
- tmps -= len;
+ tmps = origtmps;
if (nwide) {
U8 *result;
U8 *p;
- Newxz(result, targlen + 1, U8);
+ Newx(result, targlen + 1, U8);
p = result;
while (tmps < send) {
- const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
- tmps += UTF8SKIP(tmps);
+ const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
+ tmps += l;
p = uvchr_to_utf8_flags(p, ~c, UNICODE_ALLOW_ANY);
}
*p = '\0';
U8 *result;
U8 *p;
- Newxz(result, nchar + 1, U8);
+ Newx(result, nchar + 1, U8);
p = result;
while (tmps < send) {
- const U8 c = (U8)utf8n_to_uvchr(tmps, 0, &l, UTF8_ALLOW_ANY);
- tmps += UTF8SKIP(tmps);
+ const U8 c = (U8)utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags);
+ tmps += l;
*p++ = ~c;
}
*p = '\0';
# If you find tests are failing, please try adding names to tests to track
# down where the failure is, and supply your new names as a patch.
# (Just-in-time test naming)
-plan tests => 160;
+plan tests => 161;
# numerics
ok ((0xdead & 0xbeef) == 0x9ead);
is($b, chr(0x1FE) x 0x0FF . chr(0x101) x 2);
}
+# update to pp_complement() via Coverity
+SKIP: {
+ # UTF-EBCDIC is limited to 0x7fffffff and can't encode ~0.
+ skip "EBCDIC" if $Is_EBCDIC;
+
+ my $str = "\x{10000}\x{800}";
+ # U+10000 is four bytes in UTF-8/UTF-EBCDIC.
+ # U+0800 is three bytes in UTF-8/UTF-EBCDIC.
+
+ no warnings "utf8";
+ { use bytes; $str =~ s/\C\C\z//; }
+
+ # it's really bogus that (~~malformed) is \0.
+ my $ref = "\x{10000}\0";
+ is(~~$str, $ref);
+}