From baeeebf474cae027bc3d2e80a72a540612874ef9 Mon Sep 17 00:00:00 2001 From: matz Date: Tue, 7 Oct 2008 17:39:44 +0000 Subject: * encoding.c (rb_default_internal_encoding): merged a patch from Michael Selig in [ruby-core:18985]. * io.c (rb_io_ext_int_to_encs): ditto. * ruby.c (proc_options): support default internal encoding in -E option. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19709 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- encoding.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'encoding.c') diff --git a/encoding.c b/encoding.c index 35130a6aaa..f17ed1882c 100644 --- a/encoding.c +++ b/encoding.c @@ -1027,6 +1027,55 @@ rb_enc_set_default_external(VALUE encoding) default_external = 0; } +/* -2 => not yet set, -1 => nil */ +static int default_internal_index = -2; +static rb_encoding *default_internal; + +rb_encoding * +rb_default_internal_encoding(void) +{ + if (!default_internal && default_internal_index >= 0) { + default_internal = rb_enc_from_index(default_internal_index); + } + return default_internal; +} + +VALUE +rb_enc_default_internal(void) +{ + /* Note: These functions cope with default_internal not being set */ + return rb_enc_from_encoding(rb_default_internal_encoding()); +} + +/* + * call-seq: + * Encoding.default_internal => enc + * + * Returns default internal encoding. + * + * It is initialized by the source internal_encoding or -E option, + * and can't be modified after that. + */ +static VALUE +get_default_internal(VALUE klass) +{ + return rb_enc_default_internal(); +} + +void +rb_enc_set_default_internal(VALUE encoding) +{ + if (default_internal_index != -2) + /* Already set */ + return; + default_internal_index = encoding == Qnil ? + -1 :rb_enc_to_index(rb_to_encoding(encoding)); + /* Convert US-ASCII => UTF-8 */ + if (default_internal_index == rb_usascii_encindex()) + default_internal_index = rb_utf8_encindex(); + default_internal = 0; +} + /* * call-seq: * Encoding.locale_charmap => string @@ -1212,6 +1261,7 @@ Init_Encoding(void) rb_define_singleton_method(rb_cEncoding, "_load", enc_load, 1); rb_define_singleton_method(rb_cEncoding, "default_external", get_default_external, 0); + rb_define_singleton_method(rb_cEncoding, "default_internal", get_default_internal, 0); rb_define_singleton_method(rb_cEncoding, "locale_charmap", rb_locale_charmap, 0); list = rb_ary_new2(enc_table.count); -- cgit v1.2.3