summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-12-23 12:45:47 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-12-23 12:45:47 +0000
commita4610baeee3b2cb089dede25162eb2976e779074 (patch)
treef2b6968b29c876131dddf03a73efe8823023e21b /io.c
parent6a1ab2d3112d7005254421f5a65400d7fb070bdf (diff)
merges r30280 from trunk into ruby_1_9_2.
-- * 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_2@30321 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c70
1 files changed, 34 insertions, 36 deletions
diff --git a/io.c b/io.c
index 474562a944..2b40b08f0f 100644
--- a/io.c
+++ b/io.c
@@ -1211,6 +1211,9 @@ io_fillbuf(rb_io_t *fptr)
fptr->rbuf_len = 0;
fptr->rbuf_capa = IO_RBUF_CAPA_FOR(fptr);
fptr->rbuf = ALLOC_N(char, fptr->rbuf_capa);
+#ifdef _WIN32
+ fptr->rbuf.capa--;
+#endif
}
if (fptr->rbuf_len == 0) {
retry:
@@ -1734,6 +1737,32 @@ io_shift_cbuf(rb_io_t *fptr, int len, VALUE *strp)
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)
{
@@ -1744,8 +1773,7 @@ read_all(rb_io_t *fptr, long siz, VALUE str)
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;
@@ -1773,12 +1801,7 @@ read_all(rb_io_t *fptr, long siz, VALUE str)
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);
@@ -1831,14 +1854,7 @@ io_getpartial(int argc, VALUE *argv, VALUE io, int nonblock)
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);
@@ -2157,10 +2173,6 @@ io_read(int argc, VALUE *argv, VALUE io)
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);
@@ -2170,14 +2182,7 @@ io_read(int argc, VALUE *argv, VALUE io)
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);
@@ -3882,14 +3887,7 @@ rb_io_sysread(int argc, VALUE *argv, VALUE io)
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);