Skip to content

Commit 24a0fdd

Browse files
committed
pp_pack.c: Replace rolled-own with hop()
1 parent 045b0df commit 24a0fdd

File tree

1 file changed

+7
-19
lines changed

1 file changed

+7
-19
lines changed

pp_pack.c

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -979,16 +979,10 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c
979979
case '@' | TYPE_IS_SHRIEKING:
980980
case '@':
981981
s = strbeg + symptr->strbeg;
982-
if (utf8 && !(datumtype & TYPE_IS_SHRIEKING))
983-
{
984-
while (len > 0) {
985-
if (s >= strend)
986-
Perl_croak(aTHX_ "'@' outside of string in unpack");
987-
s += UTF8SKIP(s);
988-
len--;
989-
}
990-
if (s > strend)
991-
Perl_croak(aTHX_ "'@' outside of string with malformed UTF-8 in unpack");
982+
if (utf8 && !(datumtype & TYPE_IS_SHRIEKING)) {
983+
s = (char *) utf8_hop_forward((U8 *) s, len, (U8 *) strend);
984+
if (s >= strend)
985+
Perl_croak(aTHX_ "'@' outside of string in unpack");
992986
} else {
993987
if (strend-s < len)
994988
Perl_croak(aTHX_ "'@' outside of string in unpack");
@@ -1018,15 +1012,9 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c
10181012
/* FALLTHROUGH */
10191013
case 'X':
10201014
if (utf8) {
1021-
while (len > 0) {
1022-
if (s <= strbeg)
1023-
Perl_croak(aTHX_ "'X' outside of string in unpack");
1024-
while (--s, UTF8_IS_CONTINUATION(*s)) {
1025-
if (s <= strbeg)
1026-
Perl_croak(aTHX_ "'X' outside of string in unpack");
1027-
}
1028-
len--;
1029-
}
1015+
s = (char *) utf8_hop_back((U8 *) s, -len, (U8 *) strbeg);
1016+
if (s <= strbeg)
1017+
Perl_croak(aTHX_ "'X' outside of string in unpack");
10301018
} else {
10311019
if (len > s - strbeg)
10321020
Perl_croak(aTHX_ "'X' outside of string in unpack" );

0 commit comments

Comments
 (0)