summaryrefslogtreecommitdiff
path: root/transcode.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-08 15:21:05 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-08 15:21:05 +0000
commit4106a7c067bb6dbadc8055a7e575180479bb08c0 (patch)
tree01061fae6a39333a3202ef76829d73b593f52113 /transcode.c
parent870a8b3903622a42e2d84c95a754c7f23797761b (diff)
* transcode.c (rb_econv_asciicompat_encoding): check decoder.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19253 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'transcode.c')
-rw-r--r--transcode.c48
1 files changed, 27 insertions, 21 deletions
diff --git a/transcode.c b/transcode.c
index a2f804a818..c35a53af9e 100644
--- a/transcode.c
+++ b/transcode.c
@@ -1639,24 +1639,15 @@ static int
asciicompat_encoding_i(st_data_t key, st_data_t val, st_data_t arg)
{
struct asciicompat_encoding_t *data = (struct asciicompat_encoding_t *)arg;
- st_table *table2 = (st_table *)val;
- st_data_t v;
+ transcoder_entry_t *entry = (transcoder_entry_t *)val;
+ const rb_transcoder *tr;
- if (st_lookup(table2, (st_data_t)data->ascii_incompat_name, &v)) {
- transcoder_entry_t *entry = (transcoder_entry_t *)v;
- const rb_transcoder *tr;
- if (SUPPLEMENTAL_CONVERSION(entry->sname, entry->dname))
- return ST_CONTINUE;
- tr = load_transcoder_entry(entry);
- if (tr && tr->asciicompat_type == asciicompat_encoder) {
- /*
- * Assumption:
- * There is only one transcoder for
- * converting to ASCII incompatible encoding.
- */
- data->ascii_compat_name = tr->src_encoding;
- return ST_STOP;
- }
+ if (SUPPLEMENTAL_CONVERSION(entry->sname, entry->dname))
+ return ST_CONTINUE;
+ tr = load_transcoder_entry(entry);
+ if (tr && tr->asciicompat_type == asciicompat_decoder) {
+ data->ascii_compat_name = tr->dst_encoding;
+ return ST_STOP;
}
return ST_CONTINUE;
}
@@ -1664,13 +1655,28 @@ asciicompat_encoding_i(st_data_t key, st_data_t val, st_data_t arg)
const char *
rb_econv_asciicompat_encoding(const char *ascii_incompat_name)
{
+ st_data_t v;
+ st_table *table2;
struct asciicompat_encoding_t data;
+
+ if (!st_lookup(transcoder_table, (st_data_t)ascii_incompat_name, &v))
+ return NULL;
+ table2 = (st_table *)v;
+
+ /*
+ * Assumption:
+ * There are at most one transcoder for
+ * converting from ASCII incompatible encoding.
+ *
+ * For ISO-2022-JP, there is ISO-2022-JP -> stateless-ISO-2022-JP and no others.
+ */
+ if (table2->num_entries != 1)
+ return NULL;
+
data.ascii_incompat_name = ascii_incompat_name;
data.ascii_compat_name = NULL;
- st_foreach(transcoder_table, asciicompat_encoding_i, (st_data_t)&data);
- if (data.ascii_compat_name)
- return data.ascii_compat_name;
- return NULL;
+ st_foreach(table2, asciicompat_encoding_i, (st_data_t)&data);
+ return data.ascii_compat_name;
}
VALUE