summaryrefslogtreecommitdiff
path: root/transcode.c
diff options
context:
space:
mode:
authorduerst <duerst@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-12-10 11:59:12 +0000
committerduerst <duerst@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-12-10 11:59:12 +0000
commitb32ee85f97597e1cb13b568dff15ee9a6d9de1ba (patch)
treebb0c830ce49f40e08b3a0ecd08efaadf7490eebf /transcode.c
parent136c25ebf035c62933c248b5f833463466021541 (diff)
* 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
Diffstat (limited to 'transcode.c')
-rw-r--r--transcode.c26
1 files changed, 26 insertions, 0 deletions
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)