See changelog 2002-01-04 19:40 UTC-0300

This commit is contained in:
Luiz Rafael Culik
2003-01-04 21:36:06 +00:00
parent 87a50c4ccc
commit f61489e1a2
5 changed files with 238 additions and 43 deletions

View File

@@ -8,6 +8,18 @@
2002-12-01 23:12 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
2003-01-04 19:40 UTC-0300 Luiz Rafael Culik <culikr@uol.com.br>
* include/filesys.c
* When X__WIN32__ is defined FHANDLE is defined as Long
* source/rtl/filesys.c
% Properly Fix the usage os Native Windows File IO API. harbour apps with native WIN IO api has the same speed as Legacy api usage
* source/rtl/console.c
! Minor Changes required to proper work of Windows File IO Native API
* source/common/hbffind.c
! Corrected error return Values For DJGPP compiler for hb_fsFindNext() and hb_fsFindFirst() functions
! Corrected error return Values For WIN32 for hb_fsFindNext() and hb_fsFindFirst() functions
With This Changes to console.c and filesys.c build with X__WIN32__ defined works properly
2002-12-31 11:45 UTC-0500 David G. Holm <dholm@jsd-llc.com>
* include/hbver.h
* Updated the build number and the ChangeLog information.

View File

@@ -61,9 +61,11 @@ extern "C" {
#endif
#define FS_ERROR F_ERROR
typedef int FHANDLE;
#if defined(X__WIN32__)
typedef long FHANDLE;
#else
typedef int FHANDLE;
#endif
/* File locking flags */
#define FL_LOCK 0x0000 /* Lock a region */
#define FL_UNLOCK 0x0001 /* Unlock a region */

View File

@@ -131,6 +131,37 @@ HB_FILE_VER( "$Id$" )
#endif
/* Internal funtion , Convert Windows Error Values to Dos Error Values */
#ifdef HB_OS_WIN_32
int WintoDosError( unsigned long lError)
{
int iReturn;
switch( lError ) {
case ERROR_ALREADY_EXISTS:
iReturn = 5;
break;
case ERROR_FILE_NOT_FOUND:
iReturn = 2;
break;
case ERROR_PATH_NOT_FOUND:
iReturn = 3;
break;
case ERROR_TOO_MANY_OPEN_FILES:
iReturn = 4;
break;
case ERROR_INVALID_HANDLE:
iReturn = 6;
break;
default:
iReturn=0;
break;
}
return iReturn;
}
#endif
/* ------------------------------------------------------------- */
USHORT hb_fsAttrFromRaw( ULONG raw_attr )
@@ -564,6 +595,7 @@ PHB_FFIND hb_fsFindFirst( const char * pszFileName, USHORT uiAttr )
{
PHB_FFIND_INFO info;
errno = 0;
ffind->info = ( void * ) hb_xgrab( sizeof( HB_FFIND_INFO ) );
info = ( PHB_FFIND_INFO ) ffind->info;
@@ -571,6 +603,15 @@ PHB_FFIND hb_fsFindFirst( const char * pszFileName, USHORT uiAttr )
tzset();
bFound = ( findfirst( pszFileName, &info->entry, ( USHORT ) hb_fsAttrToRaw( uiAttr ) ) == 0 );
#if defined(__DJGPP__) || defined(__RSX32__)
if (errno==22)
errno=2;
if (errno==4)
errno=5;
#endif
hb_fsSetError( errno );
}
#elif defined(HB_OS_OS2)
@@ -599,12 +640,14 @@ PHB_FFIND hb_fsFindFirst( const char * pszFileName, USHORT uiAttr )
{
PHB_FFIND_INFO info;
errno = 0;
ffind->info = ( void * ) hb_xgrab( sizeof( HB_FFIND_INFO ) );
info = ( PHB_FFIND_INFO ) ffind->info;
info->hFindFile = FindFirstFile( pszFileName, &info->pFindFileData );
info->dwAttr = ( DWORD ) hb_fsAttrToRaw( uiAttr );
errno = 0;
if( info->hFindFile != INVALID_HANDLE_VALUE )
{
@@ -634,8 +677,11 @@ PHB_FFIND hb_fsFindFirst( const char * pszFileName, USHORT uiAttr )
}
}
}
else
else {
bFound = FALSE;
errno = WintoDosError( GetLastError() );
hb_fsSetError( errno );
}
}
#elif defined(HB_OS_UNIX)
@@ -735,7 +781,16 @@ BOOL hb_fsFindNext( PHB_FFIND ffind )
#if defined(HB_OS_DOS)
{
errno = 0;
bFound = ( findnext( &info->entry ) == 0 );
#if defined(__DJGPP__) || defined(__RSX32__)
if (errno==22)
errno=2;
if (errno==4)
errno=5;
#endif
hb_fsSetError( errno );
}
#elif defined(HB_OS_OS2)
@@ -749,7 +804,7 @@ BOOL hb_fsFindNext( PHB_FFIND ffind )
{
bFound = FALSE;
errno = 0;
while( FindNextFile( info->hFindFile, &info->pFindFileData ) )
{
if( info->dwAttr == 0 ||
@@ -761,6 +816,12 @@ BOOL hb_fsFindNext( PHB_FFIND ffind )
bFound = TRUE;
break;
}
else {
errno = WintoDosError(GetLastError()) ;
hb_fsSetError( errno );
break;
}
}
}

