From: Eryk Wieliczko Subject: msvcrt: Implement _fseeki64. Message-Id: <1288644562-17482-1-git-send-email-ewdevel@gmail.com> Date: Mon, 1 Nov 2010 21:49:22 +0100 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_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