summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog38
-rw-r--r--encoding.c121
-rw-r--r--gem_prelude.rb4
-rw-r--r--ruby.c12
4 files changed, 132 insertions, 43 deletions
diff --git a/ChangeLog b/ChangeLog
index 692ca70a35..f25611b27e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,39 @@
-Thu Dec 11 13:17:04 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Dec 12 19:29:07 2008 Yuki Sonoda (Yugui) <yugui@yugui.jp>
- * encoding.c (rb_enc_set_default_internal): defines internal
- encoding as nil.
+ * encoding.c (rb_enc_set_default_external): default_internal can be
+ nil, but default_external cannot.
+
+ * encoding.c (rb_set_default_internal): adds rdoc.
+
+ * encoding.c (enc_find): ditto.
+
+Fri Dec 12 14:09:55 2008 Yuki Sonoda (Yugui) <yugui@yugui.jp>
+
+ * encoding.c (enc_get_default_encoding): removed.
+ Generalizing rb_default_{external,internal}_encoding seems to be
+ difficult.
+ default_external cannot be NULL even before detected. [ruby-dev:37390]
+
+ * encoding.c (rb_default_external_encoding): has its own
+ implementation again.
+
+ * encoding.c (rb_default_internal_encoding): ditto.
+
+ * gem_prelude.rb: added notice.
+
+ * ruby.c (rubylib_mangled_path, rubylib_mangled_path2): uses locale
+ encoding but not ASCII-8BIT.
+
+ * ruby.c (process_options): refers less to default_external.
+
+Thu Dec 11 20:05:17 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * encoding.c (rb_enc_aliases_enc_i): skips default internal.
+
+Thu Dec 11 13:36:18 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * encoding.c (enc_set_default_encoding): allowed to set default
+ encoding.
* encoding.c (rb_locale_encoding): removed Encoding::LOCALE.
diff --git a/encoding.c b/encoding.c
index eb52f83759..f802850f3b 100644
--- a/encoding.c
+++ b/encoding.c
@@ -905,6 +905,9 @@ enc_list(VALUE klass)
* Encoding.find("US-ASCII") => #<Encoding:US-ASCII>
* Encoding.find(:Shift_JIS) => #<Encoding:Shift_JIS>
*
+ * An ArgumentError is raised when no encoding with <i>name</i>.
+ * Only +Encoding.find("internal")+ however returns nil when no encoding named "internal",
+ * in other words, when Ruby has no default internal encoding.
*/
static VALUE
enc_find(VALUE klass, VALUE enc)
@@ -1032,16 +1035,51 @@ 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 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);
+ if (default_external.enc) return default_external.enc;
+
+ if (default_external.index >= 0) {
+ default_external.enc = rb_enc_from_index(default_external.index);
+ return default_external.enc;
+ }
+ else {
+ return rb_locale_encoding();
}
- return default_external;
}
VALUE
@@ -1056,8 +1094,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 +1105,36 @@ 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);
+ if (NIL_P(encoding)) {
+ rb_raise(rb_eArgError, "default external can not be nil");
+ }
+ 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);
+ if (!default_internal.enc && default_internal.index >= 0) {
+ default_internal.enc = rb_enc_from_index(default_internal.index);
}
- return default_internal;
+ return default_internal.enc; /* can be NULL */
}
VALUE
@@ -1099,8 +1150,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 +1161,23 @@ 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 or nil
+ *
+ * Sets default internal encoding.
+ * Or removes default internal encoding when passed nil.
+ */
+static VALUE
+set_default_internal(VALUE klass, VALUE encoding)
+{
+ rb_warning("setting Encoding.default_internal");
+ rb_enc_set_default_internal(encoding);
+ return encoding;
}
/*
@@ -1256,6 +1306,7 @@ rb_enc_aliases_enc_i(st_data_t name, st_data_t orig, st_data_t arg)
if (NIL_P(str)) {
rb_encoding *enc = rb_enc_from_index(idx);
+ if (!enc) return ST_CONTINUE;
if (STRCASECMP((char*)name, rb_enc_name(enc)) == 0) {
return ST_CONTINUE;
}
@@ -1316,7 +1367,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);
diff --git a/gem_prelude.rb b/gem_prelude.rb
index ddc56c87d1..406f40fe5a 100644
--- a/gem_prelude.rb
+++ b/gem_prelude.rb
@@ -2,6 +2,10 @@
# vim: filetype=ruby
# THIS FILE WAS AUTOGENERATED, DO NOT EDIT
+# NOTICE: Ruby is during initialization here.
+# * Encoding.default_external does not reflects -E.
+# * Should not expect Encoding.default_internal.
+# * Locale encoding is available.
if defined?(Gem) then
module Kernel
diff --git a/ruby.c b/ruby.c
index b3aa78fac8..0b9d4cbf03 100644
--- a/ruby.c
+++ b/ruby.c
@@ -210,9 +210,9 @@ rubylib_mangled_path(const char *s, unsigned int l)
}
}
if (!newp || l < oldl || STRNCASECMP(oldp, s, oldl) != 0) {
- return rb_str_new(s, l);
+ return rb_locale_str_new(s, l);
}
- ret = rb_str_new(0, l + newl - oldl);
+ ret = rb_locale_str_new(0, l + newl - oldl);
ptr = RSTRING_PTR(ret);
memcpy(ptr, newp, newl);
memcpy(ptr + newl, s + oldl, l - oldl);
@@ -226,8 +226,8 @@ rubylib_mangled_path2(const char *s)
return rubylib_mangled_path(s, strlen(s));
}
#else
-#define rubylib_mangled_path rb_str_new
-#define rubylib_mangled_path2 rb_str_new2
+#define rubylib_mangled_path rb_locale_str_new
+#define rubylib_mangled_path2 rb_locale_str_new_cstr
#endif
static void
@@ -1141,7 +1141,7 @@ process_options(VALUE arg)
}
}
- ruby_script(opt->script);
+ rb_progname = rb_obj_freeze(rb_str_new_cstr(opt->script));
#if defined DOSISH || defined __CYGWIN__
translate_char(RSTRING_PTR(rb_progname), '\\', '/');
#endif
@@ -1641,7 +1641,7 @@ ruby_process_options(int argc, char **argv)
struct cmdline_options opt;
NODE *tree;
- ruby_script(argv[0]); /* for the time being */
+ ruby_script(argv[0]); /* for the time being */
rb_argv0 = rb_str_new4(rb_progname);
rb_gc_register_mark_object(rb_argv0);
args.argc = argc;