summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--doc/NEWS4
-rw-r--r--io.c46
-rw-r--r--ruby.h2
-rw-r--r--version.h4
5 files changed, 50 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index bbc79c84cf..c240d69ea0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Wed Mar 27 13:14:43 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * io.c (rb_io_sysseek): new method based on a patch from Aristarkh
+ A Zagorodnikov <xm@bolotov-team.ru>. [new]
+
+ * io.c (READ_DATA_PENDING): use !feof(fp) for default behavior.
+
Tue Mar 26 20:28:50 2002 Minero Aoki <aamine@loveruby.net>
* lib/net/http.rb: HTTP.get accepts URI.
diff --git a/doc/NEWS b/doc/NEWS
index 4f7e7b7548..9e8aad2cd7 100644
--- a/doc/NEWS
+++ b/doc/NEWS
@@ -1,3 +1,7 @@
+: IO#sysseek
+
+ Added.
+
: BigFloat
Imported courtesy of Shigeo Kobayashi. Variable precision extension
diff --git a/io.c b/io.c
index 1b5221d1ee..b500a018a3 100644
--- a/io.c
+++ b/io.c
@@ -95,6 +95,10 @@ extern void Init_File _((void));
#include "util.h"
+#if SIZEOF_OFF_T > SIZEOF_LONG && !defined(HAVE_LONG_LONG)
+# error off_t is bigger than long, but you have no long long...
+#endif
+
VALUE rb_cIO;
VALUE rb_eEOFError;
VALUE rb_eIOError;
@@ -148,7 +152,7 @@ static VALUE lineno;
#else
/* requires systems own version of the ReadDataPending() */
extern int ReadDataPending();
-# define READ_DATA_PENDING(fp) ReadDataPending(fp)
+# define READ_DATA_PENDING(fp) (!feof(fp))
#endif
#ifndef READ_DATA_PENDING_PTR
# ifdef FILE_READPTR
@@ -350,15 +354,7 @@ rb_io_tell(io)
GetOpenFile(io, fptr);
pos = ftello(fptr->f);
if (ferror(fptr->f)) rb_sys_fail(fptr->path);
-
-#if SIZEOF_OFF_T > SIZEOF_LONG
-# if !HAVE_LONG_LONG
-# error off_t is bigger than long, but you have no long long...
-# endif
- return rb_ll2inum(pos);
-#else
- return rb_int2inum(pos);
-#endif
+ return OFFT2NUM(pos);
}
#ifndef SEEK_CUR
@@ -1325,6 +1321,35 @@ rb_io_close_write(io)
}
static VALUE
+rb_io_sysseek(argc, argv, io)
+ int argc;
+ VALUE *argv;
+ VALUE io;
+{
+ VALUE offset, ptrname;
+ int whence;
+ OpenFile *fptr;
+ off_t pos;
+
+ rb_scan_args(argc, argv, "11", &offset, &ptrname);
+ if (argc == 1) whence = SEEK_SET;
+ else whence = NUM2INT(ptrname);
+
+ GetOpenFile(io, fptr);
+ if ((fptr->mode & FMODE_READABLE) && READ_DATA_PENDING(fptr->f)) {
+ rb_raise(rb_eIOError, "syseek for buffered IO");
+ }
+ if ((fptr->mode & FMODE_WRITABLE) && (fptr->mode & FMODE_WBUF)) {
+ rb_warn("sysseek for buffered IO");
+ }
+ pos = lseek(fileno(fptr->f), NUM2OFFT(offset), whence);
+ if (pos == -1) rb_sys_fail(fptr->path);
+ clearerr(fptr->f);
+
+ return OFFT2NUM(pos);
+}
+
+static VALUE
rb_io_syswrite(io, str)
VALUE io, str;
{
@@ -3761,6 +3786,7 @@ Init_IO()
rb_define_method(rb_cIO, "isatty", rb_io_isatty, 0);
rb_define_method(rb_cIO, "tty?", rb_io_isatty, 0);
rb_define_method(rb_cIO, "binmode", rb_io_binmode, 0);
+ rb_define_method(rb_cIO, "sysseek", rb_io_sysseek, -1);
rb_define_method(rb_cIO, "ioctl", rb_io_ioctl, -1);
rb_define_method(rb_cIO, "fcntl", rb_io_fcntl, -1);
diff --git a/ruby.h b/ruby.h
index 24d3e0441c..7bdc827720 100644
--- a/ruby.h
+++ b/ruby.h
@@ -139,7 +139,7 @@ VALUE rb_ull2inum _((unsigned LONG_LONG));
#define ULL2NUM(v) rb_ull2inum(v)
#endif
-#if SIZEOF_OFF_T > SIZEOF_LONG && HAVE_LONG_LONG
+#if SIZEOF_OFF_T > SIZEOF_LONG && defined(HAVE_LONG_LONG)
# define OFFT2NUM(v) LL2NUM(v)
#else
# define OFFT2NUM(v) INT2NUM(v)
diff --git a/version.h b/version.h
index 0ab705398a..cb4edb9131 100644
--- a/version.h
+++ b/version.h
@@ -1,4 +1,4 @@
#define RUBY_VERSION "1.7.2"
-#define RUBY_RELEASE_DATE "2002-03-26"
+#define RUBY_RELEASE_DATE "2002-03-27"
#define RUBY_VERSION_CODE 172
-#define RUBY_RELEASE_CODE 20020326
+#define RUBY_RELEASE_CODE 20020327