From: Jarkko Hietaniemi Date: Mon, 7 Oct 1996 19:03:00 +0000 (+0300) Subject: LC_COLLATE. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=1e2e1ae8d60a2653b0297f8d75f9d4fe5abfc82b;p=p5sagit%2Fp5-mst-13.2.git LC_COLLATE. Big patch to add, document, and test LC_COLLATE support. ord() is a dangerous thing. --- diff --git a/lib/Math/BigInt.pm b/lib/Math/BigInt.pm index 68856ae..a4d8b6b 100644 --- a/lib/Math/BigInt.pm +++ b/lib/Math/BigInt.pm @@ -106,13 +106,23 @@ sub bcmp { #(num_str, num_str) return cond_code sub cmp { # post-normalized compare for internal use local($cx, $cy) = @_; - $cx cmp $cy - && - ( - ord($cy) <=> ord($cx) - || - ($cx cmp ',') * (length($cy) <=> length($cx) || $cy cmp $cx) - ); + + return 0 if ($cx eq $cy); + + local($sx, $sy) = (substr($cx, 0, 1), substr($cy, 0, 1)); + local($ld); + + if ($sx eq '+') { + return 1 if ($sy eq '-' || $cy eq '+0'); + $ld = length($cx) - length($cy); + return $ld if ($ld); + return $cx cmp $cy; + } else { # $sx eq '-' + return -1 if ($sy eq '+'); + $ld = length($cy) - length($cx); + return $ld if ($ld); + return $cy cmp $cx; + } } sub badd { #(num_str, num_str) return num_str diff --git a/lib/bigint.pl b/lib/bigint.pl index e6ba644..a274736 100644 --- a/lib/bigint.pl +++ b/lib/bigint.pl @@ -103,13 +103,23 @@ sub main'bcmp { #(num_str, num_str) return cond_code sub cmp { # post-normalized compare for internal use local($cx, $cy) = @_; - $cx cmp $cy - && - ( - ord($cy) <=> ord($cx) - || - ($cx cmp ',') * (length($cy) <=> length($cx) || $cy cmp $cx) - ); + return 0 if ($cx eq $cy); + + local($sx, $sy) = (substr($cx, 0, 1), substr($cy, 0, 1)); + local($ld); + + if ($sx eq '+') { + return 1 if ($sy eq '-' || $cy eq '+0'); + $ld = length($cx) - length($cy); + return $ld if ($ld); + return $cx cmp $cy; + } else { # $sx eq '-' + return -1 if ($sy eq '+'); + $ld = length($cy) - length($cx); + return $ld if ($ld); + return $cy cmp $cx; + } + } sub main'badd { #(num_str, num_str) return num_str