From: Jarkko Hietaniemi Date: Wed, 21 Feb 2001 19:34:34 +0000 (+0000) Subject: Retract #8875, cannot let go of the old semantics of unpack U X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=9e6390329e0b2f4a2dab0836dc608590db56a9e1;p=p5sagit%2Fp5-mst-13.2.git Retract #8875, cannot let go of the old semantics of unpack U without rethinking utf8decode.t. p4raw-id: //depot/perl@8880 --- diff --git a/pp.c b/pp.c index d8d0082..2b975e4 100644 --- a/pp.c +++ b/pp.c @@ -4329,7 +4329,6 @@ PP(pp_unpack) } break; case 'C': - case 'U': if (len > strend - s) len = strend - s; if (checksum) { @@ -4338,10 +4337,7 @@ PP(pp_unpack) STRLEN l; auv = utf8_to_uv((U8*)s, strend - s, &l, UTF8_ALLOW_ANYUV); - if (checksum > 32) - cdouble += (NV)auv; - else - culong += auv; + culong += auv; s += l; len -= l; } @@ -4379,6 +4375,35 @@ PP(pp_unpack) } } break; + case 'U': + if (len > strend - s) + len = strend - s; + if (checksum) { + while (len-- > 0 && s < strend) { + STRLEN alen; + auint = utf8_to_uv((U8*)s, strend - s, &alen, 0); + along = alen; + s += along; + if (checksum > 32) + cdouble += (NV)auint; + else + culong += auint; + } + } + else { + EXTEND(SP, len); + EXTEND_MORTAL(len); + while (len-- > 0 && s < strend) { + STRLEN alen; + auint = utf8_to_uv((U8*)s, strend - s, &alen, 0); + along = alen; + s += along; + sv = NEWSV(37, 0); + sv_setuv(sv, (UV)auint); + PUSHs(sv_2mortal(sv)); + } + } + break; case 's': #if SHORTSIZE == SIZE16 along = (strend - s) / SIZE16; diff --git a/t/op/pack.t b/t/op/pack.t index db033f3..3483597 100755 --- a/t/op/pack.t +++ b/t/op/pack.t @@ -6,7 +6,7 @@ BEGIN { require Config; import Config; } -print "1..165\n"; +print "1..163\n"; $format = "c2 x5 C C x s d i l a6"; # Need the expression in here to force ary[5] to be numeric. This avoids @@ -453,16 +453,3 @@ print "ok $test\n"; $test++; print "ok $test\n"; $test++; } -# 164: pack C and pack U equivalence - -print "not " unless pack("C", 0x100) eq pack("U", 0x100) && - chr(0x100) eq pack("U", 0x100); -print "ok $test\n"; $test++; - -# 165: unpack C and unpack U equivalence - -print "not " unless "@{[unpack('C*', chr(0x100) . chr(0x200))]}" eq - "@{[unpack('U*', chr(0x100) . chr(0x200))]}" && - "@{[unpack('U*', chr(0x100) . chr(0x200))]}" eq "256 512"; -print "ok $test\n"; $test++; -