From b32ee85f97597e1cb13b568dff15ee9a6d9de1ba Mon Sep 17 00:00:00 2001 From: duerst Date: Thu, 10 Dec 2009 11:59:12 +0000 Subject: * transcode_data.h, transcode.c, tool/transcode-tblgen.rb: Added support for new transcoding instruction FUNsio (with Tatsuya Mizuno) * enc/trans/gb18030.trans: Significantly reduced GB18030 conversion table footprint using FUNsio and differences (with Tatsuya Mizuno) * test/ruby/test_transcode.rb: Minor name fix (from Tatsuya Mizuno) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26065 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- transcode.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'transcode.c') diff --git a/transcode.c b/transcode.c index b45d2397ab..d511547916 100644 --- a/transcode.c +++ b/transcode.c @@ -505,6 +505,8 @@ transcode_restartable0(const unsigned char **in_pos, unsigned char **out_pos, case 30: goto resume_label30; case 31: goto resume_label31; case 32: goto resume_label32; + case 33: goto resume_label33; + case 34: goto resume_label34; } while (1) { @@ -649,6 +651,30 @@ transcode_restartable0(const unsigned char **in_pos, unsigned char **out_pos, } break; } + case FUNsio: + { + const unsigned char *char_start; + size_t char_len; + SUSPEND_OBUF(33); + if (tr->max_output <= out_stop - out_p) { + char_start = transcode_char_start(tc, *in_pos, inchar_start, in_p, &char_len); + out_p += tr->func_sio(TRANSCODING_STATE(tc), + char_start, (size_t)char_len, next_info, + out_p, out_stop - out_p); + } + else { + char_start = transcode_char_start(tc, *in_pos, inchar_start, in_p, &char_len); + writebuf_len = tr->func_sio(TRANSCODING_STATE(tc), + char_start, (size_t)char_len, next_info, + TRANSCODING_WRITEBUF(tc), TRANSCODING_WRITEBUF_SIZE(tc)); + writebuf_off = 0; + while (writebuf_off < writebuf_len) { + SUSPEND_OBUF(34); + *out_p++ = TRANSCODING_WRITEBUF(tc)[writebuf_off++]; + } + } + break; + } case INVALID: if (tc->recognized_len + (in_p - inchar_start) <= unitlen) { if (tc->recognized_len + (in_p - inchar_start) < unitlen) -- cgit v1.2.3