diff options
author | Guido van Rossum <guido@python.org> | 2001-01-16 20:53:31 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2001-01-16 20:53:31 (GMT) |
commit | e54e0be3b6f611914a078ec646a269a71fa8bf7f (patch) | |
tree | 4ab3f21616311d69c8a59e18b7a60145a2d19a0d | |
parent | 25be1931a0323d639daee5aac2c087359bd31c85 (diff) | |
download | cpython-e54e0be3b6f611914a078ec646a269a71fa8bf7f.zip cpython-e54e0be3b6f611914a078ec646a269a71fa8bf7f.tar.gz cpython-e54e0be3b6f611914a078ec646a269a71fa8bf7f.tar.bz2 |
Rationalizing the fallback code for portable fseek -- this is all much
simpler if we use fgetpos and fsetpos, rather than trying to mess with
platform-specific TELL64 alternatives.
Of course, this hasn't been tested on a 64-bit platform, so I may have
to withdraw this -- but I'm hopeful, and Trent Mick supports this
patch!
-rw-r--r-- | Objects/fileobject.c | 38 |
1 files changed, 12 insertions, 26 deletions
diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 69ee860..385d188 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -55,15 +55,6 @@ #include <errno.h> #endif -/* define the appropriate 64-bit capable tell() function */ -#if defined(MS_WIN64) -#define TELL64 _telli64 -#elif defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(_HAVE_BSDI) || defined(__APPLE__) -/* NOTE: this is only used on older - NetBSD prior to f*o() funcions */ -#define TELL64(fd) lseek((fd),0,SEEK_CUR) -#endif - typedef struct { PyObject_HEAD @@ -257,25 +248,20 @@ _portable_fseek(FILE *fp, off_t offset, int whence) #elif defined(__BEOS__) return _fseek(fp, offset, whence); #elif defined(HAVE_LARGEFILE_SUPPORT) && SIZEOF_FPOS_T >= 8 - /* lacking a 64-bit capable fseek() (as Win64 does) use a 64-bit capable - fsetpos() and tell() to implement fseek()*/ + /* lacking a 64-bit capable fseek(), use a 64-bit capable fsetpos() + and fgetpos() to implement fseek()*/ fpos_t pos; switch (whence) { - case SEEK_CUR: - if (fgetpos(fp, &pos) != 0) - return -1; - offset += pos; - break; - case SEEK_END: - /* do a "no-op" seek first to sync the buffering so that - the low-level tell() can be used correctly */ - if (fseek(fp, 0, SEEK_END) != 0) - return -1; - if ((pos = TELL64(fileno(fp))) == -1L) - return -1; - offset += pos; - break; - /* case SEEK_SET: break; */ + case SEEK_END: + if (fseek(fp, 0, SEEK_END) != 0) + return -1; + /* fall through */ + case SEEK_CUR: + if (fgetpos(fp, &pos) != 0) + return -1; + offset += pos; + break; + /* case SEEK_SET: break; */ } return fsetpos(fp, &offset); #else |