* ext/io/wait/wait.c (io_nread): returns number of bytes available

for read.  response to feature request #936 in [ruby-core:20917].

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21169 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2008-12-29 09:07:20 +00:00
Родитель 95327358ce
Коммит d33298e524
2 изменённых файлов: 31 добавлений и 0 удалений

Просмотреть файл

@ -1,3 +1,8 @@
Mon Dec 29 18:02:45 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
* ext/io/wait/wait.c (io_nread): returns number of bytes available
for read. response to feature request #936 in [ruby-core:20917].
Mon Dec 29 17:52:16 2008 Yukihiro Matsumoto <matz@ruby-lang.org> Mon Dec 29 17:52:16 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
* ext/io/wait/wait.c (io_ready_p): updated to follow RDoc. * ext/io/wait/wait.c (io_ready_p): updated to follow RDoc.

Просмотреть файл

@ -42,6 +42,31 @@ void Init_wait _((void));
EXTERN struct timeval rb_time_interval _((VALUE time)); EXTERN struct timeval rb_time_interval _((VALUE time));
/*
* call-seq:
* io.nread -> int
*
* Returns number of bytes that can be read without blocking.
* Returns zero if no information available.
*/
static VALUE
io_nread(VALUE io)
{
rb_io_t *fptr;
int len;
ioctl_arg n;
GetOpenFile(io, fptr);
rb_io_check_readable(fptr);
len = rb_io_read_pending(fptr);
if (len > 0) return len;
if (!FIONREAD_POSSIBLE_P(fptr->fd)) return INT2FIX(0);
if (ioctl(fptr->fd, FIONREAD, &n)) return INT2FIX(0);
if (n > 0) return ioctl_arg2num(n);
return INT2FIX(0);
}
/* /*
* call-seq: * call-seq:
* io.ready? -> true, false or nil * io.ready? -> true, false or nil
@ -137,6 +162,7 @@ io_wait(int argc, VALUE *argv, VALUE io)
void void
Init_wait() Init_wait()
{ {
rb_define_method(rb_cIO, "nread", io_nread, 0);
rb_define_method(rb_cIO, "ready?", io_ready_p, 0); rb_define_method(rb_cIO, "ready?", io_ready_p, 0);
rb_define_method(rb_cIO, "wait", io_wait, -1); rb_define_method(rb_cIO, "wait", io_wait, -1);
} }