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

ruby-changes:18257

From: tarui <ko1@a...>
Date: Tue, 21 Dec 2010 01:45:36 +0900 (JST)
Subject: [ruby-changes:18257] Ruby:r30280 (trunk): * io.c : add an extra byte to buffer for the specification of read

tarui	2010-12-21 01:45:08 +0900 (Tue, 21 Dec 2010)

  New Revision: 30280

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=30280

  Log:
    * io.c : add an extra byte to buffer for the specification of read
      in Windows. see [ruby-core:33460] and r29980. and, we have to
      discuss how to do this one byte.

  Modified files:
    trunk/ChangeLog
    trunk/io.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 30279)
+++ ChangeLog	(revision 30280)
@@ -1,3 +1,9 @@
+Tue Dec 21 01:41:42 2010  Masaya Tarui  <tarui@r...>
+
+	* io.c : add an extra byte to buffer for the specification of read
+	  in Windows. see [ruby-core:33460] and r29980. and, we have to
+	  discuss how to do this one byte.
+
 Tue Dec 21 01:18:06 2010  KOSAKI Motohiro  <kosaki.motohiro@g...>
 
 	* error.c: Fix build error for win32. This regression was
Index: io.c
===================================================================
--- io.c	(revision 30279)
+++ io.c	(revision 30280)
@@ -1246,6 +1246,9 @@
         fptr->rbuf.len = 0;
         fptr->rbuf.capa = IO_RBUF_CAPA_FOR(fptr);
         fptr->rbuf.ptr = ALLOC_N(char, fptr->rbuf.capa);
+#ifdef _WIN32
+	fptr->rbuf.capa--;
+#endif
     }
     if (fptr->rbuf.len == 0) {
       retry:
@@ -1789,6 +1792,32 @@
     return str;
 }
 
+static void
+io_setstrbuf(VALUE *str,long len)
+{
+#ifdef _WIN32
+    if (NIL_P(*str)) {
+	*str = rb_str_new(0, len+1);
+	rb_str_set_len(*str,len);
+    }
+    else {
+	StringValue(*str);
+	rb_str_modify(*str);
+	rb_str_resize(*str, len+1);
+	rb_str_set_len(*str,len);
+    }
+#else
+    if (NIL_P(*str)) {
+	*str = rb_str_new(0, len);
+    }
+    else {
+	StringValue(*str);
+	rb_str_modify(*str);
+	rb_str_resize(*str, len);
+    }
+#endif
+}
+
 static VALUE
 read_all(rb_io_t *fptr, long siz, VALUE str)
 {
@@ -1799,8 +1828,7 @@
     int cr;
 
     if (NEED_READCONV(fptr)) {
-        if (NIL_P(str)) str = rb_str_new(NULL, 0);
-        else rb_str_set_len(str, 0);
+	io_setstrbuf(&str,0);
         make_readconv(fptr, 0);
         while (1) {
             VALUE v;
@@ -1828,12 +1856,7 @@
     cr = 0;
 
     if (siz == 0) siz = BUFSIZ;
-    if (NIL_P(str)) {
-	str = rb_str_new(0, siz);
-    }
-    else {
-	rb_str_resize(str, siz);
-    }
+    io_setstrbuf(&str,siz);
     for (;;) {
 	READ_CHECK(fptr);
 	n = io_fread(str, bytes, fptr);
@@ -1886,14 +1909,7 @@
 	rb_raise(rb_eArgError, "negative length %ld given", len);
     }
 
-    if (NIL_P(str)) {
-	str = rb_str_new(0, len);
-    }
-    else {
-	StringValue(str);
-	rb_str_modify(str);
-        rb_str_resize(str, len);
-    }
+    io_setstrbuf(&str,len);
     OBJ_TAINT(str);
 
     GetOpenFile(io, fptr);
@@ -2212,10 +2228,6 @@
     rb_scan_args(argc, argv, "02", &length, &str);
 
     if (NIL_P(length)) {
-	if (!NIL_P(str)){
-	    StringValue(str);
-	    rb_str_modify(str);
-	}
 	GetOpenFile(io, fptr);
 	rb_io_check_char_readable(fptr);
 	return read_all(fptr, remain_size(fptr), str);
@@ -2225,14 +2237,7 @@
 	rb_raise(rb_eArgError, "negative length %ld given", len);
     }
 
-    if (NIL_P(str)) {
-	str = rb_str_new(0, len);
-    }
-    else {
-	StringValue(str);
-	rb_str_modify(str);
-	rb_str_resize(str,len);
-    }
+    io_setstrbuf(&str,len);
 
     GetOpenFile(io, fptr);
     rb_io_check_byte_readable(fptr);
@@ -3941,14 +3946,7 @@
     rb_scan_args(argc, argv, "11", &len, &str);
     ilen = NUM2LONG(len);
 
-    if (NIL_P(str)) {
-	str = rb_str_new(0, ilen);
-    }
-    else {
-	StringValue(str);
-	rb_str_modify(str);
-	rb_str_resize(str, ilen);
-    }
+    io_setstrbuf(&str,ilen);
     if (ilen == 0) return str;
 
     GetOpenFile(io, fptr);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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