summaryrefslogtreecommitdiffstats
path: root/string.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-23 16:07:09 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-23 16:07:09 +0000
commit6342e704a779fac6bca464e2470a70ae84a77ba5 (patch)
treeb291c14454644a39ce9e34b205d5fa3ffe418b68 /string.c
parent0051da20ffc985bc56900509cf8da4d34126b09f (diff)
downloadruby-6342e704a779fac6bca464e2470a70ae84a77ba5.tar.gz
ruby-6342e704a779fac6bca464e2470a70ae84a77ba5.tar.xz
ruby-6342e704a779fac6bca464e2470a70ae84a77ba5.zip
* string.c (rb_str_comparable): comparison including broken
coderange strings do not consider encoding. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@14533 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r--string.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/string.c b/string.c
index ebfd39c9b..728790f6f 100644
--- a/string.c
+++ b/string.c
@@ -1269,11 +1269,16 @@ rb_str_comparable(VALUE str1, VALUE str2)
{
int idx1 = rb_enc_get_index(str1);
int idx2 = rb_enc_get_index(str2);
+ int rc1, rc2;
if (idx1 == idx2) return Qtrue;
- if (!is_ascii_string(str1)) return Qfalse;
- if (!is_ascii_string(str2)) return Qfalse;
- return Qtrue;
+ rc1 = rb_enc_str_coderange(str1);
+ rc2 = rb_enc_str_coderange(str2);
+ if (rc1 == ENC_CODERANGE_7BIT && rc2 == ENC_CODERANGE_7BIT)
+ return Qtrue;
+ if (rc1 == ENC_CODERANGE_BROKEN) return Qtrue;
+ if (rc2 == ENC_CODERANGE_BROKEN) return Qtrue;
+ return Qfalse;
}
int
@@ -1288,9 +1293,6 @@ rb_str_cmp(VALUE str1, VALUE str2)
retval = memcmp(RSTRING_PTR(str1), RSTRING_PTR(str2), len);
if (retval == 0) {
if (RSTRING_LEN(str1) == RSTRING_LEN(str2)) {
- if (!enc) {
- return rb_enc_get_index(str1) - rb_enc_get_index(str2);
- }
return 0;
}
if (RSTRING_LEN(str1) > RSTRING_LEN(str2)) return 1;