summaryrefslogtreecommitdiff
path: root/encoding.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-10-07 17:39:44 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-10-07 17:39:44 +0000
commitbaeeebf474cae027bc3d2e80a72a540612874ef9 (patch)
tree2e18a3411a9cdd58c64185fd72b9d11485d6e332 /encoding.c
parent0b184b473b1baea42f4093f23d64b24cf4a565fd (diff)
* encoding.c (rb_default_internal_encoding): merged a patch from
Michael Selig <michael.selig at fs.com.au> 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
Diffstat (limited to 'encoding.c')
-rw-r--r--encoding.c50
1 files changed, 50 insertions, 0 deletions
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);