* include/ruby/encoding.h (rb_econv_option_t): defined.
(rb_econv_open): 3rd arg changed. (rb_econv_open_exc): ditto. * io.c (make_writeconv): use rb_econv_option_t. (make_readconv): ditto. (rb_econv_open): take rb_econv_option_t for options. (rb_econv_open_exc): ditto. (transcode_loop): use rb_econv_option_t. (econv_init): use rb_econv_option_t. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18810 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
b47c46106a
commit
9b8adfed22
13
ChangeLog
13
ChangeLog
@ -1,3 +1,16 @@
|
|||||||
|
Sun Aug 24 16:06:30 2008 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* include/ruby/encoding.h (rb_econv_option_t): defined.
|
||||||
|
(rb_econv_open): 3rd arg changed.
|
||||||
|
(rb_econv_open_exc): ditto.
|
||||||
|
|
||||||
|
* io.c (make_writeconv): use rb_econv_option_t.
|
||||||
|
(make_readconv): ditto.
|
||||||
|
(rb_econv_open): take rb_econv_option_t for options.
|
||||||
|
(rb_econv_open_exc): ditto.
|
||||||
|
(transcode_loop): use rb_econv_option_t.
|
||||||
|
(econv_init): use rb_econv_option_t.
|
||||||
|
|
||||||
Sun Aug 24 15:43:41 2008 Tanaka Akira <akr@fsij.org>
|
Sun Aug 24 15:43:41 2008 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* transcode.c (rb_econv_substr_append): associate dst with destination
|
* transcode.c (rb_econv_substr_append): associate dst with destination
|
||||||
|
@ -249,14 +249,18 @@ typedef struct {
|
|||||||
rb_encoding *destination_encoding;
|
rb_encoding *destination_encoding;
|
||||||
} rb_econv_t;
|
} rb_econv_t;
|
||||||
|
|
||||||
rb_econv_t *rb_econv_open(const char *source_encoding, const char *destination_encoding, int flags);
|
typedef struct {
|
||||||
|
int flags;
|
||||||
|
} rb_econv_option_t;
|
||||||
|
|
||||||
|
rb_econv_t *rb_econv_open(const char *source_encoding, const char *destination_encoding, rb_econv_option_t *opts);
|
||||||
rb_econv_result_t rb_econv_convert(rb_econv_t *ec,
|
rb_econv_result_t rb_econv_convert(rb_econv_t *ec,
|
||||||
const unsigned char **source_buffer_ptr, const unsigned char *source_buffer_end,
|
const unsigned char **source_buffer_ptr, const unsigned char *source_buffer_end,
|
||||||
unsigned char **destination_buffer_ptr, unsigned char *destination_buffer_end,
|
unsigned char **destination_buffer_ptr, unsigned char *destination_buffer_end,
|
||||||
int flags);
|
int flags);
|
||||||
void rb_econv_close(rb_econv_t *ec);
|
void rb_econv_close(rb_econv_t *ec);
|
||||||
|
|
||||||
VALUE rb_econv_open_exc(const char *senc, const char *denc, int flags);
|
VALUE rb_econv_open_exc(const char *senc, const char *denc, rb_econv_option_t *opts);
|
||||||
|
|
||||||
/* result: 0:success -1:failure */
|
/* result: 0:success -1:failure */
|
||||||
int rb_econv_insert_output(rb_econv_t *ec,
|
int rb_econv_insert_output(rb_econv_t *ec,
|
||||||
|
31
io.c
31
io.c
@ -694,25 +694,25 @@ make_writeconv(rb_io_t *fptr)
|
|||||||
if (!fptr->writeconv_initialized) {
|
if (!fptr->writeconv_initialized) {
|
||||||
const char *senc, *denc;
|
const char *senc, *denc;
|
||||||
rb_encoding *enc;
|
rb_encoding *enc;
|
||||||
int ecflags;
|
rb_econv_option_t ecopts;
|
||||||
|
|
||||||
fptr->writeconv_initialized = 1;
|
fptr->writeconv_initialized = 1;
|
||||||
|
|
||||||
ecflags = 0;
|
ecopts.flags = 0;
|
||||||
|
|
||||||
if (fptr->mode & FMODE_INVALID_MASK)
|
if (fptr->mode & FMODE_INVALID_MASK)
|
||||||
ecflags |= (fptr->mode / (FMODE_INVALID_MASK/ECONV_INVALID_MASK)) & ECONV_INVALID_MASK;
|
ecopts.flags |= (fptr->mode / (FMODE_INVALID_MASK/ECONV_INVALID_MASK)) & ECONV_INVALID_MASK;
|
||||||
if (fptr->mode & FMODE_UNDEF_MASK)
|
if (fptr->mode & FMODE_UNDEF_MASK)
|
||||||
ecflags |= (fptr->mode / (FMODE_UNDEF_MASK/ECONV_UNDEF_MASK)) & ECONV_UNDEF_MASK;
|
ecopts.flags |= (fptr->mode / (FMODE_UNDEF_MASK/ECONV_UNDEF_MASK)) & ECONV_UNDEF_MASK;
|
||||||
|
|
||||||
#ifdef TEXTMODE_NEWLINE_ENCODER
|
#ifdef TEXTMODE_NEWLINE_ENCODER
|
||||||
if (NEED_NEWLINE_ENCODER(fptr))
|
if (NEED_NEWLINE_ENCODER(fptr))
|
||||||
ecflags |= TEXTMODE_NEWLINE_ENCODER;
|
ecopts.flags |= TEXTMODE_NEWLINE_ENCODER;
|
||||||
|
|
||||||
if (!fptr->enc) {
|
if (!fptr->enc) {
|
||||||
fptr->writeconv = rb_econv_open("", "", ecflags);
|
fptr->writeconv = rb_econv_open("", "", &ecopts);
|
||||||
if (!fptr->writeconv)
|
if (!fptr->writeconv)
|
||||||
rb_exc_raise(rb_econv_open_exc("", "", ecflags));
|
rb_exc_raise(rb_econv_open_exc("", "", &ecopts));
|
||||||
fptr->writeconv_stateless = Qnil;
|
fptr->writeconv_stateless = Qnil;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -729,9 +729,9 @@ make_writeconv(rb_io_t *fptr)
|
|||||||
fptr->writeconv_stateless = Qnil;
|
fptr->writeconv_stateless = Qnil;
|
||||||
}
|
}
|
||||||
if (senc) {
|
if (senc) {
|
||||||
fptr->writeconv = rb_econv_open(senc, denc, ecflags);
|
fptr->writeconv = rb_econv_open(senc, denc, &ecopts);
|
||||||
if (!fptr->writeconv)
|
if (!fptr->writeconv)
|
||||||
rb_exc_raise(rb_econv_open_exc(senc, denc, ecflags));
|
rb_exc_raise(rb_econv_open_exc(senc, denc, &ecopts));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fptr->writeconv = NULL;
|
fptr->writeconv = NULL;
|
||||||
@ -1451,14 +1451,15 @@ static void
|
|||||||
make_readconv(rb_io_t *fptr)
|
make_readconv(rb_io_t *fptr)
|
||||||
{
|
{
|
||||||
if (!fptr->readconv) {
|
if (!fptr->readconv) {
|
||||||
int ecflags = 0;
|
rb_econv_option_t ecopts;
|
||||||
const char *sname, *dname;
|
const char *sname, *dname;
|
||||||
|
ecopts.flags = 0;
|
||||||
if (NEED_NEWLINE_DECODER(fptr))
|
if (NEED_NEWLINE_DECODER(fptr))
|
||||||
ecflags |= ECONV_UNIVERSAL_NEWLINE_DECODER;
|
ecopts.flags |= ECONV_UNIVERSAL_NEWLINE_DECODER;
|
||||||
if (fptr->mode & FMODE_INVALID_MASK)
|
if (fptr->mode & FMODE_INVALID_MASK)
|
||||||
ecflags |= (fptr->mode / (FMODE_INVALID_MASK/ECONV_INVALID_MASK)) & ECONV_INVALID_MASK;
|
ecopts.flags |= (fptr->mode / (FMODE_INVALID_MASK/ECONV_INVALID_MASK)) & ECONV_INVALID_MASK;
|
||||||
if (fptr->mode & FMODE_UNDEF_MASK)
|
if (fptr->mode & FMODE_UNDEF_MASK)
|
||||||
ecflags |= (fptr->mode / (FMODE_UNDEF_MASK/ECONV_UNDEF_MASK)) & ECONV_UNDEF_MASK;
|
ecopts.flags |= (fptr->mode / (FMODE_UNDEF_MASK/ECONV_UNDEF_MASK)) & ECONV_UNDEF_MASK;
|
||||||
if (fptr->enc2) {
|
if (fptr->enc2) {
|
||||||
sname = fptr->enc2->name;
|
sname = fptr->enc2->name;
|
||||||
dname = fptr->enc->name;
|
dname = fptr->enc->name;
|
||||||
@ -1466,9 +1467,9 @@ make_readconv(rb_io_t *fptr)
|
|||||||
else {
|
else {
|
||||||
sname = dname = "";
|
sname = dname = "";
|
||||||
}
|
}
|
||||||
fptr->readconv = rb_econv_open(sname, dname, ecflags);
|
fptr->readconv = rb_econv_open(sname, dname, &ecopts);
|
||||||
if (!fptr->readconv)
|
if (!fptr->readconv)
|
||||||
rb_exc_raise(rb_econv_open_exc(sname, dname, ecflags));
|
rb_exc_raise(rb_econv_open_exc(sname, dname, &ecopts));
|
||||||
fptr->crbuf_off = 0;
|
fptr->crbuf_off = 0;
|
||||||
fptr->crbuf_len = 0;
|
fptr->crbuf_len = 0;
|
||||||
fptr->crbuf_capa = 1024;
|
fptr->crbuf_capa = 1024;
|
||||||
|
33
transcode.c
33
transcode.c
@ -733,11 +733,12 @@ trans_open_i(const char *from, const char *to, int depth, void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
rb_econv_t *
|
rb_econv_t *
|
||||||
rb_econv_open(const char *from, const char *to, int flags)
|
rb_econv_open(const char *from, const char *to, rb_econv_option_t *opts)
|
||||||
{
|
{
|
||||||
transcoder_entry_t **entries = NULL;
|
transcoder_entry_t **entries = NULL;
|
||||||
int num_trans;
|
int num_trans;
|
||||||
static rb_econv_t *ec;
|
static rb_econv_t *ec;
|
||||||
|
int flags = opts ? opts->flags : 0;
|
||||||
|
|
||||||
if (*from == '\0' && *to == '\0') {
|
if (*from == '\0' && *to == '\0') {
|
||||||
num_trans = 0;
|
num_trans = 0;
|
||||||
@ -1123,7 +1124,7 @@ allocate_converted_string(const char *str_encoding, const char *insert_encoding,
|
|||||||
if (dst_bufsize == 0)
|
if (dst_bufsize == 0)
|
||||||
dst_bufsize += 1;
|
dst_bufsize += 1;
|
||||||
|
|
||||||
ec = rb_econv_open(str_encoding, insert_encoding, 0);
|
ec = rb_econv_open(str_encoding, insert_encoding, NULL);
|
||||||
if (ec == NULL)
|
if (ec == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
dst_str = xmalloc(dst_bufsize);
|
dst_str = xmalloc(dst_bufsize);
|
||||||
@ -1410,8 +1411,9 @@ rb_econv_binmode(rb_econv_t *ec)
|
|||||||
}
|
}
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
rb_econv_open_exc(const char *senc, const char *denc, int flags)
|
rb_econv_open_exc(const char *senc, const char *denc, rb_econv_option_t *opts)
|
||||||
{
|
{
|
||||||
|
int flags = opts ? opts->flags : 0;
|
||||||
VALUE mesg, exc;
|
VALUE mesg, exc;
|
||||||
int noenc = 0;
|
int noenc = 0;
|
||||||
mesg = rb_str_new_cstr("code converter open failed (");
|
mesg = rb_str_new_cstr("code converter open failed (");
|
||||||
@ -1553,12 +1555,12 @@ transcode_loop(const unsigned char **in_pos, unsigned char **out_pos,
|
|||||||
unsigned char *out_start = *out_pos;
|
unsigned char *out_start = *out_pos;
|
||||||
int max_output;
|
int max_output;
|
||||||
VALUE exc;
|
VALUE exc;
|
||||||
int ecflags;
|
rb_econv_option_t ecopts;
|
||||||
|
|
||||||
ecflags = opt & (ECONV_INVALID_MASK|ECONV_UNDEF_MASK);
|
ecopts.flags = opt & (ECONV_INVALID_MASK|ECONV_UNDEF_MASK);
|
||||||
ec = rb_econv_open(from_encoding, to_encoding, ecflags);
|
ec = rb_econv_open(from_encoding, to_encoding, &ecopts);
|
||||||
if (!ec)
|
if (!ec)
|
||||||
rb_exc_raise(rb_econv_open_exc(from_encoding, to_encoding, ecflags));
|
rb_exc_raise(rb_econv_open_exc(from_encoding, to_encoding, &ecopts));
|
||||||
|
|
||||||
last_tc = ec->last_tc;
|
last_tc = ec->last_tc;
|
||||||
max_output = last_tc ? last_tc->transcoder->max_output : 1;
|
max_output = last_tc ? last_tc->transcoder->max_output : 1;
|
||||||
@ -1604,11 +1606,12 @@ transcode_loop(const unsigned char **in_pos, unsigned char **out_pos,
|
|||||||
int max_output;
|
int max_output;
|
||||||
VALUE exc;
|
VALUE exc;
|
||||||
int ecflags;
|
int ecflags;
|
||||||
|
rb_econv_option_t ecopts;
|
||||||
|
|
||||||
ecflags = opt & (ECONV_INVALID_MASK|ECONV_UNDEF_MASK);
|
ecopts.flags = opt & (ECONV_INVALID_MASK|ECONV_UNDEF_MASK);
|
||||||
ec = rb_econv_open(from_encoding, to_encoding, ecflags);
|
ec = rb_econv_open(from_encoding, to_encoding, &ecopts);
|
||||||
if (!ec)
|
if (!ec)
|
||||||
rb_exc_raise(rb_econv_open_exc(from_encoding, to_encoding, ecflags));
|
rb_exc_raise(rb_econv_open_exc(from_encoding, to_encoding, &ecopts));
|
||||||
|
|
||||||
last_tc = ec->last_tc;
|
last_tc = ec->last_tc;
|
||||||
max_output = last_tc ? last_tc->transcoder->max_output : 1;
|
max_output = last_tc ? last_tc->transcoder->max_output : 1;
|
||||||
@ -1955,14 +1958,14 @@ econv_init(int argc, VALUE *argv, VALUE self)
|
|||||||
const char *sname, *dname;
|
const char *sname, *dname;
|
||||||
rb_encoding *senc, *denc;
|
rb_encoding *senc, *denc;
|
||||||
rb_econv_t *ec;
|
rb_econv_t *ec;
|
||||||
int flags;
|
rb_econv_option_t ecopts;
|
||||||
|
|
||||||
rb_scan_args(argc, argv, "21", &source_encoding, &destination_encoding, &flags_v);
|
rb_scan_args(argc, argv, "21", &source_encoding, &destination_encoding, &flags_v);
|
||||||
|
|
||||||
if (flags_v == Qnil)
|
if (flags_v == Qnil)
|
||||||
flags = 0;
|
ecopts.flags = 0;
|
||||||
else
|
else
|
||||||
flags = NUM2INT(flags_v);
|
ecopts.flags = NUM2INT(flags_v);
|
||||||
|
|
||||||
senc = NULL;
|
senc = NULL;
|
||||||
sidx = rb_to_encoding_index(source_encoding);
|
sidx = rb_to_encoding_index(source_encoding);
|
||||||
@ -1989,9 +1992,9 @@ econv_init(int argc, VALUE *argv, VALUE self)
|
|||||||
rb_raise(rb_eTypeError, "already initialized");
|
rb_raise(rb_eTypeError, "already initialized");
|
||||||
}
|
}
|
||||||
|
|
||||||
ec = rb_econv_open(sname, dname, flags);
|
ec = rb_econv_open(sname, dname, &ecopts);
|
||||||
if (!ec) {
|
if (!ec) {
|
||||||
rb_exc_raise(rb_econv_open_exc(sname, dname, flags));
|
rb_exc_raise(rb_econv_open_exc(sname, dname, &ecopts));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*sname && *dname) { /* check "" to "universal_newline" */
|
if (*sname && *dname) { /* check "" to "universal_newline" */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user