[#32498] Re: [ruby-cvs:21399] Ruby:r14162 (trunk): * parse.y (expr): redefinable not (!) operator. — SASADA Koichi <ko1@...>

 ささだです.

9 messages 2007/12/09

[#32512] Re: [ruby-cvs:21409] Ruby:r14172 (trunk): * transcode.c: new file to provide encoding conversion features. — Nobuyoshi Nakada <nobu@...>

なかだです。

33 messages 2007/12/10
[#32520] Re: [ruby-cvs:21409] Ruby:r14172 (trunk): * transcode.c: new file to provide encoding conversion features. — Martin Duerst <duerst@...> 2007/12/10

中田さん、こんにちは。

[#32527] Re: [ruby-cvs:21409] Ruby:r14172 (trunk): * transcode.c: new file to provide encoding conversion features. — Nobuyoshi Nakada <nobu@...> 2007/12/10

なかだです。

[#32535] Re: [ruby-cvs:21409] Ruby:r14172 (trunk): * transcode.c: new file to provide encoding conversion features. — Yukihiro Matsumoto <matz@...> 2007/12/11

まつもと ゆきひろです

[#32537] Re: [ruby-cvs:21409] Ruby:r14172 (trunk): * transcode.c: new file to provide encoding conversion features. — Martin Duerst <duerst@...> 2007/12/11

At 15:33 07/12/11, Yukihiro Matsumoto wrote:

[#32538] Re: [ruby-cvs:21409] Ruby:r14172 (trunk): * transcode.c: new file to provide encoding conversion features. — Yukihiro Matsumoto <matz@...> 2007/12/11

まつもと ゆきひろです

[#32539] Re: [ruby-cvs:21409] Ruby:r14172 (trunk): * transcode.c: new file to provide encoding conversion features. — Nobuyoshi Nakada <nobu@...> 2007/12/11

なかだです。

[#32550] Binary String — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

204 messages 2007/12/12
[#32551] Re: Binary String — Yukihiro Matsumoto <matz@...> 2007/12/12

まつもと ゆきひろです

[#32552] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2007/12/12

永井@知能.九工大です.

[#32553] Re: Binary String — Yukihiro Matsumoto <matz@...> 2007/12/12

まつもと ゆきひろです

[#32560] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2007/12/12

永井@知能.九工大です.

[#32561] Re: Binary String — Nobuyoshi Nakada <nobu@...> 2007/12/12

なかだです。

[#33018] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2008/01/11

永井@知能.九工大です.

[#33019] Re: Binary String — Tanaka Akira <akr@...> 2008/01/11

In article <20080111.171950.78716471.nagai@ai.kyutech.ac.jp>,

[#33024] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2008/01/11

永井@知能.九工大です.

[#33027] Re: Binary String — Tanaka Akira <akr@...> 2008/01/11

In article <20080111.184442.74744388.nagai@ai.kyutech.ac.jp>,

[#33041] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2008/01/11

永井@知能.九工大です.

[#33047] Re: Binary String — Tanaka Akira <akr@...> 2008/01/11

In article <20080112.004750.74741782.nagai@ai.kyutech.ac.jp>,

[#33055] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2008/01/12

永井@知能.九工大です.

[#33080] Re: Binary String — Tanaka Akira <akr@...> 2008/01/13

In article <20080112.100830.112615025.nagai@ai.kyutech.ac.jp>,

[#33104] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2008/01/14

永井@知能.九工大です.

[#33108] Re: Binary String — "NARUSE, Yui" <naruse@...> 2008/01/15

成瀬です。

[#33121] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2008/01/15

永井@知能.九工大です.

[#33123] Re: Binary String — "NARUSE, Yui" <naruse@...> 2008/01/15

成瀬です。

[#33127] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2008/01/16

永井@知能.九工大です.

[#33138] Re: Binary String — "NARUSE, Yui" <naruse@...> 2008/01/16

成瀬です。

[#33147] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2008/01/17

永井@知能.九工大です.

[#33152] Re: Binary String — "NARUSE, Yui" <naruse@...> 2008/01/17

成瀬です。

[#33153] Re: Binary String — 遊楽庵 <yu_raku_an@...> 2008/01/17

遊楽庵です。

[#33154] Re: Binary String — "NARUSE, Yui" <naruse@...> 2008/01/17

成瀬です。

[#33157] Re: Binary String — Yukihiro Matsumoto <matz@...> 2008/01/17

まつもと ゆきひろです

[#33330] Re: Binary String — "NARUSE, Yui" <naruse@...> 2008/01/23

成瀬です。

[#33336] Re: Binary String — Tanaka Akira <akr@...> 2008/01/23

In article <47975933.8010907@airemix.com>,

[#33337] Re: Binary String — Yukihiro Matsumoto <matz@...> 2008/01/23

まつもと ゆきひろです

[#33346] Re: Binary String — "U.Nakamura" <usa@...> 2008/01/24

こんにちは、なかむら(う)です。

[#33348] Re: Binary String — Yukihiro Matsumoto <matz@...> 2008/01/24

まつもと ゆきひろです

[#33352] Re: Binary String — "U.Nakamura" <usa@...> 2008/01/24

こんにちは、なかむら(う)です。

[#33353] Re: Binary String — Yukihiro Matsumoto <matz@...> 2008/01/24

まつもと ゆきひろです

[#33122] Re: Binary String — Tanaka Akira <akr@...> 2008/01/15

In article <20080115.024201.41653719.nagai@ai.kyutech.ac.jp>,

[#33126] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2008/01/16

永井@知能.九工大です.

[#33151] Re: Binary String — Tanaka Akira <akr@...> 2008/01/17

In article <20080116.102057.41656941.nagai@ai.kyutech.ac.jp>,

[#33160] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2008/01/17

永井@知能.九工大です.

[#33165] Re: Binary String — Tanaka Akira <akr@...> 2008/01/18

In article <20080117.233832.74721189.nagai@ai.kyutech.ac.jp>,

[#33188] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2008/01/19

永井@知能.九工大です.

[#33193] Re: Binary String — Yukihiro Matsumoto <matz@...> 2008/01/19

まつもと ゆきひろです

[#33202] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2008/01/19

永井@知能.九工大です.

[#33230] Re: Binary String — Yukihiro Matsumoto <matz@...> 2008/01/20

まつもと ゆきひろです

[#33236] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2008/01/21

永井@知能.九工大です.

[#33238] Re: Binary String — SASADA Koichi <ko1@...> 2008/01/21

 m17n には近づかないようにしているささだです。

[#33241] Re: Binary String — "NARUSE, Yui" <naruse@...> 2008/01/21

成瀬です。

[#33248] Re: Binary String — Yukihiro Matsumoto <matz@...> 2008/01/21

まつもと ゆきひろです

[#33281] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2008/01/22

永井@知能.九工大です.

[#33285] Re: Binary String — "NARUSE, Yui" <naruse@...> 2008/01/22

成瀬です。

[#33318] Re: Binary String — Hidetoshi NAGAI <nagai@...> 2008/01/23

永井@知能.九工大です.

[#33186] Ruby1.9 String バイト列へのインデックス アクセス — "Hisanori Kiryu" <hkiryu@...> 2008/01/19

長文失礼します。

[#33192] Re: Ruby1.9 String バイト列へのインデックス アクセス — Yukihiro Matsumoto <matz@...> 2008/01/19

まつもと ゆきひろです

[#33195] Re: Ruby1.9 String バイト列へのインデックス アクセス — rubikitch@... 2008/01/19

From: Yukihiro Matsumoto <matz@ruby-lang.org>

[#33199] Re: Ruby1.9 String バイト列へのインデックス アクセス — "NARUSE, Yui" <naruse@...> 2008/01/19

成瀬です。

[#33020] Re: Binary String — "NARUSE, Yui" <naruse@...> 2008/01/11

成瀬です。

[#32610] 1.9.1 issues left (as of 12/15) — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

14 messages 2007/12/15

[#32715] issues left as of 12/25 2:00am JST — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

41 messages 2007/12/24
[#32738] issues left as of 12/25 noon JST — Yukihiro Matsumoto <matz@...> 2007/12/25

まつもと ゆきひろです

[#32739] Re: issues left as of 12/25 noon JST — Yukihiro Matsumoto <matz@...> 2007/12/25

まつもと ゆきひろです

[#32791] Re: [ruby-list:44387] [ANN] Ruby 1.9.0 is released — SASADA Koichi <ko1@...>

 ささだです。

21 messages 2007/12/25

[#32823] class TimeSpan — "NARUSE, Yui" <naruse@...>

成瀬です。

18 messages 2007/12/27

[#32843] Windowでのデフォルトエンコーディング — KIMURA Koichi <kimura.koichi@...>

木村です。

30 messages 2007/12/28
[#32845] Re: Windowでのデフォルトエンコーディング — "U.Nakamura" <usa@...> 2007/12/28

こんにちは、なかむら(う)です。

[#32851] Re: Window でのデフォルトエンコーディング — Martin Duerst <duerst@...> 2007/12/28

At 13:55 07/12/28, U.Nakamura wrote:

[#32853] Re: Windowでのデフォルトエンコーディング — "NARUSE, Yui" <naruse@...> 2007/12/28

U.Nakamura wrote:

[#32857] Re: Windowでのデフォルトエンコーディング — "U.Nakamura" <usa@...> 2007/12/28

こんにちは、なかむら(う)です。

[#32852] Resolv::DNS#getaddresses doesn't return IPv6 address — "NARUSE, Yui" <naruse@...>

成瀬です。

17 messages 2007/12/28
[#32923] Re: Resolv::DNS#getaddresses doesn't return IPv6 address — Takahiro Kambe <taca@...> 2008/01/05

こんにちは。

[#32924] Re: Resolv::DNS#getaddresses doesn't return IPv6 address — "NARUSE, Yui" <naruse@...> 2008/01/05

成瀬です。

[#32925] Re: Resolv::DNS#getaddresses doesn't return IPv6 address — Takahiro Kambe <taca@...> 2008/01/05

In message <477EF0C9.4060103@airemix.com>

[#32929] Re: Resolv::DNS#getaddresses doesn't return IPv6 address — "NARUSE, Yui" <naruse@...> 2008/01/05

成瀬です

[ruby-dev:32572] Re: transcoder loading

From: Martin Duerst <duerst@...>
Date: 2007-12-13 04:27:57 UTC
List: ruby-dev #32572
中田さん、こんにちは。

At 04:05 07/12/13, you wrote:
>なかだです。
>
>transcoderを拡張ライブラリに出してみました。ext/とは別にしたほう
>がいいかもしれませんが。

その通りだと思います。これからデータのファイルが増えるので、
メインのところにはちょっと不便ですが、ext にするといちいち
require が必要になると思いますが、これはとても不便だと思います。
require が必要になったら結局 String#encode が定義されているが、
require しないと使えない、という不思議な現象になってしまうでしょう。

データを動機的にロードするのは目指したいですが、require と
切り離して考える必要だと思います。

ファイルの場所を考えると、enc の中、もしくは enc/trans では
いいのではないかと思います。

>include/ruby/transcode.hとext/enc/trans/iso_8859/iso_8859.cは、
>それぞれtranscode_data.hとtranscode_data_iso_8859.cをsvn mv した
>ものです。

細かいところだけいいますと、/iso_8859/ の部分は要らないと思います。
ファイル一つだけのためのディレクトリは余り意味がないと思います。
しかも、iso-8859 見たいに標準にそってファイルをまとめることに
は長期的にはならないと思います。データの効率を考えると文字種
(例えば Latin、Greek、など) にそってまとめた方がいいと思います。

後は、(予定していた) transcode.h と (既に存在する) transcode_data.h
は別物として考えています。transcode.h はルビから使える機能を定義し、
transcode_data.h はデータ形式関係のものを定義し、ルビからは
アクセスしなくていいもの、という考え方です。

以下のところも少しコメントを追加します。色々な変更が
重なってしまってちょっとやりにくいところがあります。

宜しくお願いします。    Martin.

>Index: common.mk
>===================================================================
>--- common.mk  (revision 14198)
>+++ common.mk  (working copy)
>@@ -25,4 +25,6 @@ ENCOBJS       = ascii.$(OBJEXT) \
>               utf8.$(OBJEXT)
> 
>+TRANSCODEOBJS = iso_8859.$(OBJEXT)
>+
> COMMONOBJS    = array.$(OBJEXT) \
>               bignum.$(OBJEXT) \
>@@ -67,5 +69,4 @@ COMMONOBJS    = array.$(OBJEXT) \
>               time.$(OBJEXT) \
>               transcode.$(OBJEXT) \
>-              transcode_data_iso_8859.$(OBJEXT) \
>               util.$(OBJEXT) \
>               variable.$(OBJEXT) \
>@@ -544,7 +545,6 @@ thread.$(OBJEXT): {$(VPATH)}thread.c {$(
>   {$(VPATH)}node.h {$(VPATH)}util.h \
>   {$(VPATH)}signal.h {$(VPATH)}st.h {$(VPATH)}dln.h
>-transcode.$(OBJEXT): {$(VPATH)}transcode.c {$(VPATH)}transcode_data.h 
>{$(VPATH)}ruby.h {$(VPATH)}config.h \
>+transcode.$(OBJEXT): {$(VPATH)}transcode.c {$(VPATH)}transcode.h 
>{$(VPATH)}ruby.h {$(VPATH)}config.h \
>   {$(VPATH)}defines.h {$(VPATH)}intern.h {$(VPATH)}missing.h  
>{$(VPATH)}encoding.h
>-transcode_data_iso_8859.$(OBJEXT): {$(VPATH)}transcode_data_iso_8859.c 
>{$(VPATH)}transcode_data.h
> cont.$(OBJEXT):  {$(VPATH)}cont.c {$(VPATH)}eval_intern.h \
>   {$(VPATH)}ruby.h {$(VPATH)}vm_core.h {$(VPATH)}id.h {$(VPATH)}config.h \
>Index: transcode.c
>===================================================================
>--- transcode.c        (revision 14198)
>+++ transcode.c        (working copy)
>@@ -13,7 +13,7 @@
> #include "ruby/ruby.h"
> #include "ruby/encoding.h"
>-
>-#include "transcode_data.h"
>-
>+#define PType (int)
>+#include "ruby/transcode.h"
>+#include <ctype.h>
> 
> VALUE rb_str_tmp_new(long);
>@@ -24,130 +24,62 @@ VALUE rb_str_shared_replace(VALUE, VALUE
>  */
> 
>-/* extern declarations, should use some include file here */
>-extern const BYTE_LOOKUP from_ISO_8859_1;
>-extern const BYTE_LOOKUP from_ISO_8859_2;
>-extern const BYTE_LOOKUP from_ISO_8859_3;
>-extern const BYTE_LOOKUP from_ISO_8859_4;
>-extern const BYTE_LOOKUP from_ISO_8859_5;
>-extern const BYTE_LOOKUP from_ISO_8859_6;
>-extern const BYTE_LOOKUP from_ISO_8859_7;
>-extern const BYTE_LOOKUP from_ISO_8859_8;
>-extern const BYTE_LOOKUP from_ISO_8859_9;
>-extern const BYTE_LOOKUP from_ISO_8859_10;
>-extern const BYTE_LOOKUP from_ISO_8859_11;
>-extern const BYTE_LOOKUP from_ISO_8859_13;
>-extern const BYTE_LOOKUP from_ISO_8859_14;
>-extern const BYTE_LOOKUP from_ISO_8859_15;
>-
>-extern const BYTE_LOOKUP to_ISO_8859_1;
>-extern const BYTE_LOOKUP to_ISO_8859_2;
>-extern const BYTE_LOOKUP to_ISO_8859_3;
>-extern const BYTE_LOOKUP to_ISO_8859_4;
>-extern const BYTE_LOOKUP to_ISO_8859_5;
>-extern const BYTE_LOOKUP to_ISO_8859_6;
>-extern const BYTE_LOOKUP to_ISO_8859_7;
>-extern const BYTE_LOOKUP to_ISO_8859_8;
>-extern const BYTE_LOOKUP to_ISO_8859_9;
>-extern const BYTE_LOOKUP to_ISO_8859_10;
>-extern const BYTE_LOOKUP to_ISO_8859_11;
>-extern const BYTE_LOOKUP to_ISO_8859_13;
>-extern const BYTE_LOOKUP to_ISO_8859_14;
>-extern const BYTE_LOOKUP to_ISO_8859_15;
>-
>-
>-/* declarations probably need to go into separate header file, e.g. 
>transcode.h */
>-
>-/* static structure, one per supported encoding pair */
>-typedef struct {
>-    const char *from_encoding;
>-    const char *to_encoding;
>-    const BYTE_LOOKUP *conv_tree_start;
>-    int max_output;
>-    int from_utf8;
>-} transcoder;
>-
>-/* todo: dynamic structure, one per conversion (stream) */
>-
>-/* in the future, add some mechanism for dynamically adding stuff here */
>-#define MAX_TRANSCODERS 29  /* todo: fix: this number has to be adjusted 
>by hand */
>-static transcoder transcoder_table[MAX_TRANSCODERS];
>+static st_table *transcoder_table;

ハッシュにするのはありかと思います。


>+#define TRANSCODER_SEP '@'

これは内部だけの決まりだと思いましたが、ファイル名にまで使われているので、
十分検討した方がいいと思います。

> /* not sure why it's not possible to do relocatable initializations */
> /* maybe the code here can be removed (changed to simple initialization) */
> /* if we move this to another file???? */
>-static void
>-register_transcoder(const char *from_e, const char *to_e,
>-    const BYTE_LOOKUP *tree_start, int max_output, int from_utf8)
>-{
>-    static int n = 0;
>-    if (n >= MAX_TRANSCODERS) {
>-        /* we are initializing, is it okay to use rb_raise here? */
>-        rb_raise(rb_eRuntimeError /*change exception*/, "not enough 
>transcoder slots");
>-    }
>-    transcoder_table[n].from_encoding = from_e;
>-    transcoder_table[n].to_encoding = to_e;
>-    transcoder_table[n].conv_tree_start = tree_start;
>-    transcoder_table[n].max_output = max_output;
>-    transcoder_table[n].from_utf8 = from_utf8;
>-
>-    n++;
>-}
>-
>-static void
>-init_transcoder_table(void)
>+void
>+rb_register_transcoder(const char *from_e, const char *to_e,
>+                     rb_transcode_loop_func *func, const void *arg, int max_output)
> {
>-    register_transcoder("ISO-8859-1",  "UTF-8", &from_ISO_8859_1, 2, 0);
>-    register_transcoder("ISO-8859-2",  "UTF-8", &from_ISO_8859_2, 2, 0);
>-    register_transcoder("ISO-8859-3",  "UTF-8", &from_ISO_8859_3, 2, 0);
>-    register_transcoder("ISO-8859-4",  "UTF-8", &from_ISO_8859_4, 2, 0);
>-    register_transcoder("ISO-8859-5",  "UTF-8", &from_ISO_8859_5, 3, 0);
>-    register_transcoder("ISO-8859-6",  "UTF-8", &from_ISO_8859_6, 2, 0);
>-    register_transcoder("ISO-8859-7",  "UTF-8", &from_ISO_8859_7, 3, 0);
>-    register_transcoder("ISO-8859-8",  "UTF-8", &from_ISO_8859_8, 3, 0);
>-    register_transcoder("ISO-8859-9",  "UTF-8", &from_ISO_8859_9, 2, 0);
>-    register_transcoder("ISO-8859-10", "UTF-8", &from_ISO_8859_10, 3, 0);
>-    register_transcoder("ISO-8859-11", "UTF-8", &from_ISO_8859_11, 3, 0);
>-    register_transcoder("ISO-8859-13", "UTF-8", &from_ISO_8859_13, 3, 0);
>-    register_transcoder("ISO-8859-14", "UTF-8", &from_ISO_8859_14, 3, 0);
>-    register_transcoder("ISO-8859-15", "UTF-8", &from_ISO_8859_15, 3, 0);
>-    register_transcoder("UTF-8", "ISO-8859-1",  &to_ISO_8859_1, 1, 1);
>-    register_transcoder("UTF-8", "ISO-8859-2",  &to_ISO_8859_2, 1, 1);
>-    register_transcoder("UTF-8", "ISO-8859-3",  &to_ISO_8859_3, 1, 1);
>-    register_transcoder("UTF-8", "ISO-8859-4",  &to_ISO_8859_4, 1, 1);
>-    register_transcoder("UTF-8", "ISO-8859-5",  &to_ISO_8859_5, 1, 1);
>-    register_transcoder("UTF-8", "ISO-8859-6",  &to_ISO_8859_6, 1, 1);
>-    register_transcoder("UTF-8", "ISO-8859-7",  &to_ISO_8859_7, 1, 1);
>-    register_transcoder("UTF-8", "ISO-8859-8",  &to_ISO_8859_8, 1, 1);
>-    register_transcoder("UTF-8", "ISO-8859-9",  &to_ISO_8859_9, 1, 1);
>-    register_transcoder("UTF-8", "ISO-8859-10", &to_ISO_8859_10, 1, 1);
>-    register_transcoder("UTF-8", "ISO-8859-11", &to_ISO_8859_11, 1, 1);
>-    register_transcoder("UTF-8", "ISO-8859-13", &to_ISO_8859_13, 1, 1);
>-    register_transcoder("UTF-8", "ISO-8859-14", &to_ISO_8859_14, 1, 1);
>-    register_transcoder("UTF-8", "ISO-8859-15", &to_ISO_8859_15, 1, 1);
>-    register_transcoder(NULL, NULL, NULL, 0, 0);
>+    long from_len = strlen(from_e);
>+    long to_len = strlen(to_e);
>+    char *const key = xmalloc(from_len + to_len + 2);
>+    st_data_t val = 0;
>+    rb_transcoder *my_transcoder;
>+
>+    memcpy(key, from_e, from_len);
>+    memcpy(key + from_len + 1, to_e, to_len + 1);
>+    key[from_len] = TRANSCODER_SEP;
>+    if (st_lookup(transcoder_table, (st_data_t)key, &val)) {
>+      xfree(key);
>+      rb_raise(rb_eArgError, "transcoder has been already registered - %s", key);
>+    }
>+    my_transcoder = ALLOC(rb_transcoder);
>+    my_transcoder->transcode_loop = func;
>+    my_transcoder->transcode_arg = (void *)arg;
>+    my_transcoder->max_output = max_output;
>+    st_insert(transcoder_table, (st_data_t)key, (st_data_t)my_transcoder);
> }
> 
>-
>-static transcoder*
>+static rb_transcoder *
> transcode_dispatch(const char* from_encoding, const char* to_encoding)
> {
>-    transcoder *candidate = transcoder_table;
>-    
>-    for (candidate = transcoder_table; candidate->from_encoding; candidate++)
>-        if (0==strcasecmp(from_encoding, candidate->from_encoding)
>-            && 0==strcasecmp(to_encoding, candidate->to_encoding))
>-                break;
>-    /* in the future, add multistep transcoding logic here */
>-    return candidate->from_encoding ? candidate : NULL;
>+    static const char prefix[] = "enc/trans/";
>+    long from_len = strlen(from_encoding);
>+    long to_len = strlen(to_encoding);
>+    char *const path = alloca(from_len + to_len + sizeof(prefix) + 1);
>+    char *const key = path + sizeof(prefix) - 1;
>+    st_data_t val = 0;
>+    char *s;
>+
>+    memcpy(key, from_encoding, from_len);
>+    memcpy(key + from_len + 1, to_encoding, to_len + 1);
>+    key[from_len] = TRANSCODER_SEP;
>+    for (s = key; *s; ++s) {
>+      if (ISUPPER(*s)) *s = tolower(*s);

今まで見たところで、ルビ内の Encoding は全部大文字になっていますので、
なぜでここで小文字にしますか。

後、ここの memcpy などのコードは rb_register_transcoder と
すごく似ています。

>+    }
>+    if (!st_lookup(transcoder_table, (st_data_t)key, &val)) {
>+      memcpy(path, prefix, sizeof(prefix) - 1);
>+      if (!rb_require(path)) return 0;
>+      if (!st_lookup(transcoder_table, (st_data_t)key, &val)) {
>+          return 0;
>+      }
>+    }
>+    return (rb_transcoder *)val;
> }
> 
>-/* dynamic structure, one per conversion (similar to iconv_t) */
>-/* may carry conversion state (e.g. for iso-2022-jp) */
>-typedef struct transcoding {
>-    VALUE ruby_string_dest; /* the String used as the conversion destination,
>-                               or NULL if something else is being converted */
>-    char *(*flush_func)(struct transcoding*, int, int);
>-} transcoding;
>-
> 
> /*
>@@ -157,14 +89,14 @@ static void
> transcode_loop(char **in_pos, char **out_pos,
>              char *in_stop, char *out_stop,
>-             transcoder *my_transcoder,
>-             transcoding *my_transcoding)
>+             const rb_transcoder *my_transcoder,
>+             int from_utf8,

変数を増やさない方がいいと思います。

>+             rb_transcoding *my_transcoding)
> {
>     char *in_p = *in_pos, *out_p = *out_pos;
>-    const BYTE_LOOKUP *conv_tree_start = my_transcoder->conv_tree_start;
>+    const BYTE_LOOKUP *conv_tree_start = my_transcoder->transcode_arg;

変数、メンバーの名前を変える必要がないと思います。

>     const BYTE_LOOKUP *next_table;
>     unsigned int next_offset;
>     VALUE next_info;
>     unsigned char next_byte;
>-    int from_utf8 = my_transcoder->from_utf8;
>     char *out_s = out_stop - my_transcoder->max_output + 1;
>     while (in_p < in_stop) {
>@@ -238,4 +170,24 @@ transcode_loop(char **in_pos, char **out
> }
> 
>+void
>+rb_transcode_loop_from_utf8(char **in_pos, char **out_pos,
>+                          char *in_stop, char *out_stop,
>+                          const rb_transcoder *my_transcoder,
>+                          rb_transcoding *my_transcoding)
>+{
>+    transcode_loop(in_pos, out_pos, in_stop, out_stop,
>+                 my_transcoder, 1, my_transcoding);
>+}
>+
>+void
>+rb_transcode_loop_simple(char **in_pos, char **out_pos,
>+                      char *in_stop, char *out_stop,
>+                      const rb_transcoder *my_transcoder,
>+                      rb_transcoding *my_transcoding)
>+{
>+    transcode_loop(in_pos, out_pos, in_stop, out_stop,
>+                 my_transcoder, 0, my_transcoding);
>+}
>+

関数を増やす必要が現在内と思います。

> /*
>@@ -244,5 +196,5 @@ transcode_loop(char **in_pos, char **out
> 
> static char *
>-str_transcoding_resize(transcoding *my_transcoding, int len, int new_len)
>+str_transcoding_resize(rb_transcoding *my_transcoding, int len, int new_len)
> {
>     VALUE dest_string = my_transcoding->ruby_string_dest;
>@@ -261,6 +213,6 @@ str_transcode(int argc, VALUE *argv, VAL
>     int from_encidx, to_encidx;
>     VALUE from_encval, to_encval;
>-    transcoder *my_transcoder;
>-    transcoding my_transcoding;
>+    rb_transcoder *my_transcoder;
>+    rb_transcoding my_transcoding;
> 
>     if (argc<1 || argc>2) {
>@@ -312,5 +264,6 @@ str_transcode(int argc, VALUE *argv, VAL
> 
>     /* for simple testing: */
>-    transcode_loop(&fromp, &bp, (sp+slen), (bp+blen), my_transcoder, 
>&my_transcoding);
>+    my_transcoder->transcode_loop(&fromp, &bp, (sp+slen), (bp+blen),
>+                                my_transcoder->transcode_arg, &my_transcoding);

やりたいことが分かりますが、あくまでもデータ中心にやった方がいいと思います。

>     if (fromp != sp+slen) {
>       rb_raise(rb_eArgError, "not fully converted, %d bytes left", sp+slen-fromp);
>@@ -375,5 +328,5 @@ void
> Init_transcode(void)
> {
>-    init_transcoder_table();
>+    transcoder_table = st_init_strcasetable();
>     rb_define_method(rb_cString, "encode", rb_str_transcode, -1);
>     rb_define_method(rb_cString, "encode!", rb_str_transcode_bang, -1);
>Index: include/ruby/transcode.h
>===================================================================
>--- include/ruby/transcode.h   (revision 14198)
>+++ include/ruby/transcode.h   (working copy)
>@@ -1,2 +1,5 @@
>+#ifndef RUBY_TRANSCODE_H
>+#define RUBY_TRANSCODE_H
>+
> typedef unsigned char base_element;
> 
>@@ -6,10 +9,15 @@ typedef struct byte_lookup {
> } BYTE_LOOKUP;
> 
>-#ifdef TRANSCODE_DATA
>+/* dynamic structure, one per conversion (similar to iconv_t) */
>+/* may carry conversion state (e.g. for iso-2022-jp) */
>+typedef struct rb_transcoding {
>+    VALUE ruby_string_dest; /* the String used as the conversion destination,
>+                               or NULL if something else is being converted */
>+    char *(*flush_func)(struct rb_transcoding*, int, int);
>+} rb_transcoding;
>+
>+#ifndef PType
> /* data file needs to treat this as a pointer, to remove warnings */
> #define PType (const BYTE_LOOKUP *)
>-#else
>-/* in code, this is treated as just an integer */
>-#define PType (int)
> #endif
> 
>@@ -38,2 +46,23 @@ typedef struct byte_lookup {
> #define THREETRAIL     /* legal but undefined if three more trailing UTF-8 */
> 
>+/* static structure, one per supported encoding pair */
>+typedef struct rb_transcoder rb_transcoder;
>+
>+typedef void rb_transcode_loop_func(char **, char **, char *, char *,
>+                                  const struct rb_transcoder *, rb_transcoding *);
>+
>+struct rb_transcoder {
>+    rb_transcode_loop_func *transcode_loop;
>+    void *transcode_arg;
>+    int max_output;
>+};
>+
>+void rb_transcode_loop_from_utf8(char **, char **, char *, char *,
>+                              const rb_transcoder *, rb_transcoding *);
>+void rb_transcode_loop_simple(char **, char **, char *, char *,
>+                            const rb_transcoder *, rb_transcoding *);
>+
>+void rb_register_transcoder(const char *from_e, const char *to_e,
>+                          rb_transcode_loop_func *func, const void *arg,
>+                          int max_output);
>+#endif
>Index: ext/enc/trans/iso_8859/lib/iso-8859-1@utf-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/iso-8859-1@utf-8.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/iso-8859-1@utf-8.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/utf-8@iso-8859-1.rb

いちいち一行のファイルを作るのはちょっとやりすぎだと思います。
もうちょっといい方法はないのでしょうか。

このやり方でルビの内部でどの変換があるのか分からないという問題になる
のもよく分かります。これは例えば force_encoding の ([ruby-dev:32563]
など) と関係するだけではなく、utf-8 とか経由の二段階とかで変換するときにも
問題になりそうです。

>===================================================================
>--- ext/enc/trans/iso_8859/lib/utf-8@iso-8859-1.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/utf-8@iso-8859-1.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/iso-8859-2@utf-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/iso-8859-2@utf-8.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/iso-8859-2@utf-8.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/utf-8@iso-8859-2.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/utf-8@iso-8859-2.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/utf-8@iso-8859-2.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/iso-8859-3@utf-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/iso-8859-3@utf-8.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/iso-8859-3@utf-8.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/utf-8@iso-8859-3.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/utf-8@iso-8859-3.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/utf-8@iso-8859-3.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/iso-8859-4@utf-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/iso-8859-4@utf-8.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/iso-8859-4@utf-8.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/utf-8@iso-8859-4.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/utf-8@iso-8859-4.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/utf-8@iso-8859-4.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/iso-8859-5@utf-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/iso-8859-5@utf-8.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/iso-8859-5@utf-8.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/utf-8@iso-8859-5.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/utf-8@iso-8859-5.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/utf-8@iso-8859-5.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/iso-8859-6@utf-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/iso-8859-6@utf-8.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/iso-8859-6@utf-8.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/utf-8@iso-8859-6.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/utf-8@iso-8859-6.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/utf-8@iso-8859-6.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/iso-8859-7@utf-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/iso-8859-7@utf-8.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/iso-8859-7@utf-8.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/utf-8@iso-8859-7.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/utf-8@iso-8859-7.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/utf-8@iso-8859-7.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/utf-8@iso-8859-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/utf-8@iso-8859-8.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/utf-8@iso-8859-8.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/iso-8859-8@utf-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/iso-8859-8@utf-8.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/iso-8859-8@utf-8.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/utf-8@iso-8859-9.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/utf-8@iso-8859-9.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/utf-8@iso-8859-9.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/iso-8859-9@utf-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/iso-8859-9@utf-8.rb     (revision 0)
>+++ ext/enc/trans/iso_8859/lib/iso-8859-9@utf-8.rb     (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/utf-8@iso-8859-10.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/utf-8@iso-8859-10.rb    (revision 0)
>+++ ext/enc/trans/iso_8859/lib/utf-8@iso-8859-10.rb    (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/iso-8859-10@utf-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/iso-8859-10@utf-8.rb    (revision 0)
>+++ ext/enc/trans/iso_8859/lib/iso-8859-10@utf-8.rb    (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/utf-8@iso-8859-11.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/utf-8@iso-8859-11.rb    (revision 0)
>+++ ext/enc/trans/iso_8859/lib/utf-8@iso-8859-11.rb    (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/iso-8859-11@utf-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/iso-8859-11@utf-8.rb    (revision 0)
>+++ ext/enc/trans/iso_8859/lib/iso-8859-11@utf-8.rb    (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/iso-8859-12@utf-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/iso-8859-12@utf-8.rb    (revision 0)
>+++ ext/enc/trans/iso_8859/lib/iso-8859-12@utf-8.rb    (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/utf-8@iso-8859-12.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/utf-8@iso-8859-12.rb    (revision 0)
>+++ ext/enc/trans/iso_8859/lib/utf-8@iso-8859-12.rb    (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/iso-8859-13@utf-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/iso-8859-13@utf-8.rb    (revision 0)
>+++ ext/enc/trans/iso_8859/lib/iso-8859-13@utf-8.rb    (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/utf-8@iso-8859-13.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/utf-8@iso-8859-13.rb    (revision 0)
>+++ ext/enc/trans/iso_8859/lib/utf-8@iso-8859-13.rb    (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/utf-8@iso-8859-14.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/utf-8@iso-8859-14.rb    (revision 0)
>+++ ext/enc/trans/iso_8859/lib/utf-8@iso-8859-14.rb    (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/iso-8859-14@utf-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/iso-8859-14@utf-8.rb    (revision 0)
>+++ ext/enc/trans/iso_8859/lib/iso-8859-14@utf-8.rb    (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/utf-8@iso-8859-15.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/utf-8@iso-8859-15.rb    (revision 0)
>+++ ext/enc/trans/iso_8859/lib/utf-8@iso-8859-15.rb    (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/lib/iso-8859-15@utf-8.rb
>===================================================================
>--- ext/enc/trans/iso_8859/lib/iso-8859-15@utf-8.rb    (revision 0)
>+++ ext/enc/trans/iso_8859/lib/iso-8859-15@utf-8.rb    (revision 0)
>@@ -0,0 +1 @@
>+require "enc/trans/iso_8859"
>Index: ext/enc/trans/iso_8859/iso_8859.c
>===================================================================
>--- ext/enc/trans/iso_8859/iso_8859.c  (revision 0)
>+++ ext/enc/trans/iso_8859/iso_8859.c  (working copy)
>@@ -1,4 +1,9 @@
>-#define TRANSCODE_DATA
>-#include "transcode_data.h"
>+#include "ruby.h"
>+#include "ruby/transcode.h"
>+
>+typedef struct {
>+    const BYTE_LOOKUP *conv_tree_start;
>+    int max_output;
>+} iso_8859_transcoder;

これは少なくともいまの段階で必要ないかと思います。

> static const unsigned char
>@@ -89,5 +94,5 @@ from_ISO_8859_1_infos[129] = {
>      output2('\xC3','\xBF'),
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> from_ISO_8859_1 = {
>     from_ISO_8859_1_offsets,
>@@ -182,5 +187,5 @@ to_ISO_8859_1_infos[3] = {
>                  NOMAP, &to_ISO_8859_1_C2, &to_ISO_8859_1_C3,
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> to_ISO_8859_1 = {
>     to_ISO_8859_1_offsets,
>@@ -275,5 +280,5 @@ from_ISO_8859_2_infos[129] = {
>      output2('\xCB','\x99'),
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> from_ISO_8859_2 = {
>     from_ISO_8859_2_offsets,
>@@ -418,5 +423,5 @@ to_ISO_8859_2_infos[6] = {
>      &to_ISO_8859_2_C5, &to_ISO_8859_2_CB,
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> to_ISO_8859_2 = {
>     to_ISO_8859_2_offsets,
>@@ -507,5 +512,5 @@ from_ISO_8859_3_infos[122] = {
>      output2('\xC5','\x9D'), output2('\xCB','\x99'),
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> from_ISO_8859_3 = {
>     from_ISO_8859_3_offsets,
>@@ -649,5 +654,5 @@ to_ISO_8859_3_infos[6] = {
>      &to_ISO_8859_3_C5, &to_ISO_8859_3_CB,
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> to_ISO_8859_3 = {
>     to_ISO_8859_3_offsets,
>@@ -742,5 +747,5 @@ from_ISO_8859_4_infos[129] = {
>      output2('\xCB','\x99'),
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> from_ISO_8859_4 = {
>     from_ISO_8859_4_offsets,
>@@ -886,5 +891,5 @@ to_ISO_8859_4_infos[6] = {
>      &to_ISO_8859_4_C5, &to_ISO_8859_4_CB,
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> to_ISO_8859_4 = {
>     to_ISO_8859_4_offsets,
>@@ -979,5 +984,5 @@ from_ISO_8859_5_infos[129] = {
>             output2('\xD1','\x9F'),
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> from_ISO_8859_5 = {
>     from_ISO_8859_5_offsets,
>@@ -1124,5 +1129,5 @@ to_ISO_8859_5_infos[5] = {
>      &to_ISO_8859_5_E2,
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> to_ISO_8859_5 = {
>     to_ISO_8859_5_offsets,
>@@ -1194,5 +1199,5 @@ from_ISO_8859_6_infos[84] = {
>      output2('\xD9','\x91'), output2('\xD9','\x92'),
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> from_ISO_8859_6 = {
>     from_ISO_8859_6_offsets,
>@@ -1293,5 +1298,5 @@ to_ISO_8859_6_infos[4] = {
>                  NOMAP, &to_ISO_8859_6_C2, &to_ISO_8859_6_D8, &to_ISO_8859_6_D9,
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> to_ISO_8859_6 = {
>     to_ISO_8859_6_offsets,
>@@ -1384,5 +1389,5 @@ from_ISO_8859_7_infos[126] = {
>             output2('\xCF','\x8D'),        output2('\xCF','\x8E'),
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> from_ISO_8859_7 = {
>     from_ISO_8859_7_offsets,
>@@ -1560,5 +1565,5 @@ to_ISO_8859_7_infos[6] = {
>      &to_ISO_8859_7_CF, &to_ISO_8859_7_E2,
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> to_ISO_8859_7 = {
>     to_ISO_8859_7_offsets,
>@@ -1635,5 +1640,5 @@ from_ISO_8859_8_infos[93] = {
>      output3('\xE2','\x80','\x8F'),
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> from_ISO_8859_8 = {
>     from_ISO_8859_8_offsets,
>@@ -1770,5 +1775,5 @@ to_ISO_8859_8_infos[5] = {
>      &to_ISO_8859_8_E2,
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> to_ISO_8859_8 = {
>     to_ISO_8859_8_offsets,
>@@ -1863,5 +1868,5 @@ from_ISO_8859_9_infos[129] = {
>      output2('\xC3','\xBF'),
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> from_ISO_8859_9 = {
>     from_ISO_8859_9_offsets,
>@@ -1990,5 +1995,5 @@ to_ISO_8859_9_infos[5] = {
>      &to_ISO_8859_9_C5,
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> to_ISO_8859_9 = {
>     to_ISO_8859_9_offsets,
>@@ -2083,5 +2088,5 @@ from_ISO_8859_10_infos[129] = {
>             output2('\xC4','\xB8'),
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> from_ISO_8859_10 = {
>     from_ISO_8859_10_offsets,
>@@ -2245,5 +2250,5 @@ to_ISO_8859_10_infos[6] = {
>      &to_ISO_8859_10_C5, &to_ISO_8859_10_E2,
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> to_ISO_8859_10 = {
>     to_ISO_8859_10_offsets,
>@@ -2334,5 +2339,5 @@ from_ISO_8859_11_infos[121] = {
>      output3('\xE0','\xB9','\x9B'),
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> from_ISO_8859_11 = {
>     from_ISO_8859_11_offsets,
>@@ -2459,5 +2464,5 @@ to_ISO_8859_11_infos[3] = {
>                   NOMAP, &to_ISO_8859_11_C2, &to_ISO_8859_11_E0,
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> to_ISO_8859_11 = {
>     to_ISO_8859_11_offsets,
>@@ -2552,5 +2557,5 @@ from_ISO_8859_13_infos[129] = {
>      output3('\xE2','\x80','\x99'),
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> from_ISO_8859_13 = {
>     from_ISO_8859_13_offsets,
>@@ -2712,5 +2717,5 @@ to_ISO_8859_13_infos[6] = {
>      &to_ISO_8859_13_C5, &to_ISO_8859_13_E2,
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> to_ISO_8859_13 = {
>     to_ISO_8859_13_offsets,
>@@ -2805,5 +2810,5 @@ from_ISO_8859_14_infos[129] = {
>             output2('\xC3','\xBF'),
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> from_ISO_8859_14 = {
>     from_ISO_8859_14_offsets,
>@@ -3016,5 +3021,5 @@ to_ISO_8859_14_infos[6] = {
>      &to_ISO_8859_14_C5, &to_ISO_8859_14_E1,
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> to_ISO_8859_14 = {
>     to_ISO_8859_14_offsets,
>@@ -3109,5 +3114,5 @@ from_ISO_8859_15_infos[129] = {
>             output2('\xC3','\xBF'),
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> from_ISO_8859_15 = {
>     from_ISO_8859_15_offsets,
>@@ -3253,5 +3258,5 @@ to_ISO_8859_15_infos[5] = {
>      &to_ISO_8859_15_E2,
> };
>-const BYTE_LOOKUP
>+static const BYTE_LOOKUP
> to_ISO_8859_15 = {
>     to_ISO_8859_15_offsets,
>@@ -3259,2 +3264,40 @@ to_ISO_8859_15 = {
> };
> 
>+#define register_transcoder(from_e, to_e, tree_start, max_output, from_utf8) \
>+    rb_register_transcoder(from_e, to_e,                              \
>+                         (from_utf8 ? rb_transcode_loop_from_utf8 :   \
>+                          rb_transcode_loop_simple),                  \
>+                         tree_start, max_output)
>+
>+void
>+Init_iso_8859(void)
>+{
>+    register_transcoder("ISO-8859-1",  "UTF-8", &from_ISO_8859_1, 2, 0);
>+    register_transcoder("ISO-8859-2",  "UTF-8", &from_ISO_8859_2, 2, 0);
>+    register_transcoder("ISO-8859-3",  "UTF-8", &from_ISO_8859_3, 2, 0);
>+    register_transcoder("ISO-8859-4",  "UTF-8", &from_ISO_8859_4, 2, 0);
>+    register_transcoder("ISO-8859-5",  "UTF-8", &from_ISO_8859_5, 3, 0);
>+    register_transcoder("ISO-8859-6",  "UTF-8", &from_ISO_8859_6, 2, 0);
>+    register_transcoder("ISO-8859-7",  "UTF-8", &from_ISO_8859_7, 3, 0);
>+    register_transcoder("ISO-8859-8",  "UTF-8", &from_ISO_8859_8, 3, 0);
>+    register_transcoder("ISO-8859-9",  "UTF-8", &from_ISO_8859_9, 2, 0);
>+    register_transcoder("ISO-8859-10", "UTF-8", &from_ISO_8859_10, 3, 0);
>+    register_transcoder("ISO-8859-11", "UTF-8", &from_ISO_8859_11, 3, 0);
>+    register_transcoder("ISO-8859-13", "UTF-8", &from_ISO_8859_13, 3, 0);
>+    register_transcoder("ISO-8859-14", "UTF-8", &from_ISO_8859_14, 3, 0);
>+    register_transcoder("ISO-8859-15", "UTF-8", &from_ISO_8859_15, 3, 0);
>+    register_transcoder("UTF-8", "ISO-8859-1",  &to_ISO_8859_1, 1, 1);
>+    register_transcoder("UTF-8", "ISO-8859-2",  &to_ISO_8859_2, 1, 1);
>+    register_transcoder("UTF-8", "ISO-8859-3",  &to_ISO_8859_3, 1, 1);
>+    register_transcoder("UTF-8", "ISO-8859-4",  &to_ISO_8859_4, 1, 1);
>+    register_transcoder("UTF-8", "ISO-8859-5",  &to_ISO_8859_5, 1, 1);
>+    register_transcoder("UTF-8", "ISO-8859-6",  &to_ISO_8859_6, 1, 1);
>+    register_transcoder("UTF-8", "ISO-8859-7",  &to_ISO_8859_7, 1, 1);
>+    register_transcoder("UTF-8", "ISO-8859-8",  &to_ISO_8859_8, 1, 1);
>+    register_transcoder("UTF-8", "ISO-8859-9",  &to_ISO_8859_9, 1, 1);
>+    register_transcoder("UTF-8", "ISO-8859-10", &to_ISO_8859_10, 1, 1);
>+    register_transcoder("UTF-8", "ISO-8859-11", &to_ISO_8859_11, 1, 1);
>+    register_transcoder("UTF-8", "ISO-8859-13", &to_ISO_8859_13, 1, 1);
>+    register_transcoder("UTF-8", "ISO-8859-14", &to_ISO_8859_14, 1, 1);
>+    register_transcoder("UTF-8", "ISO-8859-15", &to_ISO_8859_15, 1, 1);
>+}
>Index: ext/enc/trans/iso_8859/extconf.rb
>===================================================================
>--- ext/enc/trans/iso_8859/extconf.rb  (revision 0)
>+++ ext/enc/trans/iso_8859/extconf.rb  (revision 0)
>@@ -0,0 +1 @@
>+create_makefile("enc/trans/iso_8859")
>
>
>-- 
>--- 僕の前にBugはない。
>--- 僕の後ろにBugはできる。
>    中田 伸悦


#-#-#  Martin J. Du"rst, Assoc. Professor, Aoyama Gakuin University
#-#-#  http://www.sw.it.aoyama.ac.jp       mailto:duerst@it.aoyama.ac.jp     


In This Thread