ruby-changes:15837
From: usa <ko1@a...>
Date: Thu, 13 May 2010 13:05:36 +0900 (JST)
Subject: [ruby-changes:15837] Ruby:r27771 (ruby_1_9_2): merge from trunk (r27768-r27770)
usa 2010-05-13 13:05:19 +0900 (Thu, 13 May 2010) New Revision: 27771 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=27771 Log: merge from trunk (r27768-r27770) * io.c (swallow): support text mode and UTF-16/32 as internal encoding. [Bug #1576] * io.c (io_shift_cbuf): read and throw it away when str is NULL. Modified files: branches/ruby_1_9_2/ChangeLog branches/ruby_1_9_2/io.c Index: ruby_1_9_2/ChangeLog =================================================================== --- ruby_1_9_2/ChangeLog (revision 27770) +++ ruby_1_9_2/ChangeLog (revision 27771) @@ -1,3 +1,10 @@ +Thu May 13 13:04:46 2010 NAKAMURA Usaku <usa@r...> + + * io.c (swallow): support text mode and UTF-16/32 as internal encoding. + [Bug #1576] + + * io.c (io_shift_cbuf): read and throw it away when str is NULL. + Wed May 12 16:43:12 2010 Nobuyoshi Nakada <nobu@r...> * numeric.c (flo_to_s): fixed broken output including nuls. Index: ruby_1_9_2/io.c =================================================================== --- ruby_1_9_2/io.c (revision 27770) +++ ruby_1_9_2/io.c (revision 27771) @@ -187,6 +187,8 @@ #define READ_DATA_BUFFERED(fptr) READ_DATA_PENDING(fptr) #define READ_CHAR_PENDING(fptr) ((fptr)->cbuf_len) +#define READ_CHAR_PENDING_COUNT(fptr) ((fptr)->cbuf_len) +#define READ_CHAR_PENDING_PTR(fptr) ((fptr)->cbuf+(fptr)->cbuf_off) #if defined(_WIN32) #define WAIT_FD_IN_WIN32(fptr) \ @@ -1713,18 +1715,20 @@ static VALUE io_shift_cbuf(rb_io_t *fptr, int len, VALUE *strp) { - VALUE str; - if (NIL_P(*strp)) { - *strp = str = rb_str_new(fptr->cbuf+fptr->cbuf_off, len); + VALUE str = Qnil; + if (strp) { + str = *strp; + if (NIL_P(str)) { + *strp = str = rb_str_new(fptr->cbuf+fptr->cbuf_off, len); + } + else { + rb_str_cat(str, fptr->cbuf+fptr->cbuf_off, len); + } + OBJ_TAINT(str); + rb_enc_associate(str, fptr->encs.enc); } - else { - str = *strp; - rb_str_cat(str, fptr->cbuf+fptr->cbuf_off, len); - } fptr->cbuf_off += len; fptr->cbuf_len -= len; - OBJ_TAINT(str); - rb_enc_associate(str, fptr->encs.enc); /* xxx: set coderange */ if (fptr->cbuf_len == 0) fptr->cbuf_off = 0; @@ -2289,6 +2293,35 @@ static inline int swallow(rb_io_t *fptr, int term) { + if (NEED_READCONV(fptr)) { + rb_encoding *enc = io_read_encoding(fptr); + int needconv = rb_enc_mbminlen(enc) != 1; + VALUE v; + make_readconv(fptr, 0); + do { + size_t cnt; + while ((cnt = READ_CHAR_PENDING_COUNT(fptr)) > 0) { + const char *p = READ_CHAR_PENDING_PTR(fptr); + int i; + if (needconv) { + if (*p != term) return TRUE; + while (--i && *++p == term); + } + else { + const char *e = p + cnt; + if (rb_enc_ascget(p, e, &i, enc) != term) return TRUE; + while ((p += i) < e && rb_enc_ascget(p, e, &i, enc) == term); + i = (int)(e - p); + } + io_shift_cbuf(fptr, (int)cnt - i, NULL); + } + v = fill_cbuf(fptr, 0); + if (v != MORE_CHAR_SUSPENDED && v != MORE_CHAR_FINISHED) + rb_exc_raise(v); + } while (v == MORE_CHAR_SUSPENDED); + return FALSE; + } + do { size_t cnt; while ((cnt = READ_DATA_PENDING_COUNT(fptr)) > 0) { -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/