From 119c842a5b948049066bf6126c037f7b2df198aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Czerpak?= Date: Thu, 4 Feb 2016 17:02:32 +0100 Subject: [PATCH] 2016-02-04 17:02 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * include/hbapifs.h * src/rtl/filesys.c + added new C function: HB_FOFFSET hb_fsGetSize( HB_FHANDLE hFileHandle ); ! fixed SetFilePointer() error detecting - it was broken and we returned wrong results for offset 0xFFFFFFFF * src/rtl/filebuf.c * use hb_fsGetSize() --- ChangeLog.txt | 10 ++++++++++ include/hbapifs.h | 1 + src/rtl/filebuf.c | 2 +- src/rtl/filesys.c | 46 +++++++++++++++++++++++++++++++++------------- 4 files changed, 45 insertions(+), 14 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index 806bcc5919..4a57aec47f 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,16 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2016-02-04 17:02 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * include/hbapifs.h + * src/rtl/filesys.c + + added new C function: + HB_FOFFSET hb_fsGetSize( HB_FHANDLE hFileHandle ); + ! fixed SetFilePointer() error detecting - it was broken + and we returned wrong results for offset 0xFFFFFFFF + * src/rtl/filebuf.c + * use hb_fsGetSize() + 2016-02-01 14:55 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * src/rdd/sdf1.c ! fixed EOL decoding in DOS, OS2 and MS-Windows builds diff --git a/include/hbapifs.h b/include/hbapifs.h index 9fb4fbbdec..8c3b1935ce 100644 --- a/include/hbapifs.h +++ b/include/hbapifs.h @@ -160,6 +160,7 @@ extern HB_EXPORT HB_BOOL hb_fsRename ( const char * pszOldName, const ch extern HB_EXPORT HB_ULONG hb_fsSeek ( HB_FHANDLE hFileHandle, HB_LONG lOffset, HB_USHORT uiMode ); /* reposition an open file */ extern HB_EXPORT HB_FOFFSET hb_fsSeekLarge ( HB_FHANDLE hFileHandle, HB_FOFFSET nOffset, HB_USHORT uiFlags ); /* reposition an open file using 64bit API */ extern HB_EXPORT HB_FOFFSET hb_fsTell ( HB_FHANDLE hFileHandle ); /* retrieve the current position of a file */ +extern HB_EXPORT HB_FOFFSET hb_fsGetSize ( HB_FHANDLE hFileHandle ); /* retrieve the size of a file, it may change current seek position */ extern HB_EXPORT int hb_fsSetDevMode ( HB_FHANDLE hFileHandle, int iDevMode ); /* change the device mode of a file (text/binary) */ extern HB_EXPORT HB_BOOL hb_fsGetFileTime ( const char * pszFileName, long * plJulian, long * plMillisec ); extern HB_EXPORT HB_BOOL hb_fsSetFileTime ( const char * pszFileName, long lJulian, long lMillisec ); diff --git a/src/rtl/filebuf.c b/src/rtl/filebuf.c index 5841119114..7dcf8fc819 100644 --- a/src/rtl/filebuf.c +++ b/src/rtl/filebuf.c @@ -828,7 +828,7 @@ static HB_FOFFSET s_fileSeek( PHB_FILE pFile, HB_FOFFSET nOffset, static HB_FOFFSET s_fileSize( PHB_FILE pFile ) { - return hb_fsSeekLarge( pFile->hFile, 0, FS_END ); + return hb_fsGetSize( pFile->hFile ); } static HB_BOOL s_fileEof( PHB_FILE pFile ) diff --git a/src/rtl/filesys.c b/src/rtl/filesys.c index b3bed34d8d..68e7a20774 100644 --- a/src/rtl/filesys.c +++ b/src/rtl/filesys.c @@ -2685,14 +2685,12 @@ HB_SIZE hb_fsReadAt( HB_FHANDLE hFileHandle, void * pBuff, HB_SIZE nCount, HB_FO } else { - HB_FOFFSET nPos; ULONG ulOffsetLow = ( ULONG ) ( nOffset & 0xFFFFFFFF ), ulOffsetHigh = ( ULONG ) ( nOffset >> 32 ); ulOffsetLow = SetFilePointer( DosToWinHandle( hFileHandle ), ulOffsetLow, ( PLONG ) &ulOffsetHigh, SEEK_SET ); - nPos = ( ( HB_FOFFSET ) ulOffsetHigh << 32 ) | ulOffsetLow; - if( nPos == ( HB_FOFFSET ) INVALID_SET_FILE_POINTER ) + if( ulOffsetLow == ( ULONG ) INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR ) { hb_fsSetIOError( HB_FALSE, 0 ); nRead = 0; @@ -2826,14 +2824,12 @@ HB_SIZE hb_fsWriteAt( HB_FHANDLE hFileHandle, const void * pBuff, HB_SIZE nCount } else { - HB_FOFFSET nPos; ULONG ulOffsetLow = ( ULONG ) ( nOffset & 0xFFFFFFFF ), ulOffsetHigh = ( ULONG ) ( nOffset >> 32 ); ulOffsetLow = SetFilePointer( DosToWinHandle( hFileHandle ), ulOffsetLow, ( PLONG ) &ulOffsetHigh, SEEK_SET ); - nPos = ( ( HB_FOFFSET ) ulOffsetHigh << 32 ) | ulOffsetLow; - if( nPos == ( HB_FOFFSET ) INVALID_SET_FILE_POINTER ) + if( ulOffsetLow == ( ULONG ) INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR ) { hb_fsSetIOError( HB_FALSE, 0 ); nWritten = 0; @@ -3419,7 +3415,7 @@ HB_ULONG hb_fsSeek( HB_FHANDLE hFileHandle, HB_LONG lOffset, HB_USHORT uiFlags ) /* This DOS hack creates 2GB file size limit, Druzus */ if( lOffset < 0 && nFlags == SEEK_SET ) { - ulPos = ( HB_ULONG ) INVALID_SET_FILE_POINTER; + ulPos = ( ULONG ) INVALID_SET_FILE_POINTER; hb_fsSetError( 25 ); /* 'Seek Error' */ } else @@ -3503,7 +3499,7 @@ HB_FOFFSET hb_fsSeekLarge( HB_FHANDLE hFileHandle, HB_FOFFSET nOffset, HB_USHORT hb_vmUnlock(); if( nOffset < 0 && nFlags == SEEK_SET ) { - nPos = ( HB_FOFFSET ) INVALID_SET_FILE_POINTER; + nPos = ( HB_FOFFSET ) -1; hb_fsSetError( 25 ); /* 'Seek Error' */ } else @@ -3511,18 +3507,22 @@ HB_FOFFSET hb_fsSeekLarge( HB_FHANDLE hFileHandle, HB_FOFFSET nOffset, HB_USHORT ulOffsetLow = SetFilePointer( DosToWinHandle( hFileHandle ), ulOffsetLow, ( PLONG ) &ulOffsetHigh, ( DWORD ) nFlags ); - nPos = ( ( HB_FOFFSET ) ulOffsetHigh << 32 ) | ulOffsetLow; - hb_fsSetIOError( nPos != ( HB_FOFFSET ) INVALID_SET_FILE_POINTER, 0 ); + if( ulOffsetLow == ( ULONG ) INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR ) + nPos = ( HB_FOFFSET ) -1; + else + nPos = ( ( HB_FOFFSET ) ulOffsetHigh << 32 ) | ulOffsetLow; + hb_fsSetIOError( nPos != ( HB_FOFFSET ) -1, 0 ); } - if( nPos == ( HB_FOFFSET ) INVALID_SET_FILE_POINTER ) + if( nPos == ( HB_FOFFSET ) -1 ) { ulOffsetHigh = 0; ulOffsetLow = SetFilePointer( DosToWinHandle( hFileHandle ), 0, ( PLONG ) &ulOffsetHigh, SEEK_CUR ); - nPos = ( ( HB_FOFFSET ) ulOffsetHigh << 32 ) | ulOffsetLow; - if( nPos == ( ULONG ) INVALID_SET_FILE_POINTER ) + if( ulOffsetLow == ( ULONG ) INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR ) nPos = 0; + else + nPos = ( ( HB_FOFFSET ) ulOffsetHigh << 32 ) | ulOffsetLow; } hb_vmLock(); } @@ -3594,6 +3594,26 @@ HB_FOFFSET hb_fsTell( HB_FHANDLE hFileHandle ) return hb_fsSeekLarge( hFileHandle, 0, FS_RELATIVE ); } +HB_FOFFSET hb_fsGetSize( HB_FHANDLE hFileHandle ) +{ + HB_TRACE( HB_TR_DEBUG, ( "hb_fsGetSize(%p)", ( void * ) ( HB_PTRUINT ) hFileHandle ) ); + +#if defined( HB_OS_WIN ) + { + DWORD dwFileSizeLow, dwFileSizeHigh = 0; + HB_BOOL fOK = HB_FALSE; + + dwFileSizeLow = GetFileSize( DosToWinHandle( hFileHandle ), &dwFileSizeHigh ); + fOK = dwFileSizeLow != INVALID_FILE_SIZE || GetLastError() == NO_ERROR; + hb_fsSetIOError( fOK, 0 ); + + return fOK ? ( ( HB_FOFFSET ) dwFileSizeHigh << 32 ) | dwFileSizeLow : 0; + } +#else + return hb_fsSeekLarge( hFileHandle, 0, FS_END ); +#endif +} + HB_BOOL hb_fsDelete( const char * pszFileName ) { HB_BOOL fResult;