]> granicus.if.org Git - python/commitdiff
Rationalizing the fallback code for portable fseek -- this is all much
authorGuido van Rossum <guido@python.org>
Tue, 16 Jan 2001 20:53:31 +0000 (20:53 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 16 Jan 2001 20:53:31 +0000 (20:53 +0000)
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!

Objects/fileobject.c

index 69ee860f66045df5bf14e3ab0189af21dfcf137b..385d1881ffb1404822919c64cce9757b6e6f2c0d 100644 (file)
 #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