diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-12-20 09:29:41 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-12-20 09:29:41 +0000 |
commit | 5b615c70eb68177075bf033384499a2eb4b765e6 (patch) | |
tree | 1fde7e1854c2299962d04be1efd8055c1758c96f /io.c | |
parent | 96d28f71d93bd654a7a01d496ad43e1be6fcfe1f (diff) |
* io.c (rb_io_fwrite): separated from io_write().
* marshal.c (w_byten): use rb_io_fwrite() to support non-blocking
IO, and added error check.
* rubyio.h: prototypes; rb_io_fwrite
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3191 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 56 |
1 files changed, 33 insertions, 23 deletions
@@ -363,14 +363,43 @@ rb_io_wait_writable(f) } /* writing functions */ +long +rb_io_fwrite(ptr, len, f) + const char *ptr; + long len; + FILE *f; +{ + long n, r; + + if ((n = len) <= 0) return n; +#ifdef __human68k__ + do { + if (fputc(*ptr++, f) == EOF) { + if (ferror(f)) return -1L; + break; + } + } while (--n > 0); +#else + while (ptr += (r = fwrite(ptr, 1, n, f)), (n -= r) > 0) { + if (ferror(f)) { + if (rb_io_wait_writable(fileno(f))) { + clearerr(f); + continue; + } + return -1L; + } + } +#endif + return len - n; +} + static VALUE io_write(io, str) VALUE io, str; { OpenFile *fptr; FILE *f; - long n, r; - register char *ptr; + long n; rb_secure(4); if (TYPE(str) != T_STRING) @@ -386,27 +415,8 @@ io_write(io, str) rb_io_check_writable(fptr); f = GetWriteFile(fptr); - ptr = RSTRING(str)->ptr; - n = RSTRING(str)->len; -#ifdef __human68k__ - do { - if (fputc(*ptr++, f) == EOF) { - if (ferror(f)) rb_sys_fail(fptr->path); - break; - } - } while (--n > 0); -#else - while (ptr += (r = fwrite(ptr, 1, n, f)), (n -= r) > 0) { - if (ferror(f)) { - if (rb_io_wait_writable(fileno(f))) { - clearerr(f); - continue; - } - rb_sys_fail(fptr->path); - } - } -#endif - n = ptr - RSTRING(str)->ptr; + n = rb_io_fwrite(RSTRING(str)->ptr, RSTRING(str)->len, f); + if (n == -1L) rb_sys_fail(fptr->path); if (fptr->mode & FMODE_SYNC) { io_fflush(f, fptr); } |