From 28d1621d100a4f0c72e5343fecfbc0d58fd3c93d Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 11 Dec 2008 04:36:20 +0000 Subject: * encoding.c (enc_set_default_encoding): allowed to set default encoding. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@20625 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- encoding.c | 115 ++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 79 insertions(+), 36 deletions(-) (limited to 'encoding.c') diff --git a/encoding.c b/encoding.c index eb52f83759..3253bfdd24 100644 --- a/encoding.c +++ b/encoding.c @@ -1032,16 +1032,52 @@ rb_filesystem_encoding(void) return enc; } -static int default_external_index; -static rb_encoding *default_external; +struct default_encoding { + int index; /* -2 => not yet set, -1 => nil */ + rb_encoding *enc; +}; + +static rb_encoding * +enc_get_default_encoding(struct default_encoding *def) +{ + if (!def->enc && def->index >= 0) { + def->enc = rb_enc_from_index(def->index); + } + return def->enc; +} + +static int +enc_set_default_encoding(struct default_encoding *def, VALUE encoding, + const char *name, int defindex) +{ + int overridden = Qfalse; + if (def->index != -2) + /* Already set */ + overridden = Qtrue; + + if (NIL_P(encoding)) { + def->index = -1; + def->enc = 0; + st_insert(enc_table.names, (st_data_t)strdup(name), + (st_data_t)UNSPECIFIED_ENCODING); + } + else { + def->index = rb_enc_to_index(rb_to_encoding(encoding)); + if (def->index == ENCINDEX_US_ASCII) + def->index = defindex; + def->enc = 0; + enc_alias_internal(name, def->index); + } + + return overridden; +} + +static struct default_encoding default_external = {-2}; rb_encoding * rb_default_external_encoding(void) { - if (!default_external) { - default_external = rb_enc_from_index(default_external_index); - } - return default_external; + return enc_get_default_encoding(&default_external); } VALUE @@ -1056,8 +1092,7 @@ rb_enc_default_external(void) * * Returns default external encoding. * - * It is initialized by the locale or -E option, - * and can't be modified after that. + * It is initialized by the locale or -E option. */ static VALUE get_default_external(VALUE klass) @@ -1068,22 +1103,30 @@ get_default_external(VALUE klass) void rb_enc_set_default_external(VALUE encoding) { - default_external_index = rb_enc_to_index(rb_to_encoding(encoding)); - default_external = 0; - enc_alias_internal("external", default_external_index); + enc_set_default_encoding(&default_external, encoding, + "external", ENCINDEX_US_ASCII); } -/* -2 => not yet set, -1 => nil */ -static int default_internal_index = -2; -static rb_encoding *default_internal; +/* + * call-seq: + * Encoding.default_external = enc + * + * Sets default external encoding. + */ +static VALUE +set_default_external(VALUE klass, VALUE encoding) +{ + rb_warning("setting Encoding.default_external"); + rb_enc_set_default_external(encoding); + return encoding; +} + +static struct default_encoding default_internal = {-2}; 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; + return enc_get_default_encoding(&default_internal); } VALUE @@ -1099,8 +1142,7 @@ rb_enc_default_internal(void) * * Returns default internal encoding. * - * It is initialized by the source internal_encoding or -E option, - * and can't be modified after that. + * It is initialized by the source internal_encoding or -E option. */ static VALUE get_default_internal(VALUE klass) @@ -1111,23 +1153,22 @@ get_default_internal(VALUE klass) void rb_enc_set_default_internal(VALUE encoding) { - if (default_internal_index != -2) - /* Already set */ - return; - if (NIL_P(encoding)) { - default_internal_index = -1; - default_internal = 0; - st_insert(enc_table.names, (st_data_t)strdup("internal"), - (st_data_t)UNSPECIFIED_ENCODING); - return; - } + enc_set_default_encoding(&default_internal, encoding, + "internal", ENCINDEX_UTF_8); +} - default_internal_index = 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; - enc_alias_internal("internal", default_internal_index); +/* + * call-seq: + * Encoding.default_internal = enc + * + * Sets default internal encoding. + */ +static VALUE +set_default_internal(VALUE klass, VALUE encoding) +{ + rb_warning("setting Encoding.default_internal"); + rb_enc_set_default_internal(encoding); + return encoding; } /* @@ -1316,7 +1357,9 @@ 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_external=", set_default_external, 1); rb_define_singleton_method(rb_cEncoding, "default_internal", get_default_internal, 0); + rb_define_singleton_method(rb_cEncoding, "default_internal=", set_default_internal, 1); rb_define_singleton_method(rb_cEncoding, "locale_charmap", rb_locale_charmap, 0); list = rb_ary_new2(enc_table.count); -- cgit v1.2.3