[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]