From d0450cff7c0598c7a9904e089a585549033906f2 Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Wed, 13 Feb 2008 13:03:38 +0000 Subject: [PATCH] 2008-02-13 14:03 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/source/rtl/direct.c * fixed Clipper compatibility when last character of given path is directory delimiter or drive delimiter * harbour/source/rdd/dbf1.c * added RT error when corrupted memo block address is detected in DBF file. --- harbour/ChangeLog | 9 ++++++ harbour/source/rdd/dbf1.c | 15 ++++++++- harbour/source/rtl/direct.c | 62 ++++++++++++++++++++++++++++++------- 3 files changed, 74 insertions(+), 12 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 84217d5b37..7b043c75a0 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,15 @@ 2002-12-01 13:30 UTC+0100 Foo Bar */ +2008-02-13 14:03 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/rtl/direct.c + * fixed Clipper compatibility when last character of given path + is directory delimiter or drive delimiter + + * harbour/source/rdd/dbf1.c + * added RT error when corrupted memo block address is detected + in DBF file. + 2008-02-12 08:04 UTC+0100 Marek Paliwoda (mpaliwoda at interia pl) * harbour/contrib/hbwhat32/make_gcc.sh ! Fixed compilation under MingW and Cygwin diff --git a/harbour/source/rdd/dbf1.c b/harbour/source/rdd/dbf1.c index 501186ff5c..ab927a5346 100644 --- a/harbour/source/rdd/dbf1.c +++ b/harbour/source/rdd/dbf1.c @@ -1103,7 +1103,20 @@ HB_EXPORT ERRCODE hb_dbfGetMemoData( DBFAREAP pArea, USHORT uiIndex, if( bByte >= '0' && bByte <= '9' ) ulValue = ulValue * 10 + ( bByte - '0' ); else if( bByte != ' ' || ulValue ) - return FAILURE; + { + PHB_ITEM pError = hb_errNew(); + ERRCODE uiError; + + hb_errPutGenCode( pError, EG_CORRUPTION ); + hb_errPutSubCode( pError, EDBF_CORRUPT ); + hb_errPutDescription( pError, hb_langDGetErrorDesc( EG_CORRUPTION ) ); + hb_errPutFileName( pError, pArea->szDataFileName ); + hb_errPutFlags( pError, EF_CANDEFAULT ); + uiError = SELF_ERROR( ( AREAP ) pArea, pError ); + hb_itemRelease( pError ); + + return uiError == E_DEFAULT ? SUCCESS : FAILURE; + } } *pulBlock = ulValue; } diff --git a/harbour/source/rtl/direct.c b/harbour/source/rtl/direct.c index d56d6bb631..ed384849c3 100644 --- a/harbour/source/rtl/direct.c +++ b/harbour/source/rtl/direct.c @@ -98,12 +98,6 @@ #include "directry.ch" -#if defined( HB_OS_UNIX ) - #define HB_DIR_ALL_FILES_MASK "*" -#else - #define HB_DIR_ALL_FILES_MASK "*.*" -#endif - /* NOTE: 8.3 three support should be added in a separate way, like as a function which converts full names to 8.3 names, since this issue is very much platform specific, and this is @@ -111,8 +105,9 @@ HB_FUNC( DIRECTORY ) { - PHB_ITEM pDirSpec = hb_param( 1, HB_IT_STRING ); - PHB_ITEM pAttributes = hb_param( 2, HB_IT_STRING ); + char * szDirSpec = hb_parc( 1 ); + char * szAttributes = hb_parc( 2 ); + BOOL fFree = FALSE; USHORT uiMask; PHB_ITEM pDir = hb_itemArrayNew( 0 ); @@ -132,18 +127,60 @@ HB_FUNC( DIRECTORY ) | HB_FA_ENCRYPTED | HB_FA_VOLCOMP; - if( pAttributes && hb_itemGetCLen( pAttributes ) > 0 ) + if( szAttributes && *szAttributes ) { - if ( ( uiMask |= hb_fsAttrEncode( hb_itemGetCPtr( pAttributes ) ) ) & HB_FA_LABEL ) + if( ( uiMask |= hb_fsAttrEncode( szAttributes ) ) & HB_FA_LABEL ) { /* NOTE: This is Clipper Doc compatible. (not operationally) */ uiMask = HB_FA_LABEL; } } + if( szDirSpec && *szDirSpec ) + { + szDirSpec = ( char * ) hb_fsNameConv( ( BYTE * ) szDirSpec, &fFree ); + if( *szDirSpec ) + { + /* CA-Cl*pper compatible behavior - add all file mask when + * last character is directory or drive separator + */ + int iLen = strlen( szDirSpec ) - 1; +#ifdef OS_HAS_DRIVE_LETTER + if( szDirSpec[iLen] == OS_PATH_DELIMITER || + szDirSpec[iLen] == OS_DRIVE_DELIMITER ) +#else + if( szDirSpec[iLen] == OS_PATH_DELIMITER ) +#endif + { + if( fFree ) + { + char * szTemp = hb_xstrcpy( NULL, szDirSpec, OS_FILE_MASK, NULL ); + hb_xfree( szDirSpec ); + szDirSpec = szTemp; + } + else + { + szDirSpec = hb_xstrcpy( NULL, szDirSpec, OS_FILE_MASK, NULL ); + fFree = TRUE; + } + } + } + else + { + if( fFree ) + { + hb_xfree( szDirSpec ); + fFree = FALSE; + } + szDirSpec = ( char * ) OS_FILE_MASK; + } + } + else + szDirSpec = ( char * ) OS_FILE_MASK; + /* Get the file list */ - if( ( ffind = hb_fsFindFirst( pDirSpec ? hb_itemGetCPtr( pDirSpec ) : HB_DIR_ALL_FILES_MASK, uiMask ) ) != NULL ) + if( ( ffind = hb_fsFindFirst( szDirSpec, uiMask ) ) != NULL ) { PHB_ITEM pSubarray = hb_itemNew( NULL ); @@ -168,5 +205,8 @@ HB_FUNC( DIRECTORY ) hb_fsFindClose( ffind ); } + if( fFree ) + hb_xfree( szDirSpec ); + hb_itemReturnRelease( pDir ); }