summaryrefslogtreecommitdiffstats
path: root/transcode.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-14 18:06:20 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-14 18:06:20 +0000
commite152d5fda7feced57516fe39156807ee07fcf09d (patch)
tree15cabf6537a110ed2c3bd6f4f3ee296e4516344c /transcode.c
parent030d9e240c8cc42d170d0290bb3a478072b9f6b5 (diff)
downloadruby-e152d5fda7feced57516fe39156807ee07fcf09d.tar.gz
ruby-e152d5fda7feced57516fe39156807ee07fcf09d.tar.xz
ruby-e152d5fda7feced57516fe39156807ee07fcf09d.zip
* transcode_data.h: output function takes output buffer size.
* transcode.c: give output buffer size for output functions. * enc/trans/newline.trans: follow the type change. * enc/trans/escape.trans: ditto. * enc/trans/utf_16_32.trans: ditto. * enc/trans/iso2022.trans: ditto. * enc/trans/japanese.trans: ditto. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@19350 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'transcode.c')
-rw-r--r--transcode.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/transcode.c b/transcode.c
index 1c1126fcc..5f21614c0 100644
--- a/transcode.c
+++ b/transcode.c
@@ -80,6 +80,10 @@ typedef struct rb_transcoding {
((tc)->transcoder->max_output <= sizeof((tc)->writebuf.ary) ? \
(tc)->writebuf.ary : \
(tc)->writebuf.ptr)
+#define TRANSCODING_WRITEBUF_SIZE(tc) \
+ ((tc)->transcoder->max_output <= sizeof((tc)->writebuf.ary) ? \
+ sizeof((tc)->writebuf.ary) : \
+ (tc)->transcoder->max_output)
#define TRANSCODING_STATE_EMBED_MAX sizeof(union rb_transcoding_state_t)
#define TRANSCODING_STATE(tc) \
((tc)->transcoder->state_size <= sizeof((tc)->state) ? \
@@ -600,9 +604,13 @@ transcode_restartable0(const unsigned char **in_pos, unsigned char **out_pos,
case FUNio:
SUSPEND_OBUF(13);
if (tr->max_output <= out_stop - out_p)
- out_p += (VALUE)(*tr->func_io)(TRANSCODING_STATE(tc), next_info, out_p);
+ out_p += (VALUE)(*tr->func_io)(TRANSCODING_STATE(tc),
+ next_info,
+ out_p, out_stop - out_p);
else {
- writebuf_len = (VALUE)(*tr->func_io)(TRANSCODING_STATE(tc), next_info, TRANSCODING_WRITEBUF(tc));
+ writebuf_len = (VALUE)(*tr->func_io)(TRANSCODING_STATE(tc),
+ next_info,
+ TRANSCODING_WRITEBUF(tc), TRANSCODING_WRITEBUF_SIZE(tc));
writebuf_off = 0;
while (writebuf_off < writebuf_len) {
SUSPEND_OBUF(20);
@@ -617,11 +625,15 @@ transcode_restartable0(const unsigned char **in_pos, unsigned char **out_pos,
SUSPEND_OBUF(14);
if (tr->max_output <= out_stop - out_p) {
char_start = transcode_char_start(tc, *in_pos, inchar_start, in_p, &char_len);
- out_p += (VALUE)(*tr->func_so)(TRANSCODING_STATE(tc), char_start, (size_t)char_len, out_p);
+ out_p += (VALUE)(*tr->func_so)(TRANSCODING_STATE(tc),
+ char_start, (size_t)char_len,
+ out_p, out_stop - out_p);
}
else {
char_start = transcode_char_start(tc, *in_pos, inchar_start, in_p, &char_len);
- writebuf_len = (VALUE)(*tr->func_so)(TRANSCODING_STATE(tc), char_start, (size_t)char_len, TRANSCODING_WRITEBUF(tc));
+ writebuf_len = (VALUE)(*tr->func_so)(TRANSCODING_STATE(tc),
+ char_start, (size_t)char_len,
+ TRANSCODING_WRITEBUF(tc), TRANSCODING_WRITEBUF_SIZE(tc));
writebuf_off = 0;
while (writebuf_off < writebuf_len) {
SUSPEND_OBUF(22);
@@ -675,10 +687,12 @@ transcode_restartable0(const unsigned char **in_pos, unsigned char **out_pos,
if (tr->finish_func) {
SUSPEND_OBUF(4);
if (tr->max_output <= out_stop - out_p) {
- out_p += tr->finish_func(TRANSCODING_STATE(tc), out_p);
+ out_p += tr->finish_func(TRANSCODING_STATE(tc),
+ out_p, out_stop - out_p);
}
else {
- writebuf_len = tr->finish_func(TRANSCODING_STATE(tc), TRANSCODING_WRITEBUF(tc));
+ writebuf_len = tr->finish_func(TRANSCODING_STATE(tc),
+ TRANSCODING_WRITEBUF(tc), TRANSCODING_WRITEBUF_SIZE(tc));
writebuf_off = 0;
while (writebuf_off < writebuf_len) {
SUSPEND_OBUF(23);