[前][次][番号順一覧][スレッド一覧]

ruby-changes:9088

From: nobu <ko1@a...>
Date: Thu, 11 Dec 2008 13:36:37 +0900 (JST)
Subject: [ruby-changes:9088] Ruby:r20625 (trunk): * encoding.c (enc_set_default_encoding): allowed to set default

nobu	2008-12-11 13:36:20 +0900 (Thu, 11 Dec 2008)

  New Revision: 20625

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=20625

  Log:
    * encoding.c (enc_set_default_encoding): allowed to set default
      encoding.

  Modified files:
    trunk/ChangeLog
    trunk/encoding.c

Index: encoding.c
===================================================================
--- encoding.c	(revision 20624)
+++ encoding.c	(revision 20625)
@@ -1032,16 +1032,52 @@
     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 @@
  *
  * 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 @@
 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 @@
  *
  * 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 @@
 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 @@
     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);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 20624)
+++ ChangeLog	(revision 20625)
@@ -1,7 +1,7 @@
-Thu Dec 11 13:17:04 2008  Nobuyoshi Nakada  <nobu@r...>
+Thu Dec 11 13:36:18 2008  Nobuyoshi Nakada  <nobu@r...>
 
-	* encoding.c (rb_enc_set_default_internal): defines internal
-	  encoding as nil.
+	* encoding.c (enc_set_default_encoding): allowed to set default
+	  encoding.
 
 	* encoding.c (rb_locale_encoding): removed Encoding::LOCALE.
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]