[PATCH] Use fgetpos/fsetpos for 64-bit win32 fseek/ftell.

Timothy B. Terriberry tterribe at xiph.org
Sun May 5 07:54:00 PDT 2013


This should work on pre-Vista versions of Windows without requiring
 the distribution of any extra runtime libraries.
---
 include/share/compat.h | 40 ++++++++++++++++++++++++++++++++++++++--
 1 file changed, 38 insertions(+), 2 deletions(-)

diff --git a/include/share/compat.h b/include/share/compat.h
index 222de65..f6a1500 100644
--- a/include/share/compat.h
+++ b/include/share/compat.h
@@ -45,18 +45,54 @@
 #else
 # include <unistd.h>
 #endif
 
 #if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__
 #include <sys/types.h> /* for off_t */
 #define FLAC__off_t __int64 /* use this instead of off_t to fix the 2 GB limit */
 #if !defined __MINGW32__
-#define fseeko _fseeki64
-#define ftello _ftelli64
+#include <stdio.h>
+#define FLAC__off_t_MAX ((2*(((FLAC__off_t)1<<62)-1))|1)
+static __inline int
+fseeko(FILE *stream, FLAC__off_t offset, int whence)
+{
+	FLAC__off_t pos;
+	if(whence == SEEK_CUR) {
+		int ret;
+		ret = fgetpos(stream, (fpos_t *)&pos);
+		if(ret) {
+			return ret;
+		}
+	}
+	else if(whence == SEEK_END) {
+		pos = _filelengthi64(_fileno(stream));
+	}
+	else if(whence == SEEK_SET) {
+		pos = 0;
+	}
+	else {
+		errno = EINVAL;
+		return -1;
+	}
+	if(pos < 0 || offset < -pos || offset > FLAC__off_t_MAX - pos) {
+		/* MSVCRT maps ERROR_NEGATIVE_SEEK to EINVAL. */
+		errno = EINVAL;
+		return -1;
+	}
+	pos += offset;
+	return fsetpos(stream, (fpos_t *)&pos);
+}
+
+static __inline FLAC__off_t
+ftello(FILE *stream)
+{
+	FLAC__off_t pos;
+	return fgetpos(stream, (fpos_t *)&pos) ? -1 : pos;
+}
 #else /* MinGW */
 #if !defined(HAVE_FSEEKO)
 #define fseeko fseeko64
 #define ftello ftello64
 #endif
 #endif
 #else
 #define FLAC__off_t off_t
-- 
1.7.12


--------------010000020009030100080103--


More information about the flac-dev mailing list