diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 22bd02b618..9714db3821 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,18 @@ 2002-12-01 23:12 UTC+0100 Foo Bar */ +2003-01-04 19:40 UTC-0300 Luiz Rafael Culik + * 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 * include/hbver.h * Updated the build number and the ChangeLog information. diff --git a/harbour/include/hbapifs.h b/harbour/include/hbapifs.h index 3f4a4922c1..159b2decb6 100644 --- a/harbour/include/hbapifs.h +++ b/harbour/include/hbapifs.h @@ -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 */ diff --git a/harbour/source/common/hbffind.c b/harbour/source/common/hbffind.c index 7fa2d2b0e7..49f0e6fc20 100644 --- a/harbour/source/common/hbffind.c +++ b/harbour/source/common/hbffind.c @@ -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; + } + } } diff --git a/harbour/source/rtl/console.c b/harbour/source/rtl/console.c index 38a9778d89..5fb2db6b6b 100644 --- a/harbour/source/rtl/console.c +++ b/harbour/source/rtl/console.c @@ -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(); } } diff --git a/harbour/source/rtl/filesys.c b/harbour/source/rtl/filesys.c index 16ea8a7909..33ecd528d7 100644 --- a/harbour/source/rtl/filesys.c +++ b/harbour/source/rtl/filesys.c @@ -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 -} \ No newline at end of file +} +#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