mruby-io/io.c: refactor readable/writable checks for fptr.

This commit is contained in:
Yukihiro "Matz" Matsumoto
2022-05-20 09:59:23 +09:00
parent 013c9f31bc
commit ac79849fde
+25 -20
View File
@@ -71,12 +71,11 @@ static void mrb_io_free(mrb_state *mrb, void *ptr);
struct mrb_data_type mrb_io_type = { "IO", mrb_io_free };
static struct mrb_io *io_get_open_fptr(mrb_state *mrb, mrb_value self);
static int mrb_io_modestr_to_flags(mrb_state *mrb, const char *modestr);
static int mrb_io_mode_to_flags(mrb_state *mrb, mrb_value mode);
static void fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int quiet);
static struct mrb_io *
static struct mrb_io*
io_get_open_fptr(mrb_state *mrb, mrb_value self)
{
struct mrb_io *fptr;
@@ -796,16 +795,33 @@ fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int quiet)
}
}
static struct mrb_io*
io_get_read_fptr(mrb_state *mrb, mrb_value self)
{
struct mrb_io *fptr = io_get_open_fptr(mrb, self);
if (!fptr->readable) {
mrb_raise(mrb, E_IO_ERROR, "not opened for reading");
}
return fptr;
}
static mrb_value
mrb_io_check_readable(mrb_state *mrb, mrb_value self)
{
struct mrb_io *fptr = io_get_open_fptr(mrb, self);
if (! fptr->readable) {
mrb_raise(mrb, E_IO_ERROR, "not opened for reading");
}
io_get_read_fptr(mrb, self);
return mrb_nil_value();
}
static struct mrb_io*
io_get_write_fptr(mrb_state *mrb, mrb_value self)
{
struct mrb_io *fptr = io_get_open_fptr(mrb, self);
if (!fptr->writable) {
mrb_raise(mrb, E_IO_ERROR, "not opened for writing");
}
return fptr;
}
static mrb_value
mrb_io_isatty(mrb_state *mrb, mrb_value self)
{
@@ -944,10 +960,7 @@ mrb_io_sysread_common(mrb_state *mrb,
mrb_str_modify(mrb, RSTRING(buf));
}
fptr = io_get_open_fptr(mrb, io);
if (!fptr->readable) {
mrb_raise(mrb, E_IO_ERROR, "not opened for reading");
}
fptr = io_get_read_fptr(mrb, io);
ret = readfunc(fptr->fd, RSTRING_PTR(buf), (fsize_t)maxlen, offset);
if (ret < 0) {
mrb_sys_fail(mrb, "sysread failed");
@@ -997,11 +1010,7 @@ mrb_io_syswrite_common(mrb_state *mrb,
struct mrb_io *fptr;
int fd, length;
fptr = io_get_open_fptr(mrb, io);
if (! fptr->writable) {
mrb_raise(mrb, E_IO_ERROR, "not opened for writing");
}
fptr = io_get_write_fptr(mrb, io);
if (fptr->fd2 == -1) {
fd = fptr->fd;
} else {
@@ -1502,12 +1511,8 @@ mrb_io_readchar(mrb_state *mrb, mrb_value self)
if (len == 1 && RSTRING_LEN(buf) < 4) { /* partial UTF-8 */
mrb_int blen = RSTRING_LEN(buf);
ssize_t n;
struct mrb_io *fptr = io_get_read_fptr(mrb, self);
struct mrb_io *fptr = io_get_open_fptr(mrb, self);
if (!fptr->readable) {
mrb_raise(mrb, E_IO_ERROR, "not opened for reading");
}
/* refill the buffer */
mrb_str_resize(mrb, buf, 4096);
n = read(fptr->fd, RSTRING_PTR(buf)+blen, 4096-blen);