HB_BYTE * hb_fileLoadData( PHB_FILE pFile, HB_SIZE nMaxSize, HB_SIZE * pnSize ) { HB_BYTE * pFileBuf = NULL; HB_SIZE nSize = 0, nRead, nBufSize; HB_FOFFSET nFileSize = hb_fileSize( pFile ); if( nFileSize == FS_ERROR || ( nFileSize == 0 && hb_fsError() == HB_FILE_ERR_UNSUPPORTED ) ) { for( nBufSize = 0;; ) { if( nBufSize == nSize ) { nBufSize += nBufSize == 0 ? HB_FILELOAD_BUFFERSIZE : nBufSize >> 1; if( nMaxSize > 0 && nBufSize > nMaxSize ) { nBufSize = nMaxSize; if( nBufSize == nSize ) break; } pFileBuf = ( HB_BYTE * ) hb_xrealloc( pFileBuf, nBufSize ); } nRead = hb_fileRead( pFile, pFileBuf + nSize, nBufSize - nSize, -1 ); if( nRead == 0 || nRead == ( HB_SIZE ) FS_ERROR ) break; nSize += nRead; } }
static PHRB_BODY hb_hrbLoadFromFile( const char * szHrb, HB_USHORT usMode ) { PHRB_BODY pHrbBody = NULL; PHB_ITEM pError = NULL; PHB_FILE pFile; /* Open as binary */ do { 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( pFile == NULL ); if( pError ) hb_itemRelease( pError ); if( pFile != NULL ) { HB_SIZE nBodySize = ( HB_SIZE ) hb_fileSize( pFile ); if( nBodySize ) { char * pbyBuffer; pbyBuffer = ( char * ) hb_xgrab( nBodySize + sizeof( char ) + 1 ); hb_fileReadAt( pFile, pbyBuffer, nBodySize, 0 ); pbyBuffer[ nBodySize ] = '\0'; pHrbBody = hb_hrbLoad( ( const char * ) pbyBuffer, nBodySize, usMode, szHrb ); hb_xfree( pbyBuffer ); } hb_fileClose( pFile ); } return pHrbBody; }
HB_EXPORT HB_FOFFSET hb_fileSizeGet( const char * pszFileName, HB_BOOL bUseDirEntry ) { int i = s_fileFindDrv( pszFileName ); if( i >= 0 ) { HB_ERRCODE uiError; HB_FOFFSET nSize = 0; if( bUseDirEntry ) { PHB_ITEM pDir = hb_fileDirectory( pszFileName, "HS" ); uiError = hb_fsError(); if( pDir ) { PHB_ITEM pEntry = hb_arrayGetItemPtr( pDir, 1 ); if( pEntry ) nSize = hb_arrayGetNInt( pEntry, F_SIZE ); hb_itemRelease( pDir ); } } else { PHB_FILE pFile = hb_fileExtOpen( pszFileName, NULL, FO_READ | FO_COMPAT, NULL, NULL ); if( pFile ) { nSize = hb_fileSize( pFile ); uiError = hb_fsError(); hb_fileClose( pFile ); } else uiError = hb_fsError(); } hb_fsSetFError( uiError ); return nSize; } return hb_fsFSize( pszFileName, bUseDirEntry ); }
static void hb_memoread( HB_BOOL bHandleEOF ) { const char * pszFileName = hb_parc( 1 ); if( pszFileName ) { PHB_FILE pFile = hb_fileExtOpen( pszFileName, NULL, FO_READ | FO_SHARED | FO_PRIVATE | FXO_SHARELOCK | FXO_NOSEEKPOS, NULL, NULL ); if( pFile != NULL ) { HB_SIZE nSize = ( HB_SIZE ) hb_fileSize( pFile ); if( nSize != 0 ) { char * pbyBuffer = ( char * ) hb_xgrab( nSize + 1 ); nSize = hb_fileReadAt( pFile, pbyBuffer, nSize, 0 ); /* Don't read the file terminating EOF character */ if( bHandleEOF && nSize > 0 ) { if( pbyBuffer[ nSize - 1 ] == HB_CHAR_EOF ) --nSize; } hb_retclen_buffer( pbyBuffer, nSize ); } else hb_retc_null(); hb_fileClose( pFile ); } else hb_retc_null(); } else hb_retc_null(); }