summaryrefslogtreecommitdiff
path: root/encoding.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-12-11 04:36:20 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-12-11 04:36:20 +0000
commit28d1621d100a4f0c72e5343fecfbc0d58fd3c93d (patch)
tree67d021ff69772bab35d7de941b5fe43a540e8cb7 /encoding.c
parent31c163e4c8ad926076d90005ad18f4e964cc9c7e (diff)
* 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
Diffstat (limited to 'encoding.c')
-rw-r--r--encoding.c115
1 files changed, 79 insertions, 36 deletions
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);