[#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:32563] transcoder loading

From: Nobuyoshi Nakada <nobu@...>
Date: 2007-12-12 19:05:10 UTC
List: ruby-dev #32563
なかだです。

transcoderを拡張ライブラリに出してみました。ext/とは別にしたほう
がいいかもしれませんが。

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


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);
+    }
+    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
===================================================================
--- 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はできる。
    中田 伸悦

In This Thread

Prev Next