msvcrt: Implement _fseeki64.

Eryk Wieliczko ewdevel at gmail.com
Mon Nov 1 15:49:22 CDT 2010


Fixes bug #24139
---
 dlls/msvcr100/msvcr100.spec |    2 +-
 dlls/msvcr80/msvcr80.spec   |    2 +-
 dlls/msvcr90/msvcr90.spec   |    2 +-
 dlls/msvcrt/file.c          |   35 +++++++++++++++++++++++++++++++++++
 dlls/msvcrt/msvcrt.spec     |    2 +-
 5 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index c929e54..83dccf7 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -648,7 +648,7 @@
 @ varargs _fscanf_l(ptr str ptr) msvcrt._fscanf_l
 @ varargs _fscanf_s_l(ptr str ptr) msvcrt._fscanf_s_l
 @ stub _fseek_nolock
-@ stub _fseeki64
+@ cdecl _fseeki64(ptr int64 long) msvcrt._fseeki64
 @ stub _fseeki64_nolock
 @ cdecl _fsopen(str str long) msvcrt._fsopen
 @ stub _fstat32
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index ce77d9b..3d37dc7 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -489,7 +489,7 @@
 @ varargs _fscanf_l(ptr str ptr) msvcrt._fscanf_l
 @ varargs _fscanf_s_l(ptr str ptr) msvcrt._fscanf_s_l
 @ stub _fseek_nolock
-@ stub _fseeki64
+@ cdecl _fseeki64(ptr int64 long) msvcrt._fseeki64
 @ stub _fseeki64_nolock
 @ cdecl _fsopen(str str long) msvcrt._fsopen
 @ stub _fstat32
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 0d48cb4..103cc24 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -481,7 +481,7 @@
 @ varargs _fscanf_l(ptr str ptr) msvcrt._fscanf_l
 @ varargs _fscanf_s_l(ptr str ptr) msvcrt._fscanf_s_l
 @ stub _fseek_nolock
-@ stub _fseeki64
+@ cdecl _fseeki64(ptr int64 long) msvcrt._fseeki64
 @ stub _fseeki64_nolock
 @ cdecl _fsopen(str str long) msvcrt._fsopen
 @ stub _fstat32
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 3eb93ac..f0de73a 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -961,6 +961,41 @@ int CDECL MSVCRT_fseek(MSVCRT_FILE* file, MSVCRT_long offset, int whence)
 }
 
 /*********************************************************************
+ *		_fseeki64 (MSVCRT.@)
+ */
+int CDECL MSVCRT__fseeki64(MSVCRT_FILE* file, __int64 offset, int whence)
+{
+  /* Flush output if needed */
+  if(file->_flag & MSVCRT__IOWRT)
+	msvcrt_flush_buffer(file);
+
+  if(whence == SEEK_CUR && file->_flag & MSVCRT__IOREAD ) {
+	offset -= file->_cnt;
+	if (MSVCRT_fdesc[file->_file].wxflag & WX_TEXT) {
+		/* Black magic correction for CR removal */
+		int i;
+		for (i=0; i<file->_cnt; i++) {
+			if (file->_ptr[i] == '\n')
+				offset--;
+		}
+		/* Black magic when reading CR at buffer boundary*/
+		if(MSVCRT_fdesc[file->_file].wxflag & WX_READCR)
+		    offset--;
+	}
+  }
+  /* Discard buffered input */
+  file->_cnt = 0;
+  file->_ptr = file->_base;
+  /* Reset direction of i/o */
+  if(file->_flag & MSVCRT__IORW) {
+        file->_flag &= ~(MSVCRT__IOREAD|MSVCRT__IOWRT);
+  }
+  /* Clear end of file flag */
+  file->_flag &= ~MSVCRT__IOEOF;
+  return (MSVCRT__lseeki64(file->_file,offset,whence) == -1)?-1:0;
+}
+
+/*********************************************************************
  *		_chsize (MSVCRT.@)
  */
 int CDECL MSVCRT__chsize(int fd, MSVCRT_long size)
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 7b6b51c..d4f8f9d 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -437,7 +437,7 @@
 # stub _fscanf_l
 @ varargs _fscanf_l(ptr str ptr) MSVCRT__fscanf_l
 @ varargs _fscanf_s_l(ptr str ptr) MSVCRT__fscanf_s_l
-# stub _fseeki64
+@ cdecl _fseeki64(ptr int64 long) MSVCRT__fseeki64
 @ cdecl _fsopen(str str long) MSVCRT__fsopen
 @ cdecl _fstat(long ptr) MSVCRT__fstat
 @ cdecl _fstat64(long ptr) MSVCRT__fstat64
-- 
1.7.0.4




More information about the wine-patches mailing list