From: Guido van Rossum Date: Tue, 16 Jan 2001 20:53:31 +0000 (+0000) Subject: Rationalizing the fallback code for portable fseek -- this is all much X-Git-Tag: v2.1a1~223 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e54e0be3b6f611914a078ec646a269a71fa8bf7f;p=thirdparty%2FPython%2Fcpython.git 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! --- diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 69ee860f6604..385d1881ffb1 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -55,15 +55,6 @@ #include #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