diff --git a/ChangeLog.txt b/ChangeLog.txt index 8230e2d8c4..68143c8da6 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,26 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2014-02-26 00:10 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * include/hbapifs.h + * src/rtl/filebuf.c + + added new C function hb_filePOpen() + + * include/hbset.h + * src/vm/set.c + * src/rtl/console.c + * changed hb_fs*() API to hb_file*() API in HVM SETs + + * src/vm/memvars.c + * changed hb_fs*() API to hb_file*() API in .mem files + + * src/vm/runner.c + * changed hb_fs*() API to hb_file*() API in .hrb files + + * include/hbapifs.h + * src/rtl/filesys.c + * renamed hb_fsPOpen() param + 2014-02-25 19:34 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * contrib/hbhpdf/3rd/libhpdf/hpdffdfj.c ! removed executable attribute diff --git a/include/hbapifs.h b/include/hbapifs.h index 00efe393b5..347b235596 100644 --- a/include/hbapifs.h +++ b/include/hbapifs.h @@ -174,7 +174,7 @@ extern HB_EXPORT HB_BOOL hb_fsTruncAt ( HB_FHANDLE hFileHandle, HB_FOFFSE extern HB_EXPORT HB_USHORT hb_fsWrite ( HB_FHANDLE hFileHandle, const void * pBuff, HB_USHORT uiCount ); /* write to an open file from a buffer (<=64K) */ extern HB_EXPORT HB_SIZE hb_fsWriteLarge ( HB_FHANDLE hFileHandle, const void * pBuff, HB_SIZE nCount ); /* write to an open file from a buffer (>64K) */ extern HB_EXPORT HB_SIZE hb_fsWriteAt ( HB_FHANDLE hFileHandle, const void * pBuff, HB_SIZE nCount, HB_FOFFSET nOffset ); /* write to an open file at given offset from a buffer (>64K) */ -extern HB_EXPORT HB_FHANDLE hb_fsPOpen ( const char * pszFileName, const char * pMode ); +extern HB_EXPORT HB_FHANDLE hb_fsPOpen ( const char * pszFileName, const char * pszMode ); extern HB_EXPORT HB_BOOL hb_fsPipeCreate ( HB_FHANDLE hPipe[ 2 ] ); extern HB_EXPORT HB_BOOL hb_fsPipeUnblock ( HB_FHANDLE hPipeHandle ); extern HB_EXPORT HB_SIZE hb_fsPipeIsData ( HB_FHANDLE hPipeHandle, HB_SIZE nBufferSize, HB_MAXINT nTimeOut ); @@ -404,6 +404,8 @@ extern HB_EXPORT PHB_FILE hb_fileCreateTempEx( char * pszName, const char * pszExt, HB_FATTR ulAttr ); +extern HB_EXPORT PHB_FILE hb_filePOpen( const char * pszFileName, const char * pszMode ); + /* wrapper to fopen() which calls hb_fsNameConv() */ extern HB_EXPORT FILE * hb_fopen( const char *path, const char *mode ); diff --git a/include/hbset.h b/include/hbset.h index 314014f831..53f2546876 100644 --- a/include/hbset.h +++ b/include/hbset.h @@ -144,9 +144,9 @@ typedef struct /* Lower case members are indirectly related to a SET */ HB_BOOL hb_set_century; HB_BOOL hb_set_prndevice; - HB_FHANDLE hb_set_althan; - HB_FHANDLE hb_set_extrahan; - HB_FHANDLE hb_set_printhan; + PHB_FILE hb_set_althan; + PHB_FILE hb_set_extrahan; + PHB_FILE hb_set_printhan; HB_PATHNAMES * hb_set_path; void * hb_set_oscp; void * hb_set_dbcp; @@ -263,10 +263,10 @@ extern HB_EXPORT HB_PATHNAMES * hb_setGetFirstSetPath( void ); extern HB_EXPORT HB_BOOL hb_setGetCentury( void ); extern HB_EXPORT HB_BOOL hb_setSetCentury( HB_BOOL ); -extern HB_EXPORT HB_FHANDLE hb_setGetAltHan( void ); -extern HB_EXPORT HB_FHANDLE hb_setGetExtraHan( void ); -extern HB_EXPORT HB_FHANDLE hb_setGetPrintHan( void ); -extern HB_EXPORT HB_FHANDLE hb_setGetPrinterHandle( int ); +extern HB_EXPORT PHB_FILE hb_setGetAltHan( void ); +extern HB_EXPORT PHB_FILE hb_setGetExtraHan( void ); +extern HB_EXPORT PHB_FILE hb_setGetPrintHan( void ); +extern HB_EXPORT PHB_FILE hb_setGetPrinterHandle( int ); extern HB_EXPORT HB_BOOL hb_setGetAlternate( void ); extern HB_EXPORT const char * hb_setGetAltFile( void ); extern HB_EXPORT HB_BOOL hb_setGetAutOpen( void ); diff --git a/src/rtl/console.c b/src/rtl/console.c index f8362db179..637e8d55cd 100644 --- a/src/rtl/console.c +++ b/src/rtl/console.c @@ -241,29 +241,29 @@ void hb_conOutErr( const char * szStr, HB_SIZE nLen ) /* Output an item to the screen and/or printer and/or alternate */ void hb_conOutAlt( const char * szStr, HB_SIZE nLen ) { - HB_FHANDLE hFile; + PHB_FILE pFile; HB_TRACE( HB_TR_DEBUG, ( "hb_conOutAlt(%s, %" HB_PFS "u)", szStr, nLen ) ); if( hb_setGetConsole() ) hb_gtWriteCon( szStr, nLen ); - if( hb_setGetAlternate() && ( hFile = hb_setGetAltHan() ) != FS_ERROR ) + if( hb_setGetAlternate() && ( pFile = hb_setGetAltHan() ) != NULL ) { /* Print to alternate file if SET ALTERNATE ON and valid alternate file */ - hb_fsWriteLarge( hFile, szStr, nLen ); + hb_fileWrite( pFile, szStr, nLen, -1 ); } - if( ( hFile = hb_setGetExtraHan() ) != FS_ERROR ) + if( ( pFile = hb_setGetExtraHan() ) != NULL ) { /* Print to extra file if valid alternate file */ - hb_fsWriteLarge( hFile, szStr, nLen ); + hb_fileWrite( pFile, szStr, nLen, -1 ); } - if( ( hFile = hb_setGetPrinterHandle( HB_SET_PRN_CON ) ) != FS_ERROR ) + if( ( pFile = hb_setGetPrinterHandle( HB_SET_PRN_CON ) ) != NULL ) { /* Print to printer if SET PRINTER ON and valid printer file */ - hb_fsWriteLarge( hFile, szStr, nLen ); + hb_fileWrite( pFile, szStr, nLen, -1 ); hb_prnPos()->col += ( int ) nLen; } } @@ -271,14 +271,14 @@ void hb_conOutAlt( const char * szStr, HB_SIZE nLen ) /* Output an item to the screen and/or printer */ static void hb_conOutDev( const char * szStr, HB_SIZE nLen ) { - HB_FHANDLE hFile; + PHB_FILE pFile; HB_TRACE( HB_TR_DEBUG, ( "hb_conOutDev(%s, %" HB_PFS "u)", szStr, nLen ) ); - if( ( hFile = hb_setGetPrinterHandle( HB_SET_PRN_DEV ) ) != FS_ERROR ) + if( ( pFile = hb_setGetPrinterHandle( HB_SET_PRN_DEV ) ) != NULL ) { /* Display to printer if SET DEVICE TO PRINTER and valid printer file */ - hb_fsWriteLarge( hFile, szStr, nLen ); + hb_fileWrite( pFile, szStr, nLen, -1 ); hb_prnPos()->col += ( int ) nLen; } else @@ -361,11 +361,11 @@ HB_FUNC( QQOUT ) /* writes a list of values to the current device (screen or pri HB_FUNC( QOUT ) { - HB_FHANDLE hFile; + PHB_FILE pFile; hb_conOutAlt( s_szCrLf, s_iCrLfLen ); - if( ( hFile = hb_setGetPrinterHandle( HB_SET_PRN_CON ) ) != FS_ERROR ) + if( ( pFile = hb_setGetPrinterHandle( HB_SET_PRN_CON ) ) != NULL ) { char buf[ 256 ]; PHB_PRNPOS pPrnPos = hb_prnPos(); @@ -379,13 +379,13 @@ HB_FUNC( QOUT ) { char * pBuf = ( char * ) hb_xgrab( pPrnPos->col ); memset( pBuf, ' ', pPrnPos->col ); - hb_fsWrite( hFile, pBuf, ( HB_USHORT ) pPrnPos->col ); + hb_fileWrite( pFile, pBuf, ( HB_USHORT ) pPrnPos->col, -1 ); hb_xfree( pBuf ); } else { memset( buf, ' ', pPrnPos->col ); - hb_fsWrite( hFile, buf, ( HB_USHORT ) pPrnPos->col ); + hb_fileWrite( pFile, buf, ( HB_USHORT ) pPrnPos->col, -1 ); } } } @@ -396,12 +396,12 @@ HB_FUNC( QOUT ) HB_FUNC( __EJECT ) /* Ejects the current page from the printer */ { PHB_PRNPOS pPrnPos; - HB_FHANDLE hFile; + PHB_FILE pFile; - if( ( hFile = hb_setGetPrinterHandle( HB_SET_PRN_ANY ) ) != FS_ERROR ) + if( ( pFile = hb_setGetPrinterHandle( HB_SET_PRN_ANY ) ) != NULL ) { static const char s_szEop[ 4 ] = { 0x0C, 0x0D, 0x00, 0x00 }; /* Buffer is 4 bytes to make CodeGuard happy */ - hb_fsWrite( hFile, s_szEop, 2 ); + hb_fileWrite( pFile, s_szEop, 2, -1 ); } pPrnPos = hb_prnPos(); @@ -420,14 +420,14 @@ HB_FUNC( PCOL ) /* Returns the current printer row position */ static void hb_conDevPos( int iRow, int iCol ) { - HB_FHANDLE hFile; + PHB_FILE pFile; HB_TRACE( HB_TR_DEBUG, ( "hb_conDevPos(%d, %d)", iRow, iCol ) ); /* Position printer if SET DEVICE TO PRINTER and valid printer file otherwise position console */ - if( ( hFile = hb_setGetPrinterHandle( HB_SET_PRN_DEV ) ) != FS_ERROR ) + if( ( pFile = hb_setGetPrinterHandle( HB_SET_PRN_DEV ) ) != NULL ) { int iPRow = iRow; int iPCol = iCol + hb_setGetMargin(); @@ -456,7 +456,7 @@ static void hb_conDevPos( int iRow, int iCol ) { if( iPtr + s_iCrLfLen > ( int ) sizeof( buf ) ) { - hb_fsWrite( hFile, buf, ( HB_USHORT ) iPtr ); + hb_fileWrite( pFile, buf, ( HB_USHORT ) iPtr, -1 ); iPtr = 0; } memcpy( &buf[ iPtr ], s_szCrLf, s_iCrLfLen ); @@ -475,7 +475,7 @@ static void hb_conDevPos( int iRow, int iCol ) { if( iPtr == ( int ) sizeof( buf ) ) { - hb_fsWrite( hFile, buf, ( HB_USHORT ) iPtr ); + hb_fileWrite( pFile, buf, ( HB_USHORT ) iPtr, -1 ); iPtr = 0; } buf[ iPtr++ ] = ' '; @@ -483,7 +483,7 @@ static void hb_conDevPos( int iRow, int iCol ) } if( iPtr ) - hb_fsWrite( hFile, buf, ( HB_USHORT ) iPtr ); + hb_fileWrite( pFile, buf, ( HB_USHORT ) iPtr, -1 ); } } else diff --git a/src/rtl/filebuf.c b/src/rtl/filebuf.c index 9874d4d0c8..8cc9a9ab09 100644 --- a/src/rtl/filebuf.c +++ b/src/rtl/filebuf.c @@ -1222,3 +1222,15 @@ PHB_FILE hb_fileCreateTempEx( char * pszName, return pFile; } + +PHB_FILE hb_filePOpen( const char * pszFileName, const char * pszMode ) +{ + PHB_FILE pFile = NULL; + HB_FHANDLE hFile; + + hFile = hb_fsPOpen( pszFileName, pszMode ); + if( hFile != FS_ERROR ) + pFile = hb_fileNew( hFile, HB_FALSE, HB_FALSE, 0, 0, HB_FALSE ); + + return pFile; +} diff --git a/src/rtl/filesys.c b/src/rtl/filesys.c index 7dbaa80b6e..7896dc0d74 100644 --- a/src/rtl/filesys.c +++ b/src/rtl/filesys.c @@ -632,11 +632,11 @@ HB_FHANDLE hb_fsGetOsHandle( HB_FHANDLE hFileHandle ) #endif } -HB_FHANDLE hb_fsPOpen( const char * pszFileName, const char * pMode ) +HB_FHANDLE hb_fsPOpen( const char * pszFileName, const char * pszMode ) { HB_FHANDLE hFileHandle = FS_ERROR; - HB_TRACE( HB_TR_DEBUG, ( "hb_fsPOpen(%p, %s)", pszFileName, pMode ) ); + HB_TRACE( HB_TR_DEBUG, ( "hb_fsPOpen(%p, %s)", pszFileName, pszMode ) ); #if defined( HB_OS_UNIX ) && ! defined( HB_OS_VXWORKS ) && ! defined( HB_OS_SYMBIAN ) { @@ -648,8 +648,8 @@ HB_FHANDLE hb_fsPOpen( const char * pszFileName, const char * pMode ) int iMaxFD, iResult; nLen = strlen( pszFileName ); - if( pMode && ( *pMode == 'r' || *pMode == 'w' ) ) - fRead = ( *pMode == 'r' ); + if( pszMode && ( *pszMode == 'r' || *pszMode == 'w' ) ) + fRead = ( *pszMode == 'r' ); else { if( pszFileName[ 0 ] == '|' ) @@ -744,7 +744,7 @@ HB_FHANDLE hb_fsPOpen( const char * pszFileName, const char * pMode ) #else HB_SYMBOL_UNUSED( pszFileName ); - HB_SYMBOL_UNUSED( pMode ); + HB_SYMBOL_UNUSED( pszMode ); hb_fsSetError( ( HB_ERRCODE ) FS_ERROR ); diff --git a/src/vm/memvars.c b/src/vm/memvars.c index 4d88828780..6a085febcb 100644 --- a/src/vm/memvars.c +++ b/src/vm/memvars.c @@ -1341,7 +1341,7 @@ typedef struct const char * pszMask; HB_BOOL bIncludeMask; HB_BYTE * buffer; - HB_FHANDLE fhnd; + PHB_FILE fhnd; } MEMVARSAVE_CARGO; /* saves a variable to a mem file already open */ @@ -1350,8 +1350,8 @@ static HB_DYNS_FUNC( hb_memvarSave ) { const char * pszMask = ( ( MEMVARSAVE_CARGO * ) Cargo )->pszMask; HB_BOOL bIncludeMask = ( ( MEMVARSAVE_CARGO * ) Cargo )->bIncludeMask; - HB_BYTE * buffer = ( ( MEMVARSAVE_CARGO * ) Cargo )->buffer; - HB_FHANDLE fhnd = ( ( MEMVARSAVE_CARGO * ) Cargo )->fhnd; + HB_BYTE * buffer = ( ( MEMVARSAVE_CARGO * ) Cargo )->buffer; + PHB_FILE fhnd = ( ( MEMVARSAVE_CARGO * ) Cargo )->fhnd; PHB_ITEM pMemvar; /* NOTE: Harbour name lengths are not limited, but the .mem file @@ -1387,10 +1387,10 @@ static HB_DYNS_FUNC( hb_memvarSave ) } buffer[ 11 ] = 'C' + 128; HB_PUT_LE_UINT16( &buffer[ 16 ], nLen ); - hb_fsWrite( fhnd, buffer, HB_MEM_REC_LEN ); - hb_fsWriteLarge( fhnd, hb_itemGetCPtr( pMemvar ), nLen - iOverFlow ); + hb_fileWrite( fhnd, buffer, HB_MEM_REC_LEN, -1 ); + hb_fileWrite( fhnd, hb_itemGetCPtr( pMemvar ), nLen - iOverFlow, -1 ); if( iOverFlow ) - hb_fsWrite( fhnd, "\0", 1 ); + hb_fileWrite( fhnd, "\0", 1, -1 ); } else if( HB_IS_NUMERIC( pMemvar ) ) { @@ -1410,7 +1410,7 @@ static HB_DYNS_FUNC( hb_memvarSave ) #endif buffer[ 17 ] = ( HB_BYTE ) iDec; HB_PUT_LE_DOUBLE( &buffer[ HB_MEM_REC_LEN ], dNumber ); - hb_fsWrite( fhnd, buffer, HB_MEM_REC_LEN + HB_MEM_NUM_LEN ); + hb_fileWrite( fhnd, buffer, HB_MEM_REC_LEN + HB_MEM_NUM_LEN, -1 ); } else if( HB_IS_DATE( pMemvar ) ) { @@ -1420,7 +1420,7 @@ static HB_DYNS_FUNC( hb_memvarSave ) buffer[ 16 ] = 1; buffer[ 17 ] = 0; HB_PUT_LE_DOUBLE( &buffer[ HB_MEM_REC_LEN ], dNumber ); - hb_fsWrite( fhnd, buffer, HB_MEM_REC_LEN + HB_MEM_NUM_LEN ); + hb_fileWrite( fhnd, buffer, HB_MEM_REC_LEN + HB_MEM_NUM_LEN, -1 ); } else if( HB_IS_TIMESTAMP( pMemvar ) ) { @@ -1430,7 +1430,7 @@ static HB_DYNS_FUNC( hb_memvarSave ) buffer[ 16 ] = 1; buffer[ 17 ] = 0; HB_PUT_LE_DOUBLE( &buffer[ HB_MEM_REC_LEN ], dNumber ); - hb_fsWrite( fhnd, buffer, HB_MEM_REC_LEN + HB_MEM_NUM_LEN ); + hb_fileWrite( fhnd, buffer, HB_MEM_REC_LEN + HB_MEM_NUM_LEN, -1 ); } else if( HB_IS_LOGICAL( pMemvar ) ) { @@ -1438,7 +1438,7 @@ static HB_DYNS_FUNC( hb_memvarSave ) buffer[ 16 ] = 1; buffer[ 17 ] = 0; buffer[ HB_MEM_REC_LEN ] = hb_itemGetL( pMemvar ) ? 1 : 0; - hb_fsWrite( fhnd, buffer, HB_MEM_REC_LEN + 1 ); + hb_fileWrite( fhnd, buffer, HB_MEM_REC_LEN + 1, -1 ); } } } @@ -1452,41 +1452,28 @@ HB_FUNC( __MVSAVE ) /* Clipper also checks for the number of arguments here */ if( hb_pcount() == 3 && HB_ISCHAR( 1 ) && HB_ISCHAR( 2 ) && HB_ISLOG( 3 ) ) { + const char * pszFileName = hb_parc( 1 ); PHB_ITEM pError = NULL; - PHB_FNAME pFileName; - char szFileName[ HB_PATH_MAX ]; - HB_FHANDLE fhnd; - - /* Generate filename */ - - pFileName = hb_fsFNameSplit( hb_parc( 1 ) ); - - if( pFileName->szExtension == NULL && hb_stackSetStruct()->HB_SET_DEFEXTENSIONS ) - pFileName->szExtension = ".mem"; - - if( ! pFileName->szPath ) - pFileName->szPath = hb_stackSetStruct()->HB_SET_DEFAULT; - - hb_fsFNameMerge( szFileName, pFileName ); - hb_xfree( pFileName ); + PHB_FILE fhnd; /* Create .mem file */ do { - fhnd = hb_fsExtOpen( szFileName, NULL, - FXO_TRUNCATE | FO_READWRITE | FO_EXCLUSIVE | - FXO_DEFAULTS | FXO_SHARELOCK, - NULL, pError ); - if( fhnd == FS_ERROR ) + fhnd = hb_fileExtOpen( pszFileName, + hb_stackSetStruct()->HB_SET_DEFEXTENSIONS ? ".mem" : NULL, + FXO_TRUNCATE | FO_READWRITE | FO_EXCLUSIVE | + FXO_DEFAULTS | FXO_SHARELOCK, + NULL, pError ); + if( fhnd == NULL ) { - pError = hb_errRT_FileError( pError, NULL, EG_CREATE, 2006, szFileName ); + pError = hb_errRT_FileError( pError, NULL, EG_CREATE, 2006, pszFileName ); if( hb_errLaunch( pError ) != E_RETRY ) break; } } - while( fhnd == FS_ERROR ); + while( fhnd == NULL ); - if( fhnd != FS_ERROR ) + if( fhnd != NULL ) { HB_BYTE buffer[ HB_MEM_REC_LEN + HB_MEM_NUM_LEN ]; MEMVARSAVE_CARGO msc; @@ -1501,16 +1488,16 @@ HB_FUNC( __MVSAVE ) hb_dynsymEval( hb_memvarSave, ( void * ) &msc ); buffer[ 0 ] = '\x1A'; - hb_fsWrite( fhnd, buffer, 1 ); + hb_fileWrite( fhnd, buffer, 1, -1 ); /* NOTE: Here, we're not CA-Cl*pper compatible by default settings. [vszakats] */ #ifndef HB_CLP_STRICT if( hb_setGetHardCommit() ) - hb_fsCommit( fhnd ); + hb_fileCommit( fhnd ); #endif - hb_fsClose( fhnd ); + hb_fileClose( fhnd ); } if( pError ) @@ -1536,10 +1523,9 @@ HB_FUNC( __MVRESTORE ) #endif { HB_STACK_TLS_PRELOAD + const char * pszFileName = hb_parc( 1 ); PHB_ITEM pError = NULL; - PHB_FNAME pFileName; - char szFileName[ HB_PATH_MAX ]; - HB_FHANDLE fhnd; + PHB_FILE fhnd; HB_BOOL bAdditive = hb_parl( 2 ); @@ -1548,35 +1534,23 @@ HB_FUNC( __MVRESTORE ) if( ! bAdditive ) hb_memvarsClear( HB_FALSE ); - /* Generate filename */ - - pFileName = hb_fsFNameSplit( hb_parc( 1 ) ); - - if( pFileName->szExtension == NULL && hb_stackSetStruct()->HB_SET_DEFEXTENSIONS ) - pFileName->szExtension = ".mem"; - - if( ! pFileName->szPath ) - pFileName->szPath = hb_stackSetStruct()->HB_SET_DEFAULT; - - hb_fsFNameMerge( szFileName, pFileName ); - hb_xfree( pFileName ); - /* Open .mem file */ do { - fhnd = hb_fsExtOpen( szFileName, NULL, - FO_READ | FXO_DEFAULTS | FXO_SHARELOCK, - NULL, pError ); - if( fhnd == FS_ERROR ) + fhnd = hb_fileExtOpen( pszFileName, + hb_stackSetStruct()->HB_SET_DEFEXTENSIONS ? ".mem" : NULL, + FO_READ | FXO_DEFAULTS | FXO_SHARELOCK, + NULL, pError ); + if( fhnd == NULL ) { - pError = hb_errRT_FileError( pError, NULL, EG_OPEN, 2005, szFileName ); + pError = hb_errRT_FileError( pError, NULL, EG_OPEN, 2005, pszFileName ); if( hb_errLaunch( pError ) != E_RETRY ) break; } } - while( fhnd == FS_ERROR ); + while( fhnd == NULL ); - if( fhnd != FS_ERROR ) + if( fhnd != NULL ) { HB_BOOL bIncludeMask; HB_BYTE buffer[ HB_MEM_REC_LEN ]; @@ -1592,7 +1566,7 @@ HB_FUNC( __MVRESTORE ) bIncludeMask = hb_parldef( 4, 1 ); #endif - while( hb_fsRead( fhnd, buffer, HB_MEM_REC_LEN ) == HB_MEM_REC_LEN ) + while( hb_fileRead( fhnd, buffer, HB_MEM_REC_LEN, -1 ) == HB_MEM_REC_LEN ) { /* FoxPro does not add 128 to item type: 'N', 'C', 'D', 'L' * CA-Cl*pper respects it and read such files so we also should. @@ -1614,7 +1588,7 @@ HB_FUNC( __MVRESTORE ) uiWidth += uiDec * 256; pbyString = ( HB_BYTE * ) hb_xgrab( uiWidth ); - if( hb_fsRead( fhnd, pbyString, uiWidth ) == uiWidth ) + if( hb_fileRead( fhnd, pbyString, uiWidth, -1 ) == uiWidth ) pItem = hb_itemPutCLPtr( pItem, ( char * ) pbyString, uiWidth - 1 ); else { @@ -1629,7 +1603,7 @@ HB_FUNC( __MVRESTORE ) { HB_BYTE pbyNumber[ HB_MEM_NUM_LEN ]; - if( hb_fsRead( fhnd, pbyNumber, HB_MEM_NUM_LEN ) == HB_MEM_NUM_LEN ) + if( hb_fileRead( fhnd, pbyNumber, HB_MEM_NUM_LEN, -1 ) == HB_MEM_NUM_LEN ) pItem = hb_itemPutNLen( pItem, HB_GET_LE_DOUBLE( pbyNumber ), uiWidth - ( uiDec ? ( uiDec + 1 ) : 0 ), uiDec ); else szName = NULL; @@ -1641,7 +1615,7 @@ HB_FUNC( __MVRESTORE ) { HB_BYTE pbyNumber[ HB_MEM_NUM_LEN ]; - if( hb_fsRead( fhnd, pbyNumber, HB_MEM_NUM_LEN ) == HB_MEM_NUM_LEN ) + if( hb_fileRead( fhnd, pbyNumber, HB_MEM_NUM_LEN, -1 ) == HB_MEM_NUM_LEN ) pItem = hb_itemPutDL( pItem, ( long ) HB_GET_LE_DOUBLE( pbyNumber ) ); else szName = NULL; @@ -1653,7 +1627,7 @@ HB_FUNC( __MVRESTORE ) { HB_BYTE pbyNumber[ HB_MEM_NUM_LEN ]; - if( hb_fsRead( fhnd, pbyNumber, HB_MEM_NUM_LEN ) == HB_MEM_NUM_LEN ) + if( hb_fileRead( fhnd, pbyNumber, HB_MEM_NUM_LEN, -1 ) == HB_MEM_NUM_LEN ) pItem = hb_itemPutTD( pItem, HB_GET_LE_DOUBLE( pbyNumber ) ); else szName = NULL; @@ -1665,7 +1639,7 @@ HB_FUNC( __MVRESTORE ) { HB_BYTE pbyLogical[ 1 ]; - if( hb_fsRead( fhnd, pbyLogical, 1 ) == 1 ) + if( hb_fileRead( fhnd, pbyLogical, 1, -1 ) == 1 ) pItem = hb_itemPutL( pItem, pbyLogical[ 0 ] != 0 ); else szName = NULL; @@ -1697,7 +1671,7 @@ HB_FUNC( __MVRESTORE ) } } - hb_fsClose( fhnd ); + hb_fileClose( fhnd ); hb_memvarUpdatePrivatesBase(); hb_itemReturnRelease( pItem ); } diff --git a/src/vm/runner.c b/src/vm/runner.c index 30016c5a5a..943087d6fa 100644 --- a/src/vm/runner.c +++ b/src/vm/runner.c @@ -581,49 +581,44 @@ static PHRB_BODY hb_hrbLoad( const char * szHrbBody, HB_SIZE nBodySize, HB_USHOR static PHRB_BODY hb_hrbLoadFromFile( const char * szHrb, HB_USHORT usMode ) { - char szFileName[ HB_PATH_MAX ]; PHRB_BODY pHrbBody = NULL; - PHB_FNAME pFileName; - HB_FHANDLE hFile; - - /* Create full filename */ - - pFileName = hb_fsFNameSplit( szHrb ); - if( pFileName->szExtension == NULL && hb_stackSetStruct()->HB_SET_DEFEXTENSIONS ) - { - pFileName->szExtension = ".hrb"; - } - hb_fsFNameMerge( szFileName, pFileName ); - hb_xfree( pFileName ); + PHB_ITEM pError = NULL; + PHB_FILE pFile; /* Open as binary */ - do { - hFile = hb_fsOpen( szFileName, FO_READ ); + pFile = hb_fileExtOpen( szHrb, + hb_stackSetStruct()->HB_SET_DEFEXTENSIONS ? ".hrb" : NULL, + FO_READ | FXO_SHARELOCK, NULL, pError ); + if( pFile == NULL ) + { + pError = hb_errRT_FileError( pError, NULL, EG_OPEN, 6102, szHrb ); + if( hb_errLaunch( pError ) != E_RETRY ) + break; + } } - while( hFile == FS_ERROR && - hb_errRT_BASE_Ext1( EG_OPEN, 6102, NULL, szFileName, hb_fsError(), - EF_CANDEFAULT | EF_CANRETRY, - HB_ERR_ARGS_BASEPARAMS ) == E_RETRY ); + while( pFile == NULL ); - if( hFile != FS_ERROR ) + if( pError ) + hb_itemRelease( pError ); + + if( pFile != NULL ) { - HB_SIZE nBodySize = hb_fsSeek( hFile, 0, FS_END ); + HB_SIZE nBodySize = hb_fileSize( pFile ); if( nBodySize ) { char * pbyBuffer; pbyBuffer = ( char * ) hb_xgrab( nBodySize + sizeof( char ) + 1 ); - hb_fsSeek( hFile, 0, FS_SET ); - hb_fsReadLarge( hFile, pbyBuffer, nBodySize ); + hb_fileReadAt( pFile, pbyBuffer, nBodySize, 0 ); pbyBuffer[ nBodySize ] = '\0'; - pHrbBody = hb_hrbLoad( ( const char * ) pbyBuffer, nBodySize, usMode, szFileName ); + pHrbBody = hb_hrbLoad( ( const char * ) pbyBuffer, nBodySize, usMode, szHrb ); hb_xfree( pbyBuffer ); } - hb_fsClose( hFile ); + hb_fileClose( pFile ); } return pHrbBody; diff --git a/src/vm/set.c b/src/vm/set.c index 0e1340c635..3690e67395 100644 --- a/src/vm/set.c +++ b/src/vm/set.c @@ -167,7 +167,7 @@ static char * set_string( PHB_ITEM pItem, char * szOldString ) static void close_handle( PHB_SET_STRUCT pSet, HB_set_enum set_specifier ) { - HB_FHANDLE * handle_ptr; + PHB_FILE * handle_ptr; HB_TRACE( HB_TR_DEBUG, ( "close_handle(%p,%d)", pSet, ( int ) set_specifier ) ); @@ -186,57 +186,72 @@ static void close_handle( PHB_SET_STRUCT pSet, HB_set_enum set_specifier ) return; } - if( *handle_ptr != FS_ERROR ) + if( *handle_ptr != NULL ) { if( set_specifier != HB_SET_PRINTFILE && pSet->HB_SET_EOF ) - hb_fsWrite( *handle_ptr, "\x1A", 1 ); - hb_fsClose( *handle_ptr ); - *handle_ptr = FS_ERROR; + hb_fileWrite( *handle_ptr, "\x1A", 1, -1 ); + hb_fileClose( *handle_ptr ); + *handle_ptr = NULL; } } -static HB_BOOL is_devicename( const char * szFileName ) +static const char * is_devicename( const char * szFileName ) { if( szFileName && *szFileName ) { #if defined( HB_OS_OS2 ) || defined( HB_OS_WIN ) || defined( HB_OS_DOS ) - int iLen = ( int ) strlen( szFileName ); - if( ( iLen == 3 && - ( hb_stricmp( szFileName, "PRN" ) == 0 || - hb_stricmp( szFileName, "CON" ) == 0 ) ) || - ( iLen == 4 && - ( ( hb_strnicmp( szFileName, "LPT", 3 ) == 0 && - szFileName[ 3 ] >= '1' && szFileName[ 3 ] <= '3' ) || - ( hb_strnicmp( szFileName, "COM", 3 ) == 0 && - szFileName[ 3 ] >= '1' && szFileName[ 3 ] <= '9' ) ) ) ) + const char * szDevices[] = + { "PRN", "CON", "LPT1", "LPT2", "LPT3", + "COM1", "COM2", "COM3", "COM4", "COM5", + "COM6", "COM7", "COM8", "COM9" }; + int iLen = ( int ) strlen( szFileName ), iFrom, iTo; + + if( iLen >= 3 && iLen <= 4 ) { - return HB_TRUE; + if( iLen == 3 ) + { + iFrom = 0; + iTo = 0; + } + else + { + iFrom = 2; + iTo = HB_SIZEOFARRAY( szDevices ); + } + for( ; iFrom < iTo; ++iFrom ) + { + if( hb_stricmp( szFileName, szDevices[ iFrom ] ) == 0 ) + return szDevices[ iFrom ]; + } } #elif defined( HB_OS_UNIX ) if( strncmp( szFileName, "/dev/", 5 ) == 0 ) - return HB_TRUE; + return szFileName; else { HB_FATTR ulAttr = 0; if( hb_fsGetAttr( szFileName, &ulAttr ) ) { if( ulAttr & ( HB_FA_CHRDEVICE | HB_FA_BLKDEVICE | HB_FA_FIFO | HB_FA_SOCKET ) ) - return HB_TRUE; + return szFileName; } } #endif } - return HB_FALSE; + return NULL; } static void open_handle( PHB_SET_STRUCT pSet, const char * file_name, HB_BOOL bAppend, HB_set_enum set_specifier ) { + HB_STACK_TLS_PRELOAD PHB_ITEM pError = NULL; - HB_FHANDLE handle, * handle_ptr; + PHB_FILE handle, * handle_ptr; HB_ERRCODE uiError; - char * szFileName = NULL, ** set_value; + const char * szDevice = NULL; + const char * szFileName = NULL; const char * def_ext; + char ** set_value; HB_BOOL bPipe = HB_FALSE; HB_TRACE( HB_TR_DEBUG, ( "open_handle(%p, %s, %d, %d)", pSet, file_name, ( int ) bAppend, ( int ) set_specifier ) ); @@ -269,37 +284,24 @@ static void open_handle( PHB_SET_STRUCT pSet, const char * file_name, if( file_name && file_name[ 0 ] != '\0' ) { - /* Create full filename */ #if defined( HB_OS_UNIX ) bPipe = file_name[ 0 ] == '|'; if( bPipe ) { - szFileName = hb_strdup( file_name ); + szFileName = file_name; bAppend = HB_FALSE; } + else #endif - if( ! bPipe ) { - char path[ HB_PATH_MAX ]; - PHB_FNAME pFilename = hb_fsFNameSplit( file_name ); - - if( is_devicename( file_name ) ) + szDevice = is_devicename( file_name ); + if( szDevice ) { -#if defined( HB_OS_OS2 ) || defined( HB_OS_WIN ) || defined( HB_OS_DOS ) - hb_strupr( ( char * ) pFilename->szName ); -#endif + szFileName = szDevice; + def_ext = NULL; } else - { - if( pFilename->szExtension == NULL && def_ext && pSet->HB_SET_DEFEXTENSIONS ) - pFilename->szExtension = def_ext; - - if( pFilename->szPath == NULL && pSet->HB_SET_DEFAULT ) - pFilename->szPath = pSet->HB_SET_DEFAULT; - } - hb_fsFNameMerge( path, pFilename ); - hb_xfree( pFilename ); - szFileName = hb_strdup( path ); + szFileName = file_name; } } @@ -318,74 +320,58 @@ static void open_handle( PHB_SET_STRUCT pSet, const char * file_name, /* QUESTION: What sharing mode does Clipper use ? [vszakats] */ - handle = FS_ERROR; - while( handle == FS_ERROR ) + handle = NULL; + do { if( bPipe ) - handle = hb_fsPOpen( szFileName + 1, "w" ); + { + handle = hb_filePOpen( szFileName + 1, "w" ); + } else { - HB_BOOL bCreate = HB_FALSE; + handle = hb_fileExtOpen( szFileName, + hb_stackSetStruct()->HB_SET_DEFEXTENSIONS ? def_ext : NULL, + FO_READWRITE | FO_READWRITE | FXO_SHARELOCK | + ( bAppend ? 0 : FXO_TRUNCATE ) | + ( szDevice ? 0 : FXO_DEFAULTS ), + NULL, pError ); - if( bAppend ) /* Append mode */ + if( handle != NULL && szDevice == NULL && bAppend ) { - if( hb_fsFileExists( szFileName ) ) + /* Position to EOF */ + /* Special binary vs. text file handling - even for UN*X, now + that there's an HB_SET_EOF flag. */ + if( set_specifier == HB_SET_PRINTFILE ) { - /* If the file already exists, open it (in read-write mode, in - case of non-Unix and text modes). */ - handle = hb_fsOpen( szFileName, FO_READWRITE | FO_DENYWRITE ); - if( handle != FS_ERROR ) - { - /* Position to EOF */ - /* Special binary vs. text file handling - even for UN*X, now - that there's an HB_SET_EOF flag. */ - if( set_specifier == HB_SET_PRINTFILE ) - { - /* PRINTFILE is always binary and needs no special handling. */ - hb_fsSeek( handle, 0, FS_END ); - } - else - { - /* All other files are text files and may have an EOF - ('\x1A') character at the end (both UN*X and non-UN*X, - now that theres an HB_SET_EOF flag). */ - char cEOF = '\0'; - hb_fsSeek( handle, -1, FS_END ); /* Position to last char. */ - hb_fsRead( handle, &cEOF, 1 ); /* Read the last char. */ - if( cEOF == '\x1A' ) /* If it's an EOF, */ - { - hb_fsSeek( handle, -1, FS_END ); /* Then write over it. */ - } - } - } + /* PRINTFILE is always binary and needs no special handling. */ + hb_fileSeek( handle, 0, FS_END ); } else - bCreate = HB_TRUE; /* Otherwise create a new file. */ + { + /* All other files are text files and may have an EOF + ('\x1A') character at the end (both UN*X and non-UN*X, + now that theres an HB_SET_EOF flag). */ + char cEOF = '\0'; + hb_fileSeek( handle, -1, FS_END ); /* Position to last char. */ + hb_fileRead( handle, &cEOF, 1, -1 ); /* Read the last char. */ + if( cEOF == '\x1A' ) /* If it's an EOF, */ + hb_fileSeek( handle, -1, FS_END ); /* Then write over it. */ + } } - else - bCreate = HB_TRUE; /* Always create a new file for overwrite mode. */ - - if( bCreate ) - handle = hb_fsCreate( szFileName, FC_NORMAL ); } - if( handle == FS_ERROR ) + if( handle == NULL ) { pError = hb_errRT_FileError( pError, HB_ERR_SS_TERMINAL, EG_CREATE, uiError, szFileName ); if( hb_errLaunch( pError ) != E_RETRY ) break; } } + while( handle == NULL ); if( pError ) hb_itemRelease( pError ); - if( handle == FS_ERROR ) - { - hb_xfree( szFileName ); - szFileName = NULL; - } - /* user RT error handler can open it too so we have to * close it again if necessary */ @@ -393,7 +379,7 @@ static void open_handle( PHB_SET_STRUCT pSet, const char * file_name, *handle_ptr = handle; if( *set_value ) hb_xfree( *set_value ); - *set_value = szFileName; + *set_value = handle != NULL ? hb_strdup( szFileName ) : NULL; } HB_BOOL hb_setSetCentury( HB_BOOL new_century_setting ) @@ -1058,7 +1044,7 @@ void hb_setInitialize( PHB_SET_STRUCT pSet ) pSet->HB_SET_ALTERNATE = HB_FALSE; pSet->HB_SET_ALTFILE = NULL; - pSet->hb_set_althan = FS_ERROR; + pSet->hb_set_althan = NULL; pSet->HB_SET_AUTOPEN = HB_TRUE; pSet->HB_SET_AUTORDER = 0; pSet->HB_SET_AUTOSHARE = 0; @@ -1103,7 +1089,7 @@ void hb_setInitialize( PHB_SET_STRUCT pSet ) pSet->HB_SET_EXIT = HB_FALSE; pSet->HB_SET_EXTRA = HB_FALSE; pSet->HB_SET_EXTRAFILE = NULL; - pSet->hb_set_extrahan = FS_ERROR; + pSet->hb_set_extrahan = NULL; pSet->HB_SET_FIXED = HB_FALSE; pSet->HB_SET_FORCEOPT = HB_FALSE; pSet->HB_SET_HARDCOMMIT = HB_TRUE; @@ -1120,7 +1106,7 @@ void hb_setInitialize( PHB_SET_STRUCT pSet ) pSet->hb_set_path = NULL; pSet->HB_SET_PRINTER = HB_FALSE; pSet->HB_SET_PRINTFILE = hb_set_PRINTFILE_default(); - pSet->hb_set_printhan = FS_ERROR; + pSet->hb_set_printhan = NULL; pSet->HB_SET_SCOREBOARD = HB_TRUE; pSet->HB_SET_SCROLLBREAK = HB_TRUE; pSet->HB_SET_SOFTSEEK = HB_FALSE; @@ -1194,7 +1180,7 @@ PHB_SET_STRUCT hb_setClone( PHB_SET_STRUCT pSrc ) memcpy( pSet, pSrc, sizeof( HB_SET_STRUCT ) ); - pSet->hb_set_althan = pSet->hb_set_extrahan = pSet->hb_set_printhan = FS_ERROR; + pSet->hb_set_althan = pSet->hb_set_extrahan = pSet->hb_set_printhan = NULL; pSet->hb_set_path = NULL; pSet->hb_set_listener = NULL; @@ -2283,7 +2269,7 @@ HB_PATHNAMES * hb_setGetFirstSetPath( void ) return hb_stackSetStruct()->hb_set_path; } -HB_FHANDLE hb_setGetAltHan( void ) +PHB_FILE hb_setGetAltHan( void ) { HB_STACK_TLS_PRELOAD return hb_stackSetStruct()->hb_set_althan; @@ -2295,13 +2281,13 @@ HB_BOOL hb_setGetCentury( void ) return hb_stackSetStruct()->hb_set_century; } -HB_FHANDLE hb_setGetExtraHan( void ) +PHB_FILE hb_setGetExtraHan( void ) { HB_STACK_TLS_PRELOAD return hb_stackSetStruct()->hb_set_extrahan; } -HB_FHANDLE hb_setGetPrintHan( void ) +PHB_FILE hb_setGetPrintHan( void ) { HB_STACK_TLS_PRELOAD return hb_stackSetStruct()->hb_set_printhan; @@ -2932,7 +2918,7 @@ char * hb_osStrU16Decode2( const HB_WCHAR * pszNameW, char * pszBuffer, HB_SIZE } #endif -HB_FHANDLE hb_setGetPrinterHandle( int iType ) +PHB_FILE hb_setGetPrinterHandle( int iType ) { HB_STACK_TLS_PRELOAD PHB_SET_STRUCT pSet = hb_stackSetStruct(); @@ -2941,19 +2927,19 @@ HB_FHANDLE hb_setGetPrinterHandle( int iType ) { case HB_SET_PRN_DEV: if( ! pSet->hb_set_prndevice ) - return FS_ERROR; + return NULL; break; case HB_SET_PRN_CON: if( ! pSet->HB_SET_PRINTER ) - return FS_ERROR; + return NULL; break; case HB_SET_PRN_ANY: break; default: - return FS_ERROR; + return NULL; } - if( pSet->hb_set_printhan == FS_ERROR && pSet->HB_SET_PRINTFILE ) + if( pSet->hb_set_printhan == NULL && pSet->HB_SET_PRINTFILE ) open_handle( pSet, pSet->HB_SET_PRINTFILE, HB_FALSE, HB_SET_PRINTFILE ); return pSet->hb_set_printhan;