summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-07-24 07:19:34 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-07-24 07:19:34 +0000
commit491cfd93f758330b1c36e6797129006b776532e8 (patch)
tree94d3897c42c13bda0c5cfa1cb3de05d5cf98ba03 /io.c
parent6d19b9b4191c86968e547bd121d2472f72150cc2 (diff)
matz
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_4@844 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c61
1 files changed, 29 insertions, 32 deletions
diff --git a/io.c b/io.c
index 88314ba455..5056459846 100644
--- a/io.c
+++ b/io.c
@@ -382,6 +382,32 @@ rb_io_to_io(io)
/* reading functions */
+static size_t
+io_fread(ptr, len, f)
+ char *ptr;
+ size_t len;
+ FILE *f;
+{
+ size_t n = len;
+ int c;
+
+ while (n--) {
+ if (!READ_DATA_PENDING(f)) {
+ rb_thread_wait_fd(fileno(f));
+ }
+ TRAP_BEG;
+ c = getc(f);
+ TRAP_END;
+ if (c == EOF) {
+ *ptr = '\0';
+ break;
+ }
+ *ptr++ = c;
+ }
+
+ return len - n - 1;
+}
+
#ifndef S_ISREG
# define S_ISREG(m) ((m & S_IFMT) == S_IFREG)
#endif
@@ -421,11 +447,9 @@ read_all(port)
}
}
str = rb_str_new(0, siz);
+ READ_CHECK(fptr->f);
for (;;) {
- READ_CHECK(fptr->f);
- TRAP_BEG;
- n = fread(RSTRING(str)->ptr+bytes, 1, siz-bytes, fptr->f);
- TRAP_END;
+ n = io_fread(RSTRING(str)->ptr+bytes, siz-bytes, fptr->f);
if (n == 0 && bytes == 0) {
if (feof(fptr->f)) return Qnil;
rb_sys_fail(fptr->path);
@@ -442,32 +466,6 @@ read_all(port)
return str;
}
-static size_t
-io_fread(ptr, len, f)
- char *ptr;
- size_t len;
- FILE *f;
-{
- size_t n = len;
- int c;
-
- while (n--) {
- if (!READ_DATA_PENDING(f)) {
- rb_thread_wait_fd(fileno(f));
- }
- TRAP_BEG;
- c = getc(f);
- TRAP_END;
- if (c == EOF) {
- *ptr = '\0';
- break;
- }
- *ptr++ = c;
- }
-
- return len - n - 1;
-}
-
static VALUE
io_read(argc, argv, io)
int argc;
@@ -1727,6 +1725,7 @@ rb_io_reopen(io, nfile)
mode = rb_io_mode_string(fptr);
fd = fileno(fptr->f);
if (fd < 3) {
+ clearerr(fptr->f);
/* need to keep stdio */
if (dup2(fileno(orig->f), fd) < 0)
rb_sys_fail(orig->path);
@@ -3087,8 +3086,6 @@ argf_eof()
{
if (init_p == 0 && !next_argv())
return Qtrue;
- if (next_p == -1)
- return Qtrue;
if (TYPE(current_file) != T_FILE) {
return argf_forward();
}