summaryrefslogtreecommitdiff
path: root/encoding.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-01-22 03:59:53 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-01-22 03:59:53 +0000
commit65a8185eb212639875ae8db14dfffb1fa06b71e9 (patch)
tree95b915e9c09bac1eaff6cc86b70d590a053c3ba4 /encoding.c
parent157664b9f3cfeb485abe1cf8298e82accef23acf (diff)
* configure.in (MINIRUBY): remove -I$(EXTOUT)/$(arch) from
MINIRUBY since miniruby might not be able to load DLL. * test/ruby/test_m17n.rb: move tests from bootstrap test. * encoding.c (enc_find): should check name if ASCII compatible. * string.c (rb_str_end_with): should check character boundary. * encoding.c (rb_enc_compatible): encoding must be ASCII compatible before checking ENC_CODERANGE_7BIT. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15167 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'encoding.c')
-rw-r--r--encoding.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/encoding.c b/encoding.c
index 328f2d4742..f429f2c816 100644
--- a/encoding.c
+++ b/encoding.c
@@ -640,7 +640,7 @@ rb_encoding*
rb_enc_compatible(VALUE str1, VALUE str2)
{
int idx1, idx2;
- rb_encoding *enc;
+ rb_encoding *enc1, *enc2;
idx1 = rb_enc_get_index(str1);
idx2 = rb_enc_get_index(str2);
@@ -648,6 +648,10 @@ rb_enc_compatible(VALUE str1, VALUE str2)
if (idx1 == idx2) {
return rb_enc_from_index(idx1);
}
+ enc1 = rb_enc_from_index(idx1);
+ enc2 = rb_enc_from_index(idx2);
+ if (!rb_enc_asciicompat(enc1) || !rb_enc_asciicompat(enc2))
+ return 0;
if (BUILTIN_TYPE(str1) != T_STRING) {
VALUE tmp = str1;
int idx0 = idx1;
@@ -664,17 +668,15 @@ rb_enc_compatible(VALUE str1, VALUE str2)
cr2 = rb_enc_str_coderange(str2);
if (cr1 != cr2) {
/* may need to handle ENC_CODERANGE_BROKEN */
- if (cr1 == ENC_CODERANGE_7BIT) return rb_enc_from_index(idx2);
- if (cr2 == ENC_CODERANGE_7BIT) return rb_enc_from_index(idx1);
+ if (cr1 == ENC_CODERANGE_7BIT) return enc2;
}
if (cr2 == ENC_CODERANGE_7BIT) {
- if (idx1 == 0) return rb_enc_from_index(idx2);
- return rb_enc_from_index(idx1);
+ if (idx1 == 0) return enc2;
+ return enc1;
}
}
- if (cr1 == ENC_CODERANGE_7BIT &&
- rb_enc_asciicompat(enc = rb_enc_from_index(idx2)))
- return enc;
+ if (cr1 == ENC_CODERANGE_7BIT)
+ return enc2;
}
return 0;
}
@@ -908,7 +910,11 @@ static VALUE
enc_find(VALUE klass, VALUE enc)
{
int idx;
+
if (SYMBOL_P(enc)) enc = rb_id2str(SYM2ID(enc));
+ if (!rb_enc_asciicompat(rb_enc_get(enc))) {
+ rb_raise(rb_eArgError, "invalid name encoding (non ASCII)");
+ }
idx = rb_enc_find_index(StringValueCStr(enc));
if (idx < 0) {
rb_raise(rb_eArgError, "unknown encoding name - %s", RSTRING_PTR(enc));