diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | io.c | 69 | ||||
-rw-r--r-- | version.h | 6 |
3 files changed, 50 insertions, 29 deletions
@@ -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. @@ -2228,42 +2228,59 @@ rb_io_each_byte(VALUE io) return io; } -static VALUE +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; } - 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; - } - 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; - } - } + 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 { - str = rb_str_new(fptr->rbuf+fptr->rbuf_off, 1); - fptr->rbuf_off++; - fptr->rbuf_len--; + 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); + 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; } /* @@ -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[]; |