View File

@@ -69,6 +69,7 @@
*
*/
#define HB_OS_WIN_32_USED
#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapifs.h"
@@ -85,9 +86,15 @@ static USHORT s_uiPCol;
static SHORT s_originalMaxRow;
static SHORT s_originalMaxCol;
static char s_szCrLf[ CRLF_BUFFER_LEN ];
#if defined(X__WIN32__)
static int s_iFilenoStdin;
static int s_iFilenoStdout;
static int s_iFilenoStderr;
#else
static int s_iFilenoStdin;
static int s_iFilenoStdout;
static int s_iFilenoStderr;
#endif
void hb_conInit( void )
{
@@ -104,29 +111,48 @@ void hb_conInit( void )
s_uiPRow = s_uiPCol = 0;
#if defined(X__WIN32__)
s_iFilenoStdin = GetStdHandle( STD_INPUT_HANDLE );
s_iFilenoStdout = GetStdHandle( STD_OUTPUT_HANDLE );
#else
s_iFilenoStdin = fileno( stdin );
s_iFilenoStdout = fileno( stdout );
#endif
#ifdef HB_C52_UNDOC
{
int iStderr = hb_cmdargNum( "STDERR" ); /* Undocumented CA-Clipper switch //STDERR:x */
if( iStderr < 0 ) /* //STDERR not used or invalid */
#if defined(X__WIN32__)
s_iFilenoStderr = GetStdHandle( STD_ERROR_HANDLE );
#else
s_iFilenoStderr = fileno( stderr );
#endif
else if( iStderr == 0 ) /* //STDERR with no parameter or 0 */
s_iFilenoStderr = s_iFilenoStdout;
else /* //STDERR:x */
s_iFilenoStderr = iStderr;
}
#else
#if defined(X__WIN32__)
s_iFilenoStderr = GetStdHandle( STD_ERROR_HANDLE );
#else
s_iFilenoStderr = fileno( stderr );
#endif
#endif
/* Some compilers open stdout and stderr in text mode, but
Harbour needs them to be open in binary mode. */
#if !defined(X__WIN32__)
hb_fsSetDevMode( s_iFilenoStdout, FD_BINARY );
hb_fsSetDevMode( s_iFilenoStderr, FD_BINARY );
#endif
s_bInit = TRUE;
@@ -146,8 +172,10 @@ void hb_conRelease( void )
hb_gtSetMode( s_originalMaxRow + 1, s_originalMaxCol + 1 );
}
#if !defined(X__WIN32__)
hb_fsSetDevMode( s_iFilenoStdout, FD_TEXT );
hb_fsSetDevMode( s_iFilenoStderr, FD_TEXT );
#endif
/* The is done by the OS from now on */
s_szCrLf[ 0 ] = HB_CHAR_LF;
@@ -207,12 +235,12 @@ void hb_conOutStd( char * pStr, ULONG ulLen )
hb_gtPreExt();
uiErrorOld = hb_fsError(); /* Save current user file error code */
hb_fsWriteLarge( s_iFilenoStdout, ( BYTE * ) pStr, ulLen );
hb_fsWriteLarge( ( int ) s_iFilenoStdout, ( BYTE * ) pStr, ulLen );
hb_fsSetError( uiErrorOld ); /* Restore last user file error code */
if( s_bInit )
{
hb_gtAdjustPos( s_iFilenoStdout, pStr, ulLen );
hb_gtAdjustPos( ( int ) s_iFilenoStdout, pStr, ulLen );
hb_gtPostExt();
}
}
@@ -231,12 +259,12 @@ void hb_conOutErr( char * pStr, ULONG ulLen )
hb_gtPreExt();
uiErrorOld = hb_fsError(); /* Save current user file error code */
hb_fsWriteLarge( s_iFilenoStderr, ( BYTE * ) pStr, ulLen );
hb_fsWriteLarge( ( int ) s_iFilenoStderr, ( BYTE * ) pStr, ulLen );
hb_fsSetError( uiErrorOld ); /* Restore last user file error code */
if( s_bInit )
{
hb_gtAdjustPos( s_iFilenoStderr, pStr, ulLen );
hb_gtAdjustPos( ( int ) s_iFilenoStderr, pStr, ulLen );
hb_gtPostExt();
}
}

