summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-23 18:01:16 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-23 18:01:16 +0000
commit7ea8ec5483f4a79e411b9813fc6347040bb4c55d (patch)
tree611ed08788531e52bfe68961e66226d727343b03 /io.c
parent5f9748deb7b934d3ba150ea3184cb1006a7dc9fd (diff)
* io.c (rb_io_check_readable): should not fill fptr->enc always.
read-write IO (e.g. socket) does not work. [ruby-dev:32685] * io.c (io_read_encoding): retrieve reading encoding. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14543 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/io.c b/io.c
index c6b5ed9a36..e5edbf1f94 100644
--- a/io.c
+++ b/io.c
@@ -347,11 +347,20 @@ rb_io_check_readable(rb_io_t *fptr)
if (fptr->wbuf_len) {
io_fflush(fptr);
}
- if (!fptr->enc) {
- fptr->enc = (fptr->mode & FMODE_BINMODE)
- ? rb_ascii8bit_encoding()
- : rb_default_external_encoding();
+ if (!fptr->enc && fptr->fd == 0) {
+ fptr->enc = rb_default_external_encoding();
+ }
+}
+
+static rb_encoding*
+io_read_encoding(rb_io_t *fptr)
+{
+ if (fptr->enc) {
+ return fptr->enc;
}
+ return (fptr->mode & FMODE_BINMODE)
+ ? rb_ascii8bit_encoding()
+ : rb_default_external_encoding();
}
void
@@ -1307,7 +1316,7 @@ io_enc_str(VALUE str, rb_io_t *fptr)
rb_enc_from_encoding(fptr->enc),
rb_enc_from_encoding(fptr->enc2));
}
- else {
+ else if (fptr->enc) {
/* just one encoding, so associate it with the string */
rb_enc_associate(str, fptr->enc);
}
@@ -1800,7 +1809,7 @@ rb_io_getline_1(VALUE rs, long limit, VALUE io)
if (RSTRING_LEN(str) == 0) return Qnil;
}
else if (limit == 0) {
- return rb_enc_str_new(0, 0, fptr->enc);
+ return rb_enc_str_new(0, 0, io_read_encoding(fptr));
}
else if (rs == rb_default_rs) {
return rb_io_getline_fast(fptr, '\n', limit);
@@ -2175,7 +2184,7 @@ rb_io_getc(VALUE io)
GetOpenFile(io, fptr);
rb_io_check_readable(fptr);
- enc = fptr->enc;
+ enc = io_read_encoding(fptr);
READ_CHECK(fptr);
if (io_fillbuf(fptr) < 0) {
return Qnil;
@@ -2327,7 +2336,7 @@ rb_io_ungetc(VALUE io, VALUE c)
GetOpenFile(io, fptr);
rb_io_check_readable(fptr);
if (NIL_P(c)) return Qnil;
- enc = fptr->enc;
+ enc = io_read_encoding(fptr);
if (FIXNUM_P(c)) {
int cc = FIX2INT(c);
char buf[16];
@@ -5854,7 +5863,7 @@ rb_io_external_encoding(VALUE io)
if (!fptr->enc && fptr->fd == 0) {
fptr->enc = rb_default_external_encoding();
}
- return rb_enc_from_encoding(fptr->enc);
+ return rb_enc_from_encoding(io_read_encoding(fptr));
}
/*
@@ -5872,7 +5881,7 @@ rb_io_internal_encoding(VALUE io)
GetOpenFile(io, fptr);
if (!fptr->enc2) return Qnil;
- return rb_enc_from_encoding(fptr->enc);
+ return rb_enc_from_encoding(io_read_encoding(fptr));
}
static VALUE