summaryrefslogtreecommitdiff
path: root/sv.c
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2002-03-07 20:54:02 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2002-03-07 20:54:02 +0000
commitcf48d248eb62e81239204ca4ca6b33029875e0bd (patch)
treee86de1646183d01ec3c8fb9a554a2bae476fd630 /sv.c
parentf7391caeba91da2f21fc9bf9ae8279f9173b8be6 (diff)
downloadperl-cf48d248eb62e81239204ca4ca6b33029875e0bd.tar.gz
Retract #14985, #14899, and #14990, following the principles
"Do no harm." and "If it ain't broke, don't fix it." Firstly, the #14985 broke badly on UTF-EBCDIC, #14990 fixed some, but still broken, and I do not have the extra brain cells for the EBCDIC backport. Secondly, the old version worked both in EBCDIC and non-. Thirdly, the old version may be more amenable for the behaviour suggsted by Anton Tagunov regarding the encoding pragma. p4raw-id: //depot/perl@15084
Diffstat (limited to 'sv.c')
-rw-r--r--sv.c81
1 files changed, 59 insertions, 22 deletions
diff --git a/sv.c b/sv.c
index f893fa6bd8..27150d6706 100644
--- a/sv.c
+++ b/sv.c
@@ -5349,6 +5349,7 @@ Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
char *pv2;
STRLEN cur2;
I32 eq = 0;
+ char *tpv = Nullch;
if (!sv1) {
pv1 = "";
@@ -5364,13 +5365,35 @@ Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
else
pv2 = SvPV(sv2, cur2);
- if (SvUTF8(sv1) == SvUTF8(sv2) || IN_BYTES)
- eq = (cur1 == cur2) && memEQ(pv1, pv2, cur1);
- else if (SvUTF8(sv1)) /* do not utf8ize the comparands as a side-effect */
- eq = !memcmp_byte_utf8(pv2, cur2, pv1, cur1);
- else
- eq = !memcmp_byte_utf8(pv1, cur1, pv2, cur2);
+ /* do not utf8ize the comparands as a side-effect */
+ if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
+ bool is_utf8 = TRUE;
+ /* UTF-8ness differs */
+
+ if (SvUTF8(sv1)) {
+ /* sv1 is the UTF-8 one , If is equal it must be downgrade-able */
+ char *pv = (char*)bytes_from_utf8((U8*)pv1, &cur1, &is_utf8);
+ if (pv != pv1)
+ pv1 = tpv = pv;
+ }
+ else {
+ /* sv2 is the UTF-8 one , If is equal it must be downgrade-able */
+ char *pv = (char *)bytes_from_utf8((U8*)pv2, &cur2, &is_utf8);
+ if (pv != pv2)
+ pv2 = tpv = pv;
+ }
+ if (is_utf8) {
+ /* Downgrade not possible - cannot be eq */
+ return FALSE;
+ }
+ }
+
+ if (cur1 == cur2)
+ eq = memEQ(pv1, pv2, cur1);
+ if (tpv != Nullch)
+ Safefree(tpv);
+
return eq;
}
@@ -5390,7 +5413,9 @@ Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
{
STRLEN cur1, cur2;
char *pv1, *pv2;
- I32 retval;
+ I32 cmp;
+ bool pv1tmp = FALSE;
+ bool pv2tmp = FALSE;
if (!sv1) {
pv1 = "";
@@ -5406,28 +5431,40 @@ Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
else
pv2 = SvPV(sv2, cur2);
+ /* do not utf8ize the comparands as a side-effect */
+ if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
+ if (SvUTF8(sv1)) {
+ pv2 = (char*)bytes_to_utf8((U8*)pv2, &cur2);
+ pv2tmp = TRUE;
+ }
+ else {
+ pv1 = (char*)bytes_to_utf8((U8*)pv1, &cur1);
+ pv1tmp = TRUE;
+ }
+ }
+
if (!cur1) {
- return cur2 ? -1 : 0;
+ cmp = cur2 ? -1 : 0;
} else if (!cur2) {
- return 1;
- } else if (SvUTF8(sv1) == SvUTF8(sv2) || IN_BYTES) {
- retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
+ cmp = 1;
+ } else {
+ I32 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
if (retval) {
- return retval < 0 ? -1 : 1;
+ cmp = retval < 0 ? -1 : 1;
} else if (cur1 == cur2) {
- return 0;
- } else {
- return cur1 < cur2 ? -1 : 1;
+ cmp = 0;
+ } else {
+ cmp = cur1 < cur2 ? -1 : 1;
}
- } else if (SvUTF8(sv1)) /* do not utf8ize the comparands as a side-effect */
- retval = -memcmp_byte_utf8(pv2, cur2, pv1, cur1);
- else
- retval = memcmp_byte_utf8(pv1, cur1, pv2, cur2);
+ }
- if (retval) /* CURs taken into account already */
- return retval < 0 ? -1 : 1;
- return 0;
+ if (pv1tmp)
+ Safefree(pv1);
+ if (pv2tmp)
+ Safefree(pv2);
+
+ return cmp;
}
/*