}
break;
case 'C':
+ case 'U':
if (len > strend - s)
len = strend - s;
if (checksum) {
STRLEN l;
auv = utf8_to_uv((U8*)s, strend - s,
&l, UTF8_ALLOW_ANYUV);
- culong += auv;
+ if (checksum > 32)
+ cdouble += (NV)auv;
+ else
+ culong += auv;
s += l;
len -= l;
}
}
}
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;
require Config; import Config;
}
-print "1..163\n";
+print "1..165\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
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++;
+