ruby-changes:4127
From: ko1@a...
Date: Thu, 28 Feb 2008 00:19:48 +0900 (JST)
Subject: [ruby-changes:4127] naruse - Ruby:r15617 (trunk): * string.c (rb_str_coderange_scan_restartable): coderange scaning
naruse 2008-02-28 00:19:22 +0900 (Thu, 28 Feb 2008) New Revision: 15617 Modified files: trunk/ChangeLog trunk/io.c trunk/string.c trunk/version.h Log: * string.c (rb_str_coderange_scan_restartable): coderange scaning for partial read. * io.c (read_all): set coderange when not convert encoding. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/version.h?r1=15617&r2=15616&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/string.c?r1=15617&r2=15616&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15617&r2=15616&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=15617&r2=15616&diff_format=u Index: ChangeLog =================================================================== --- ChangeLog (revision 15616) +++ ChangeLog (revision 15617) @@ -1,3 +1,10 @@ +Wed Feb 27 22:55:42 2008 NARUSE, Yui <naruse@r...> + + * string.c (rb_str_coderange_scan_restartable): coderange scaning + for partial read. + + * io.c (read_all): set coderange when not convert encoding. + Wed Feb 27 03:55:58 2008 Nobuyoshi Nakada <nobu@r...> * ext/extmk.rb, enc/make_encmake.rb: load current mkmf.rb even if Index: string.c =================================================================== --- string.c (revision 15616) +++ string.c (revision 15617) @@ -201,6 +201,61 @@ return ENC_CODERANGE_VALID; } +long +rb_str_coderange_scan_restartable(const char *s, const char *e, rb_encoding *enc, int *cr) +{ + long c; + const char *p; + int ret; + p = s; + + if (*cr == ENC_CODERANGE_BROKEN) + return e - s; + + if (rb_enc_to_index(enc) == 0) { + /* enc is ASCII-8BIT. ASCII-8BIT string never be broken. */ + p = search_nonascii(p, e); + *cr = (!p && *cr != ENC_CODERANGE_VALID) ? ENC_CODERANGE_7BIT : ENC_CODERANGE_VALID; + return e - s; + } + else if (rb_enc_asciicompat(enc)) { + p = search_nonascii(p, e); + if (!p) { + if (*cr != ENC_CODERANGE_VALID) *cr = ENC_CODERANGE_7BIT; + return e - s; + } + while (p < e) { + int ret = rb_enc_precise_mbclen(p, e, enc); + if (!MBCLEN_CHARFOUND_P(ret)) { + *cr = MBCLEN_INVALID_P(ret) ? ENC_CODERANGE_BROKEN: ret; + return e - s; + } + p += MBCLEN_CHARFOUND_LEN(ret); + if (p < e) { + p = search_nonascii(p, e); + if (!p) { + *cr = ENC_CODERANGE_VALID; + return e - s; + } + } + } + *cr = e < p ? ENC_CODERANGE_BROKEN: ENC_CODERANGE_VALID; + return p - s; + } + else { + while (p < e) { + int ret = rb_enc_precise_mbclen(p, e, enc); + if (!MBCLEN_CHARFOUND_P(ret)) { + *cr = MBCLEN_INVALID_P(ret) ? ENC_CODERANGE_BROKEN: ret; + return p - s; + } + p += MBCLEN_CHARFOUND_LEN(ret); + } + *cr = e < p ? ENC_CODERANGE_BROKEN: ENC_CODERANGE_VALID; + return p - s; + } +} + static void rb_enc_str_copy(VALUE dest, VALUE src) { Index: io.c =================================================================== --- io.c (revision 15616) +++ io.c (revision 15617) @@ -1358,6 +1358,9 @@ { long bytes = 0; long n; + long pos = 0; + rb_encoding *enc = io_read_encoding(fptr); + int cr = 0; if (siz == 0) siz = BUFSIZ; if (NIL_P(str)) { @@ -1370,15 +1373,21 @@ READ_CHECK(fptr); n = io_fread(str, bytes, fptr); if (n == 0 && bytes == 0) { - break; + break; } bytes += n; + if (cr != ENC_CODERANGE_BROKEN) + pos = rb_str_coderange_scan_restartable(RSTRING_PTR(str) + pos, RSTRING_PTR(str) + bytes, enc, &cr); if (bytes < siz) break; siz += BUFSIZ; rb_str_resize(str, siz); } if (bytes != siz) rb_str_resize(str, bytes); - return io_enc_str(str, fptr); + str = io_enc_str(str, fptr); + if (fptr->enc2) { + ENC_CODERANGE_SET(str, cr); + } + return str; } void Index: version.h =================================================================== --- version.h (revision 15616) +++ version.h (revision 15617) @@ -1,7 +1,7 @@ #define RUBY_VERSION "1.9.0" -#define RUBY_RELEASE_DATE "2008-02-27" +#define RUBY_RELEASE_DATE "2008-02-28" #define RUBY_VERSION_CODE 190 -#define RUBY_RELEASE_CODE 20080227 +#define RUBY_RELEASE_CODE 20080228 #define RUBY_PATCHLEVEL 0 #define RUBY_VERSION_MAJOR 1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/