aboutsummaryrefslogtreecommitdiffstats
path: root/transcode.c
diff options
context:
space:
mode:
Diffstat (limited to 'transcode.c')
-rw-r--r--transcode.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/transcode.c b/transcode.c
index 8c69185414..1a6efc6100 100644
--- a/transcode.c
+++ b/transcode.c
@@ -104,6 +104,7 @@ init_transcoder_table(void)
rb_declare_transcoder("SHIFT_JIS", "UTF-8", "japanese");
rb_declare_transcoder("EUC-JP", "UTF-8", "japanese");
rb_declare_transcoder("ISO-2022-JP", "UTF-8", "japanese");
+ rb_declare_transcoder("UTF-16BE", "UTF-8", "utf_16_32");
}
#define encoding_equal(enc1, enc2) (STRCASECMP(enc1, enc2) == 0)
@@ -153,12 +154,14 @@ transcode_loop(char **in_pos, char **out_pos,
char *in_p = *in_pos, *out_p = *out_pos;
const BYTE_LOOKUP *conv_tree_start = my_transcoder->conv_tree_start;
const BYTE_LOOKUP *next_table;
+ char *char_start;
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) {
+ char_start = in_p;
next_table = conv_tree_start;
if (out_p >= out_s) {
int len = (out_p - *out_pos);
@@ -212,6 +215,16 @@ transcode_loop(char **in_pos, char **out_pos,
case FUNii:
next_info = (VALUE)(*my_transcoder->func_ii)(next_info);
goto follow_info;
+ case FUNsi:
+ next_info = (VALUE)(*my_transcoder->func_si)(char_start);
+ goto follow_info;
+ break;
+ case FUNio:
+ out_p += (VALUE)(*my_transcoder->func_io)(next_info, out_p);
+ break;
+ case FUNso:
+ out_p += (VALUE)(*my_transcoder->func_so)(char_start, out_p);
+ break;
case INVALID:
goto invalid;
case UNDEF: