* io.c (io_getc): set coderange while getting characters.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15863 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
naruse 2008-03-30 19:16:29 +00:00
parent 70153a6a73
commit 839dc7f9ab
3 changed files with 50 additions and 29 deletions

View File

@ -1,3 +1,7 @@
Mon Mar 31 04:05:15 2008 NARUSE, Yui <naruse@ruby-lang.org>
* io.c (io_getc): set coderange while getting characters.
Sun Mar 30 23:16:49 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
* proc.c (proc_dup): should copy is_lambda attribute as well.

21
io.c
View File

@ -2231,18 +2231,26 @@ rb_io_each_byte(VALUE io)
static VALUE
io_getc(rb_io_t *fptr, rb_encoding *enc)
{
int r, n;
int r, n, cr = 0;
VALUE str;
if (io_fillbuf(fptr) < 0) {
return Qnil;
}
if (rb_enc_asciicompat(enc) && ISASCII(fptr->rbuf[fptr->rbuf_off])) {
str = rb_str_new(fptr->rbuf+fptr->rbuf_off, 1);
fptr->rbuf_off += 1;
fptr->rbuf_len -= 1;
cr = ENC_CODERANGE_7BIT;
}
else {
r = rb_enc_precise_mbclen(fptr->rbuf+fptr->rbuf_off, fptr->rbuf+fptr->rbuf_off+fptr->rbuf_len, enc);
if (MBCLEN_CHARFOUND_P(r) &&
(n = MBCLEN_CHARFOUND_LEN(r)) <= fptr->rbuf_len) {
str = rb_str_new(fptr->rbuf+fptr->rbuf_off, n);
fptr->rbuf_off += n;
fptr->rbuf_len -= n;
cr = ENC_CODERANGE_VALID;
}
else if (MBCLEN_NEEDMORE_P(r)) {
str = rb_str_new(fptr->rbuf+fptr->rbuf_off, fptr->rbuf_len);
@ -2256,6 +2264,9 @@ io_getc(rb_io_t *fptr, rb_encoding *enc)
if (MBCLEN_NEEDMORE_P(r)) {
goto getc_needmore;
}
else if (MBCLEN_CHARFOUND_P(r)) {
cr = ENC_CODERANGE_VALID;
}
}
}
else {
@ -2263,7 +2274,13 @@ io_getc(rb_io_t *fptr, rb_encoding *enc)
fptr->rbuf_off++;
fptr->rbuf_len--;
}
return io_enc_str(str, fptr);
}
if (!cr) cr = ENC_CODERANGE_BROKEN;
str = io_enc_str(str, fptr);
if (!fptr->enc2) {
ENC_CODERANGE_SET(str, cr);
}
return str;
}
/*

View File

@ -1,7 +1,7 @@
#define RUBY_VERSION "1.9.0"
#define RUBY_RELEASE_DATE "2008-03-29"
#define RUBY_RELEASE_DATE "2008-03-31"
#define RUBY_VERSION_CODE 190
#define RUBY_RELEASE_CODE 20080329
#define RUBY_RELEASE_CODE 20080331
#define RUBY_PATCHLEVEL 0
#define RUBY_VERSION_MAJOR 1
@ -9,7 +9,7 @@
#define RUBY_VERSION_TEENY 0
#define RUBY_RELEASE_YEAR 2008
#define RUBY_RELEASE_MONTH 3
#define RUBY_RELEASE_DAY 29
#define RUBY_RELEASE_DAY 31
#ifdef RUBY_EXTERN
RUBY_EXTERN const char ruby_version[];