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