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()
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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 )
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user