summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2001-01-16 20:53:31 (GMT)
committerGuido van Rossum <guido@python.org>2001-01-16 20:53:31 (GMT)
commite54e0be3b6f611914a078ec646a269a71fa8bf7f (patch)
tree4ab3f21616311d69c8a59e18b7a60145a2d19a0d
parent25be1931a0323d639daee5aac2c087359bd31c85 (diff)
downloadcpython-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.c38
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