View File

@@ -243,6 +243,18 @@ static USHORT s_uiErrorLast = 0;
#define LARGE_MAX ( UINT_MAX - 1L )
#endif
#ifdef __WIN32__
#if !defined(__BORLANDC__)
extern int WintoDosError(DWORD dwError);
#else
extern int __IOerror(int dosErr);
extern int __NTerror (void);
#endif
HANDLE DostoWinHandle( FHANDLE fHandle);
#endif
/* Convert HARBOUR flags to IO subsystem flags */
#if defined(HB_FS_FILE_IO)
@@ -518,30 +530,55 @@ FHANDLE hb_fsOpen( BYTE * pFilename, USHORT uiFlags )
HANDLE hFile;
/* read & write flags */
if( uiFlags & FO_WRITE )
dwFlags |= GENERIC_WRITE;
switch( uiFlags & 3)
{
case FO_READWRITE :
dwFlags |= GENERIC_READ | GENERIC_WRITE;
break;
if( uiFlags & FO_READWRITE )
case FO_WRITE:
dwFlags |= GENERIC_WRITE;
break;
case FO_READ :
dwFlags |= GENERIC_READ;
break;
}
/* shared flags */
if( ( uiFlags & FO_DENYREAD ) == FO_DENYREAD )
dwShare = FILE_SHARE_WRITE;
switch (uiFlags & ( FO_DENYREAD | FO_DENYWRITE | FO_EXCLUSIVE | FO_DENYNONE ) )
{
case FO_DENYREAD :
else if( uiFlags & FO_DENYWRITE )
dwShare = FILE_SHARE_READ;
dwShare = FILE_SHARE_WRITE;
break;
else if( uiFlags & FO_EXCLUSIVE )
dwShare = 0;
case FO_DENYWRITE :
dwShare = FILE_SHARE_READ;
break;
case FO_EXCLUSIVE:
dwShare = 0;
break;
}
errno = 0;
hFile = ( HANDLE ) CreateFile( ( char * ) pFilename, dwFlags,
dwShare, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if( hFile == ( HANDLE ) INVALID_HANDLE_VALUE )
errno = GetLastError();
hFileHandle=(int)hFile;
#if !defined(__BORLANDC__)
errno=WintoDosError(GetLastError());
#else
__NTerror();
#endif
// errno = GetLastError();
hFileHandle=HandleToLong(hFile);
s_uiErrorLast = errno;
}
@@ -637,9 +674,9 @@ FHANDLE hb_fsCreate( BYTE * pFilename, USHORT uiAttr )
GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
dwFlags, NULL );
if( hFile == ( FHANDLE ) INVALID_HANDLE_VALUE )
if( hFile == ( HANDLE ) INVALID_HANDLE_VALUE )
errno = GetLastError();
hFileHandle=(int)hFile;
hFileHandle=HandleToLong(hFile);
s_uiErrorLast = errno;
}
@@ -718,7 +755,14 @@ void hb_fsClose( FHANDLE hFileHandle )
errno = 0;
#if defined(X__WIN32__)
CloseHandle( ( HANDLE ) hFileHandle );
if (!CloseHandle( DostoWinHandle (hFileHandle )))
#if !defined(__BORLANDC__)
errno=WintoDosError(GetLastError());
#else
__NTerror();
#endif
#else
close( hFileHandle );
#endif
@@ -790,13 +834,14 @@ USHORT hb_fsRead( FHANDLE hFileHandle, BYTE * pBuff, USHORT uiCount )
#if defined(X__WIN32__)
{
DWORD dwRead = 0;
BOOL bError;
bError=ReadFile( ( HANDLE ) hFileHandle, pBuff, uiCount, &dwRead, NULL );
DWORD dwRead ;
BOOL bError;
bError=ReadFile( DostoWinHandle(hFileHandle), pBuff, (DWORD)uiCount, &dwRead, NULL );
if (!bError)
errno = GetLastError();
uiRead = ( USHORT ) dwRead;
}
#else
uiRead = read( hFileHandle, pBuff, uiCount );
@@ -830,7 +875,7 @@ USHORT hb_fsWrite( FHANDLE hFileHandle, BYTE * pBuff, USHORT uiCount )
{
DWORD dwWritten = 0;
BOOL bError;
bError=WriteFile( ( HANDLE ) hFileHandle, pBuff, uiCount, &dwWritten, NULL );
bError=WriteFile( DostoWinHandle(hFileHandle), pBuff, uiCount, &dwWritten, NULL );
if (!bError)
errno = GetLastError();
uiWritten = ( USHORT ) dwWritten;
@@ -876,7 +921,7 @@ ULONG hb_fsReadLarge( FHANDLE hFileHandle, BYTE * pBuff, ULONG ulCount )
#if defined(X__WIN32__)
{
BOOL bError;
bError=ReadFile( ( HANDLE ) hFileHandle, pBuff, ulCount, &ulRead, NULL );
bError=ReadFile( DostoWinHandle(hFileHandle), pBuff, ulCount, &ulRead, NULL );
if (!bError)
errno = GetLastError();
}
@@ -949,9 +994,10 @@ ULONG hb_fsWriteLarge( FHANDLE hFileHandle, BYTE * pBuff, ULONG ulCount )
#if defined(X__WIN32__)
{
BOOL bError;
bError=WriteFile( ( HANDLE ) hFileHandle, pBuff, ulCount, &ulWritten, NULL );
bError=WriteFile( DostoWinHandle( hFileHandle), pBuff, ulCount, &ulWritten, NULL );
if (!bError)
errno = GetLastError();
}
#else
if( ulCount )
@@ -1051,8 +1097,8 @@ ULONG hb_fsSeek( FHANDLE hFileHandle, LONG lOffset, USHORT uiFlags )
errno = 0;
#if defined(X__WIN32__)
ulPos = SetFilePointer( ( HANDLE ) hFileHandle, 0, NULL, FILE_CURRENT );
if ((DWORD)ulPos = (DWORD)-1)
ulPos = SetFilePointer( DostoWinHandle(hFileHandle), 0, NULL, FILE_CURRENT );
if ((DWORD)ulPos == 0xFFFFFFFF)
errno=GetLastError();
#else
ulPos = lseek( hFileHandle, 0, SEEK_CUR );
@@ -1092,8 +1138,8 @@ ULONG hb_fsSeek( FHANDLE hFileHandle, LONG lOffset, USHORT uiFlags )
errno = 0;
#if defined(X__WIN32__)
ulPos = SetFilePointer( ( HANDLE ) hFileHandle, lOffset, NULL, (DWORD)Flags );
if ((DWORD)ulPos = (DWORD)-1)
ulPos = SetFilePointer( DostoWinHandle(hFileHandle), lOffset, NULL, (DWORD)Flags );
if ((DWORD)ulPos == 0xFFFFFFFF)
errno=GetLastError();
#else
@@ -1128,8 +1174,8 @@ ULONG hb_fsTell( FHANDLE hFileHandle )
errno = 0;
#if defined(X__WIN32__)
ulPos = SetFilePointer( ( HANDLE ) hFileHandle, 0, NULL, FILE_CURRENT );
if ((DWORD)ulPos = (DWORD)-1)
ulPos = SetFilePointer( DostoWinHandle(hFileHandle), 0, NULL, FILE_CURRENT );
if ((DWORD)ulPos == 0xFFFFFFFF)
errno=GetLastError();
#else
@@ -1169,8 +1215,13 @@ BOOL hb_fsDelete( BYTE * pFilename )
#if defined(HB_OS_WIN_32)
bResult = DeleteFile( ( char * ) pFilename );
s_uiErrorLast = ( USHORT ) GetLastError();
if ((bResult = DeleteFile( ( char * ) pFilename ))==0)
#if !defined(__BORLANDC__)
errno=WintoDosError(GetLastError());
#else
__NTerror();
#endif
s_uiErrorLast = errno;
#elif defined(HAVE_POSIX_IO)
@@ -1202,8 +1253,14 @@ BOOL hb_fsRename( BYTE * pOldName, BYTE * pNewName )
#if defined(HB_OS_WIN_32)
bResult = MoveFile( ( char * ) pOldName, ( char * ) pNewName );
s_uiErrorLast = ( USHORT ) GetLastError();
errno=0;
if ((bResult = MoveFile( ( char * ) pOldName, ( char * ) pNewName ))==0)
#if !defined(__BORLANDC__)
errno=WintoDosError(GetLastError());
#else
__NTerror();
#endif
s_uiErrorLast = errno;
#elif defined(HB_FS_FILE_IO)
@@ -1227,8 +1284,26 @@ BOOL hb_fsLock ( FHANDLE hFileHandle, ULONG ulStart,
BOOL bResult;
HB_TRACE(HB_TR_DEBUG, ("hb_fsLock(%p, %lu, %lu, %hu)", hFileHandle, ulStart, ulLength, uiMode));
#if defined(X__WIN32__)
{
errno = 0;
switch( uiMode )
{
case FL_LOCK:
bResult = ( LockFile( DostoWinHandle(hFileHandle), ulStart,0, ulLength,0 ) == 0 );
break;
#if defined(HB_OS_OS2)
case FL_UNLOCK:
bResult = ( UnlockFile( DostoWinHandle(hFileHandle), ulStart,0, ulLength,0 ) == 0 );
break;
default:
bResult = FALSE;
}
s_uiErrorLast = errno;
}
#elif defined(HB_OS_OS2)
{
struct _FILELOCK fl, ful;
@@ -1388,7 +1463,7 @@ void hb_fsCommit( FHANDLE hFileHandle )
#if defined(HB_OS_WIN_32)
FlushFileBuffers( ( HANDLE ) hFileHandle );
FlushFileBuffers( ( HANDLE ) DostoWinHandle(hFileHandle) );
s_uiErrorLast = ( USHORT ) GetLastError();
#elif defined(HB_OS_OS2)
@@ -1882,4 +1957,21 @@ BOOL hb_fsEof( FHANDLE hFileHandle )
#else
return eof( hFileHandle ) != 0;
#endif
}
}
#ifdef __WIN32__
HANDLE DostoWinHandle( FHANDLE fHandle)
{
HANDLE hHandle=LongToHandle(fHandle);
switch (fHandle)
{
case 0:
return GetStdHandle(STD_INPUT_HANDLE);
case 1:
return GetStdHandle(STD_OUTPUT_HANDLE);
case 2:
return GetStdHandle(STD_ERROR_HANDLE);
default :
return hHandle;
}
}
#endif