From: "NARUSE, Yui" Date: 2008-01-11T09:36:52+09:00 Subject: [ruby-dev:33011] Re: ASCII is alias of US-ASCII; replica of dummy encoding is not a dummy 成瀬です。 Martin Duerst wrote: > At 18:13 08/01/09, Yukihiro Matsumoto wrote: >> まつもと ゆきひろです >> >> In message "Re: [ruby-dev:32992] ASCII is alias of US-ASCII; replica of >> dummy encoding is not a dummy" >> on Wed, 9 Jan 2008 03:36:27 +0900, "NARUSE, Yui" writes: >> >> |= ASCII is alias of US-ASCII >> | >> |UTF-{16,32}{BE,LE} が組み込まれた絡みで、NKF を修正していて気付いたので >> |すが、今 ASCII は ASCII-8BIT の alias なのですね。IANA Charaset では >> |US-ASCII の alias なのですが、少々まずくありませんか。 >> >> きっと誰も気付かないと思うけど。この点は積極的に意見を持つ人 >> にお任せします。 > > 気がつかなかったかと思いますが、気をつかれたので、 > IANA Charset Registry の Secondary Expert Reviewer の立場として(http://www.iana.org/numbers.html#C 参考) 是非直していただきたいです。 > 「そちらで直して見ろ」と言われたらこちらでもやります。 というわけで、修正案です。 US-ASCII はビルトインではないので、alias だけ登録しておいて、呼ばれた時 に本体を読み込む仕組み (lazy alias) を作りました。名前も含めてこの方向で よろしいでしょうか。 Index: encoding.c =================================================================== --- encoding.c (revision 14981) +++ encoding.c (working copy) @@ -29,6 +29,7 @@ static struct rb_encoding_entry *enc_tab static int enc_table_count; static int enc_table_size; static st_table *enc_table_alias; +static st_table *enc_table_lazy_alias; #define ENC_UNINITIALIZED (&rb_cEncoding) #define enc_initialized_p(enc) ((enc)->auxiliary_data != &rb_cEncoding) @@ -174,6 +175,7 @@ rb_enc_register(const char *name, rb_enc if (STRCASECMP(name, rb_enc_name(oldenc))) { st_data_t key = (st_data_t)name, alias; st_delete(enc_table_alias, &key, &alias); + st_delete(enc_table_lazy_alias, &key, &alias); index = enc_register(name, encoding); } else if (enc_initialized_p(oldenc) && @@ -289,6 +291,21 @@ rb_enc_alias(const char *alias, const ch return enc_alias(alias, orig); } +static int +enc_lazy_alias(const char *alias, const char *orig) +{ + int idx; + + if (!enc_table_lazy_alias) { + enc_table_lazy_alias = st_init_strcasetable(); + } + idx = rb_enc_registered(alias); + if (idx < 0) { + st_insert(enc_table_lazy_alias, (st_data_t)alias, (st_data_t)orig); + } + return idx; +} + enum { ENCINDEX_ASCII, ENCINDEX_EUC_JP, @@ -307,7 +324,7 @@ rb_enc_init(void) ENC_REGISTER(SJIS); ENC_REGISTER(UTF8); #undef ENC_REGISTER - enc_alias("ASCII", rb_enc_name(ONIG_ENCODING_ASCII)); + enc_lazy_alias("ASCII", "US-ASCII"); enc_alias("BINARY", rb_enc_name(ONIG_ENCODING_ASCII)); enc_alias("eucJP", rb_enc_name(ONIG_ENCODING_EUC_JP)); /* UI-OSF Application Platform Profile f or Japanese Environment Version 1.1 */ enc_alias("SJIS", rb_enc_name(ONIG_ENCODING_SJIS)); @@ -371,8 +388,14 @@ rb_enc_find_index(const char *name) ++s; } OBJ_FREEZE(enclib); - if (RTEST(rb_protect(require_enc, enclib, 0))) + if (RTEST(rb_protect(require_enc, enclib, 0))) { i = rb_enc_registered(name); + } else { + st_data_t orig; + if (st_lookup(enc_table_lazy_alias, (st_data_t)name, &orig)) { + i = rb_enc_alias(name, (char *)orig); + } + } rb_set_errinfo(Qnil); } return i; -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA