* 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> Sun Mar 30 23:16:49 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
* proc.c (proc_dup): should copy is_lambda attribute as well. * proc.c (proc_dup): should copy is_lambda attribute as well.

67
io.c
View File

@ -2231,39 +2231,56 @@ rb_io_each_byte(VALUE io)
static VALUE static VALUE
io_getc(rb_io_t *fptr, rb_encoding *enc) io_getc(rb_io_t *fptr, rb_encoding *enc)
{ {
int r, n; int r, n, cr = 0;
VALUE str; VALUE str;
if (io_fillbuf(fptr) < 0) { if (io_fillbuf(fptr) < 0) {
return Qnil; return Qnil;
} }
r = rb_enc_precise_mbclen(fptr->rbuf+fptr->rbuf_off, fptr->rbuf+fptr->rbuf_off+fptr->rbuf_len, enc); if (rb_enc_asciicompat(enc) && ISASCII(fptr->rbuf[fptr->rbuf_off])) {
if (MBCLEN_CHARFOUND_P(r) && str = rb_str_new(fptr->rbuf+fptr->rbuf_off, 1);
(n = MBCLEN_CHARFOUND_LEN(r)) <= fptr->rbuf_len) { fptr->rbuf_off += 1;
str = rb_str_new(fptr->rbuf+fptr->rbuf_off, n); fptr->rbuf_len -= 1;
fptr->rbuf_off += n; cr = ENC_CODERANGE_7BIT;
fptr->rbuf_len -= n;
}
else if (MBCLEN_NEEDMORE_P(r)) {
str = rb_str_new(fptr->rbuf+fptr->rbuf_off, fptr->rbuf_len);
fptr->rbuf_len = 0;
getc_needmore:
if (io_fillbuf(fptr) != -1) {
rb_str_cat(str, fptr->rbuf+fptr->rbuf_off, 1);
fptr->rbuf_off++;
fptr->rbuf_len--;
r = rb_enc_precise_mbclen(RSTRING_PTR(str), RSTRING_PTR(str)+RSTRING_LEN(str), enc);
if (MBCLEN_NEEDMORE_P(r)) {
goto getc_needmore;
}
}
} }
else { else {
str = rb_str_new(fptr->rbuf+fptr->rbuf_off, 1); r = rb_enc_precise_mbclen(fptr->rbuf+fptr->rbuf_off, fptr->rbuf+fptr->rbuf_off+fptr->rbuf_len, enc);
fptr->rbuf_off++; if (MBCLEN_CHARFOUND_P(r) &&
fptr->rbuf_len--; (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);
fptr->rbuf_len = 0;
getc_needmore:
if (io_fillbuf(fptr) != -1) {
rb_str_cat(str, fptr->rbuf+fptr->rbuf_off, 1);
fptr->rbuf_off++;
fptr->rbuf_len--;
r = rb_enc_precise_mbclen(RSTRING_PTR(str), RSTRING_PTR(str)+RSTRING_LEN(str), enc);
if (MBCLEN_NEEDMORE_P(r)) {
goto getc_needmore;
}
else if (MBCLEN_CHARFOUND_P(r)) {
cr = ENC_CODERANGE_VALID;
}
}
}
else {
str = rb_str_new(fptr->rbuf+fptr->rbuf_off, 1);
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_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_VERSION_CODE 190
#define RUBY_RELEASE_CODE 20080329 #define RUBY_RELEASE_CODE 20080331
#define RUBY_PATCHLEVEL 0 #define RUBY_PATCHLEVEL 0
#define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MAJOR 1
@ -9,7 +9,7 @@
#define RUBY_VERSION_TEENY 0 #define RUBY_VERSION_TEENY 0
#define RUBY_RELEASE_YEAR 2008 #define RUBY_RELEASE_YEAR 2008
#define RUBY_RELEASE_MONTH 3 #define RUBY_RELEASE_MONTH 3
#define RUBY_RELEASE_DAY 29 #define RUBY_RELEASE_DAY 31
#ifdef RUBY_EXTERN #ifdef RUBY_EXTERN
RUBY_EXTERN const char ruby_version[]; RUBY_EXTERN const char ruby_version[];