ruby-changes:7829
From: akr <ko1@a...>
Date: Mon, 15 Sep 2008 03:06:48 +0900 (JST)
Subject: [ruby-changes:7829] Ruby:r19350 (trunk): * transcode_data.h: output function takes output buffer size.
akr 2008-09-15 03:06:20 +0900 (Mon, 15 Sep 2008) New Revision: 19350 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=19350 Log: * 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. Modified files: trunk/ChangeLog trunk/enc/trans/escape.trans trunk/enc/trans/iso2022.trans trunk/enc/trans/japanese.trans trunk/enc/trans/newline.trans trunk/enc/trans/utf_16_32.trans trunk/transcode.c trunk/transcode_data.h Index: ChangeLog =================================================================== --- ChangeLog (revision 19349) +++ ChangeLog (revision 19350) @@ -1,3 +1,19 @@ +Mon Sep 15 03:04:29 2008 Tanaka Akira <akr@f...> + + * 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. + Mon Sep 15 02:37:19 2008 Nobuyoshi Nakada <nobu@r...> * transcode.c (str_encode): returns duplicated string if nothing Index: enc/trans/escape.trans =================================================================== --- enc/trans/escape.trans (revision 19349) +++ enc/trans/escape.trans (revision 19350) @@ -44,7 +44,7 @@ } static int -fun_so_escape_xml_attr_quote(void *statep, const unsigned char *s, size_t l, unsigned char *o) +fun_so_escape_xml_attr_quote(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) { unsigned char *sp = statep; int n = 0; @@ -57,7 +57,7 @@ } static int -escape_xml_attr_quote_finish(void *statep, unsigned char *o) +escape_xml_attr_quote_finish(void *statep, unsigned char *o, size_t osize) { unsigned char *sp = statep; int n = 0; Index: enc/trans/iso2022.trans =================================================================== --- enc/trans/iso2022.trans (revision 19349) +++ enc/trans/iso2022.trans (revision 19350) @@ -71,7 +71,7 @@ } static int -fun_so_iso2022jp_decoder(void *statep, const unsigned char *s, size_t l, unsigned char* o) +fun_so_iso2022jp_decoder(void *statep, const unsigned char *s, size_t l, unsigned char* o, size_t osize) { unsigned char *sp = statep; if (s[0] == 0x1b) { @@ -120,7 +120,7 @@ }; static int -fun_so_iso2022jp_encoder(void *statep, const unsigned char *s, size_t l, unsigned char *o) +fun_so_iso2022jp_encoder(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) { unsigned char *sp = statep; unsigned char *output0 = o; @@ -173,7 +173,7 @@ } static int -finish_iso2022jp_encoder(void *statep, unsigned char *o) +finish_iso2022jp_encoder(void *statep, unsigned char *o, size_t osize) { unsigned char *sp = statep; unsigned char *output0 = o; @@ -204,7 +204,7 @@ }; static int -fun_so_stateless_iso2022jp_to_eucjp(void *statep, const unsigned char *s, size_t l, unsigned char *o) +fun_so_stateless_iso2022jp_to_eucjp(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) { o[0] = s[1]; o[1] = s[2]; @@ -224,7 +224,7 @@ }; static int -fun_so_eucjp_to_stateless_iso2022jp(void *statep, const unsigned char *s, size_t l, unsigned char *o) +fun_so_eucjp_to_stateless_iso2022jp(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) { o[0] = EMACS_MULE_LEADING_CODE_JISX0208_1983; o[1] = s[0]; Index: enc/trans/newline.trans =================================================================== --- enc/trans/newline.trans (revision 19349) +++ enc/trans/newline.trans (revision 19350) @@ -41,7 +41,7 @@ } static int -fun_so_universal_newline(void *statep, const unsigned char *s, size_t l, unsigned char *o) +fun_so_universal_newline(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) { unsigned char *sp = statep; int len; @@ -76,7 +76,7 @@ } static int -universal_newline_finish(void *statep, unsigned char *o) +universal_newline_finish(void *statep, unsigned char *o, size_t osize) { unsigned char *sp = statep; if (STATE == JUST_AFTER_CR) Index: enc/trans/utf_16_32.trans =================================================================== --- enc/trans/utf_16_32.trans (revision 19349) +++ enc/trans/utf_16_32.trans (revision 19350) @@ -38,7 +38,7 @@ <%= transcode_generated_code %> static int -fun_so_from_utf_16be(void *statep, const unsigned char *s, size_t l, unsigned char *o) +fun_so_from_utf_16be(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) { if (!s[0] && s[1]<0x80) { o[0] = s[1]; @@ -66,7 +66,7 @@ } static int -fun_so_to_utf_16be(void *statep, const unsigned char *s, size_t l, unsigned char *o) +fun_so_to_utf_16be(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) { if (!(s[0]&0x80)) { o[0] = 0x00; @@ -94,7 +94,7 @@ } static int -fun_so_from_utf_16le(void *statep, const unsigned char *s, size_t l, unsigned char *o) +fun_so_from_utf_16le(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) { if (!s[1] && s[0]<0x80) { o[0] = s[0]; @@ -122,7 +122,7 @@ } static int -fun_so_to_utf_16le(void *statep, const unsigned char *s, size_t l, unsigned char *o) +fun_so_to_utf_16le(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) { if (!(s[0]&0x80)) { o[1] = 0x00; @@ -150,7 +150,7 @@ } static int -fun_so_from_utf_32be(void *statep, const unsigned char *s, size_t l, unsigned char *o) +fun_so_from_utf_32be(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) { if (!s[1]) { if (s[2]==0 && s[3]<0x80) { @@ -179,7 +179,7 @@ } static int -fun_so_to_utf_32be(void *statep, const unsigned char *s, size_t l, unsigned char *o) +fun_so_to_utf_32be(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) { o[0] = 0; if (!(s[0]&0x80)) { @@ -205,7 +205,7 @@ } static int -fun_so_from_utf_32le(void *statep, const unsigned char *s, size_t l, unsigned char *o) +fun_so_from_utf_32le(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) { if (!s[2]) { if (s[1]==0 && s[0]<0x80) { @@ -234,7 +234,7 @@ } static int -fun_so_to_utf_32le(void *statep, const unsigned char *s, size_t l, unsigned char *o) +fun_so_to_utf_32le(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) { o[3] = 0; if (!(s[0]&0x80)) { Index: enc/trans/japanese.trans =================================================================== --- enc/trans/japanese.trans (revision 19349) +++ enc/trans/japanese.trans (revision 19350) @@ -20,7 +20,7 @@ <%= transcode_generated_code %> static int -fun_so_eucjp2sjis(void *statep, const unsigned char *s, size_t l, unsigned char *o) +fun_so_eucjp2sjis(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) { if (s[0] == 0x8e) { o[0] = s[1]; @@ -41,7 +41,7 @@ } static int -fun_so_sjis2eucjp(void *statep, const unsigned char *s, size_t l, unsigned char *o) +fun_so_sjis2eucjp(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) { if (l == 1) { o[0] = '\x8e'; Index: transcode_data.h =================================================================== --- transcode_data.h (revision 19349) +++ transcode_data.h (revision 19350) @@ -84,11 +84,11 @@ int (*state_fini_func)(void*); /* ret==0:success ret!=0:failure(errno) */ VALUE (*func_ii)(void*, VALUE); /* info -> info */ VALUE (*func_si)(void*, const unsigned char*, size_t); /* start -> info */ - int (*func_io)(void*, VALUE, const unsigned char*); /* info -> output */ - int (*func_so)(void*, const unsigned char*, size_t, unsigned char*); /* start -> output */ - int (*finish_func)(void*, unsigned char*); /* -> output */ + int (*func_io)(void*, VALUE, const unsigned char*, size_t); /* info -> output */ + int (*func_so)(void*, const unsigned char*, size_t, unsigned char*, size_t); /* start -> output */ + int (*finish_func)(void*, unsigned char*, size_t); /* -> output */ int (*resetsize_func)(void*); /* -> len */ - int (*resetstate_func)(void*, unsigned char*); /* -> output */ + int (*resetstate_func)(void*, unsigned char*, size_t); /* -> output */ }; void rb_declare_transcoder(const char *enc1, const char *enc2, const char *lib); Index: transcode.c =================================================================== --- transcode.c (revision 19349) +++ transcode.c (revision 19350) @@ -80,6 +80,10 @@ ((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 @@ 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 @@ 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 @@ 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); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/