diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-11 22:21:15 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-11 22:21:15 +0000 |
commit | 5f9b877ebe2d3d53ec44df57aef982c5ae592a7f (patch) | |
tree | f8674ce68cce615d92d4cabcf5f45f68867d31e4 | |
parent | c1361132bcf4dcd21d93bb51c5a61f9535280420 (diff) | |
download | ruby-5f9b877ebe2d3d53ec44df57aef982c5ae592a7f.tar.gz |
* transcode.c (get_replacement_character): extracted from
output_replacement_character.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18502 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | transcode.c | 46 |
2 files changed, 31 insertions, 20 deletions
@@ -1,3 +1,8 @@ +Tue Aug 12 07:19:24 2008 Tanaka Akira <akr@fsij.org> + + * transcode.c (get_replacement_character): extracted from + output_replacement_character. + Tue Aug 12 07:00:02 2008 Tanaka Akira <akr@fsij.org> * transcode_data.h (rb_transcoder): typedef at first. diff --git a/transcode.c b/transcode.c index a733a054ab..9219a98cd6 100644 --- a/transcode.c +++ b/transcode.c @@ -255,10 +255,9 @@ load_transcoder(transcoder_entry_t *entry) return NULL; } -static void -output_replacement_character(unsigned char **out_pp, rb_encoding *enc) +static const char* +get_replacement_character(rb_encoding *enc, int *len_ret) { - unsigned char *out_p = *out_pp; static rb_encoding *utf16be_encoding, *utf16le_encoding; static rb_encoding *utf32be_encoding, *utf32le_encoding; if (!utf16be_encoding) { @@ -268,34 +267,41 @@ output_replacement_character(unsigned char **out_pp, rb_encoding *enc) utf32le_encoding = rb_enc_find("UTF-32LE"); } if (rb_utf8_encoding() == enc) { - *out_p++ = 0xEF; - *out_p++ = 0xBF; - *out_p++ = 0xBD; + *len_ret = 3; + return "\xEF\xBF\xBD"; } else if (utf16be_encoding == enc) { - *out_p++ = 0xFF; - *out_p++ = 0xFD; + *len_ret = 2; + return "\xFF\xFD"; } else if (utf16le_encoding == enc) { - *out_p++ = 0xFD; - *out_p++ = 0xFF; + *len_ret = 2; + return "\xFD\xFF"; } else if (utf32be_encoding == enc) { - *out_p++ = 0x00; - *out_p++ = 0x00; - *out_p++ = 0xFF; - *out_p++ = 0xFD; + *len_ret = 4; + return "\x00\x00\xFF\xFD"; } else if (utf32le_encoding == enc) { - *out_p++ = 0xFD; - *out_p++ = 0xFF; - *out_p++ = 0x00; - *out_p++ = 0x00; + *len_ret = 4; + return "\xFD\xFF\x00\x00"; } else { - *out_p++ = '?'; + *len_ret = 1; + return "?"; } - *out_pp = out_p; +} + +static void +output_replacement_character(unsigned char **out_pp, rb_encoding *enc) +{ + const char *replacement; + int len; + replacement = get_replacement_character(enc, &len); + + memcpy(*out_pp, replacement, len); + + *out_pp += len; return; } |