Retract #8875, cannot let go of the old semantics of unpack U
Jarkko Hietaniemi [Wed, 21 Feb 2001 19:34:34 +0000 (19:34 +0000)]
without rethinking utf8decode.t.

p4raw-id: //depot/perl@8880

pp.c
t/op/pack.t

diff --git a/pp.c b/pp.c
index d8d0082..2b975e4 100644 (file)
--- 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;
index db033f3..3483597 100755 (executable)
@@ -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++;
-