зеркало из https://github.com/github/ruby.git
* 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/trunk@30280 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
12b8ff1f46
Коммит
da4d3e8464
|
@ -1,3 +1,9 @@
|
|||
Tue Dec 21 01:41:42 2010 Masaya Tarui <tarui@ruby-lnag.org>
|
||||
|
||||
* 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@gmail.com>
|
||||
|
||||
* error.c: Fix build error for win32. This regression was
|
||||
|
|
70
io.c
70
io.c
|
@ -1246,6 +1246,9 @@ io_fillbuf(rb_io_t *fptr)
|
|||
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 @@ 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)
|
||||
{
|
||||
|
@ -1799,8 +1828,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;
|
||||
|
@ -1828,12 +1856,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);
|
||||
|
@ -1886,14 +1909,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);
|
||||
|
@ -2212,10 +2228,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);
|
||||
|
@ -2225,14 +2237,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);
|
||||
|
@ -3941,14 +3946,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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче