This is a live mirror of the Perl 5 development currently hosted at
https://github.com/perl/perl5
https://perl5.git.perl.org
/
perl5.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Integrate changes #9259,9260 from maintperl into mainline.
[perl5.git]
/
doop.c
diff --git
a/doop.c
b/doop.c
index
e4a516a
..
823c88d
100644
(file)
--- a/
doop.c
+++ b/
doop.c
@@
-316,9
+316,11
@@
S_do_trans_simple_utf8(pTHX_ SV *sv)/* SPC - OK */
isutf8 = SvUTF8(sv);
if (!isutf8) {
U8 *t = s, *e = s + len;
isutf8 = SvUTF8(sv);
if (!isutf8) {
U8 *t = s, *e = s + len;
- while (t < e)
- if ((hibit = !UTF8_IS_INVARIANT(*t++)))
+ while (t < e) {
+ U8 ch = *t++;
+ if ((hibit = !NATIVE_IS_INVARIANT(ch)))
break;
break;
+ }
if (hibit)
s = bytes_to_utf8(s, &len);
}
if (hibit)
s = bytes_to_utf8(s, &len);
}
@@
-402,22
+404,25
@@
S_do_trans_count_utf8(pTHX_ SV *sv)/* SPC - OK */
HV* hv = (HV*)SvRV(rv);
SV** svp = hv_fetch(hv, "NONE", 4, FALSE);
UV none = svp ? SvUV(*svp) : 0x7fffffff;
HV* hv = (HV*)SvRV(rv);
SV** svp = hv_fetch(hv, "NONE", 4, FALSE);
UV none = svp ? SvUV(*svp) : 0x7fffffff;
+ UV extra = none + 1;
UV uv;
U8 hibit = 0;
s = (U8*)SvPV(sv, len);
if (!SvUTF8(sv)) {
U8 *t = s, *e = s + len;
UV uv;
U8 hibit = 0;
s = (U8*)SvPV(sv, len);
if (!SvUTF8(sv)) {
U8 *t = s, *e = s + len;
- while (t < e)
- if ((hibit = !UTF8_IS_INVARIANT(*t++)))
+ while (t < e) {
+ U8 ch = *t++;
+ if ((hibit = !NATIVE_IS_INVARIANT(ch)))
break;
break;
+ }
if (hibit)
start = s = bytes_to_utf8(s, &len);
}
send = s + len;
while (s < send) {
if (hibit)
start = s = bytes_to_utf8(s, &len);
}
send = s + len;
while (s < send) {
- if ((uv = swash_fetch(rv, s)) < none)
+ if ((uv = swash_fetch(rv, s)) < none
|| uv == extra
)
matches++;
s += UTF8SKIP(s);
}
matches++;
s += UTF8SKIP(s);
}
@@
-443,6
+448,7
@@
S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
UV none = svp ? SvUV(*svp) : 0x7fffffff;
UV extra = none + 1;
UV final;
UV none = svp ? SvUV(*svp) : 0x7fffffff;
UV extra = none + 1;
UV final;
+ bool havefinal = FALSE;
UV uv;
STRLEN len;
U8 *dstart, *dend;
UV uv;
STRLEN len;
U8 *dstart, *dend;
@@
-453,9
+459,11
@@
S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
isutf8 = SvUTF8(sv);
if (!isutf8) {
U8 *t = s, *e = s + len;
isutf8 = SvUTF8(sv);
if (!isutf8) {
U8 *t = s, *e = s + len;
- while (t < e)
- if ((hibit = !UTF8_IS_INVARIANT(*t++)))
+ while (t < e) {
+ U8 ch = *t++;
+ if ((hibit = !NATIVE_IS_INVARIANT(ch)))
break;
break;
+ }
if (hibit)
s = bytes_to_utf8(s, &len);
}
if (hibit)
s = bytes_to_utf8(s, &len);
}
@@
-463,8
+471,10
@@
S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
start = s;
svp = hv_fetch(hv, "FINAL", 5, FALSE);
start = s;
svp = hv_fetch(hv, "FINAL", 5, FALSE);
- if (svp)
+ if (svp)
{
final = SvUV(*svp);
final = SvUV(*svp);
+ havefinal = TRUE;
+ }
if (grows) {
/* d needs to be bigger than s, in case e.g. upgrading is required */
if (grows) {
/* d needs to be bigger than s, in case e.g. upgrading is required */
@@
-510,10
+520,22
@@
S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
}
else if (uv == extra && !del) {
matches++;
}
else if (uv == extra && !del) {
matches++;
- s += UTF8SKIP(s);
- if (uv != puv) {
- d = uvchr_to_utf8(d, final);
- puv = final;
+ if (havefinal) {
+ s += UTF8SKIP(s);
+ if (puv != final) {
+ d = uvchr_to_utf8(d, final);
+ puv = final;
+ }
+ }
+ else {
+ STRLEN len;
+ uv = utf8_to_uvchr(s, &len);
+ if (uv != puv) {
+ Copy(s, d, len, U8);
+ d += len;
+ puv = uv;
+ }
+ s += len;
}
continue;
}
}
continue;
}