summaryrefslogtreecommitdiffstats
path: root/transcode.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-25 06:21:35 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-25 06:21:35 +0000
commit35bfdea06f0b251d928e45241fbe0d7d61c8a390 (patch)
treeb5c9736c088ff5ba5155bf2116d9d6801316ae5f /transcode.c
parent246f016f0780a3f2f7b464bda65bb6148a27a54a (diff)
downloadruby-35bfdea06f0b251d928e45241fbe0d7d61c8a390.tar.gz
ruby-35bfdea06f0b251d928e45241fbe0d7d61c8a390.tar.xz
ruby-35bfdea06f0b251d928e45241fbe0d7d61c8a390.zip
* transcode.c (transcode_dispatch): fix for multistep transcode.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@14669 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'transcode.c')
-rw-r--r--transcode.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/transcode.c b/transcode.c
index e8c654516..ec0562934 100644
--- a/transcode.c
+++ b/transcode.c
@@ -117,8 +117,8 @@ transcode_dispatch(const char* from_encoding, const char* to_encoding)
st_data_t k, val = 0;
k = (st_data_t)key;
- if (!st_lookup(transcoder_table, k, &val) &&
- st_delete(transcoder_lib_table, &k, &val)) {
+ while (!st_lookup(transcoder_table, k, &val) &&
+ st_delete(transcoder_lib_table, &k, &val)) {
const char *const lib = (const char *)val;
int len = strlen(lib);
char path[sizeof(transcoder_lib_prefix) + MAX_TRANSCODER_LIBNAME_LEN];
@@ -128,6 +128,8 @@ transcode_dispatch(const char* from_encoding, const char* to_encoding)
memcpy(path, transcoder_lib_prefix, sizeof(transcoder_lib_prefix) - 1);
memcpy(path + sizeof(transcoder_lib_prefix) - 1, lib, len + 1);
if (!rb_require(path)) return NULL;
+ }
+ if (!val) {
if (!st_lookup(transcoder_table, (st_data_t)key, &val)) {
/* multistep logic, via UTF-8 */
if (!encoding_equal(from_encoding, "UTF-8") &&