diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 7f9ac25605..5ef15032db 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,27 @@ 2002-12-01 23:12 UTC+0100 Foo Bar */ +2004-10-23 02:50 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/bin/postinst.sh + * changed install command syntax for Solaris compatibility + + * harbour/include/hbdefs.h + * minor formating + + * harbour/source/vm/fm.c + + overwrite HB_MEMINFO_SIGNATURE with 0 in hb_xfree() for detection + redundant hb_xfree() call with the same pointer + + * harbour/source/rtl/spfiles.c + * set the real path in second parameter of RetPath even when + hb_spFiles fails to avoid race condition + + * harbour/source/vm/hvm.c + ! set proper decimal value in hb_vmDivide when the integer results + is converted into double + ! commented out integer division optimization at runtime for Clipper + compatibility + 2004-10-20 17:20 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/source/pp/ppcore.c + added predefined macro __PLATFORM__UNIX for all *nix compatible diff --git a/harbour/bin/postinst.sh b/harbour/bin/postinst.sh index 12976f4da3..12a974172b 100644 --- a/harbour/bin/postinst.sh +++ b/harbour/bin/postinst.sh @@ -46,7 +46,9 @@ then # We must build an archive index on Darwin AR="ar -crs" fi - if [ "${HB_ARCHITECTURE}" != "dos" ]; then + if [ "${HB_ARCHITECTURE}" = "sunos" ]; then + install -m 755 -f "${HB_BIN_INSTALL}" "${hb_root}/bin/hb-mkslib.sh" + elif [ "${HB_ARCHITECTURE}" != "dos" ]; then install -m 755 "${hb_root}/bin/hb-mkslib.sh" "${HB_BIN_INSTALL}/hb-mkslib" fi mk_hbtools "${HB_BIN_INSTALL}" "$@" diff --git a/harbour/include/hbdefs.h b/harbour/include/hbdefs.h index 4cab8c006a..6296376254 100644 --- a/harbour/include/hbdefs.h +++ b/harbour/include/hbdefs.h @@ -67,7 +67,7 @@ */ #if defined( HB_OS_WIN_32 ) - #if !defined( HB_WIN32_IO_OFF ) + #if !defined( HB_WIN32_IO_OFF ) #define HB_WIN32_IO #endif #if defined( HB_WIN32_IO ) && !defined( HB_OS_WIN_32_USED ) @@ -88,15 +88,15 @@ #endif /* Include windows.h if applicable and requested */ -#if defined(HB_OS_WIN_32_USED) && defined(HB_OS_WIN_32) +#if defined( HB_OS_WIN_32_USED ) && defined( HB_OS_WIN_32 ) #define WIN32_LEAN_AND_MEAN #include - #if defined(__GNUC__) + #if defined( __GNUC__ ) #define HB_DONT_DEFINE_BASIC_TYPES #endif -#elif defined(HB_OS_OS2) +#elif defined( HB_OS_OS2 ) /* With the exception of WORD, the IBM Visual Age C++ compiler has its own definitions of the Harbour types most of which conflict with the @@ -123,7 +123,7 @@ #undef UINT #define HB_DONT_DEFINE_BASIC_TYPES -#elif defined(HB_OS_DOS) +#elif defined( HB_OS_DOS ) #include @@ -147,7 +147,7 @@ #endif -#if ! defined(HB_DONT_DEFINE_BASIC_TYPES) +#if ! defined( HB_DONT_DEFINE_BASIC_TYPES ) #undef BOOL /* boolean */ typedef int BOOL; @@ -525,6 +525,7 @@ typedef long HB_PTRDIFF; # define PFHL PFLL #endif + #define HB_SWAP_UINT64( w ) ( ( UINT64 ) ( ( ( ( UINT64 ) ( w ) & HB_LL( 0x00000000000000FF ) ) << 56 ) | \ ( ( ( UINT64 ) ( w ) & HB_LL( 0x000000000000FF00 ) ) << 40 ) | \ ( ( ( UINT64 ) ( w ) & HB_LL( 0x0000000000FF0000 ) ) >> 24 ) | \ @@ -891,7 +892,7 @@ typedef long HB_PTRDIFF; * when INT64 is not supported - they are necessary for PCODE and * database access */ -#if defined( HB_LONG_LONG_OFF ) && !defined( UINT64_MAX ) +#if defined( HB_LONG_LONG_OFF ) && !defined( HB_ARCH_64BIT ) #undef HB_GET_LE_INT64 #undef HB_GET_LE_UINT64 #undef HB_PUT_LE_UINT64 @@ -965,12 +966,12 @@ typedef PHB_FUNC HB_FUNC_PTR; #elif defined( __WATCOMC__ ) #define HB_EXPORT __declspec( dllexport ) - #elif defined( WIN32 ) && !defined( ASANT ) - #define HB_EXPORT _declspec( dllexport ) - #elif defined( ASANLM ) || defined( ASANT ) #define HB_EXPORT + #elif defined( WIN32 ) + #define HB_EXPORT _declspec( dllexport ) + #else #define HB_EXPORT diff --git a/harbour/source/rtl/spfiles.c b/harbour/source/rtl/spfiles.c index dec810a78f..5caf93a1cf 100644 --- a/harbour/source/rtl/spfiles.c +++ b/harbour/source/rtl/spfiles.c @@ -53,21 +53,21 @@ #include "hbapifs.h" #include "hbset.h" -BOOL hb_spFile( BYTE * pFilename, BYTE RetPath[ _POSIX_PATH_MAX + 3 + 10 ] ) +BOOL hb_spFile( BYTE * pFilename, BYTE * pRetPath ) { BYTE *Path; BOOL bIsFile = FALSE; PHB_FNAME pFilepath; - HB_TRACE(HB_TR_DEBUG, ("hb_spFile(%s, %p)", (char*) pFilename, RetPath)); + HB_TRACE(HB_TR_DEBUG, ("hb_spFile(%s, %p)", (char*) pFilename, pRetPath)); - if( RetPath ) + if( pRetPath ) { - Path = RetPath; + Path = pRetPath; } else { - Path = (BYTE *) hb_xgrab( _POSIX_PATH_MAX + 3 + 10 ); + Path = (BYTE *) hb_xgrab( _POSIX_PATH_MAX + 1 ); } pFilepath = hb_fsFNameSplit( (char*) pFilename ); @@ -98,16 +98,23 @@ BOOL hb_spFile( BYTE * pFilename, BYTE RetPath[ _POSIX_PATH_MAX + 3 + 10 ] ) NextPath = NextPath->pNext; } } + + /* + * This code is intentional. To eliminate race condition, + * in pending hb_spCreate()/hb_spOpen() call when we have to know + * real path and file name we have to set its deterministic value + * here. If it's not necessary the caller may drop this value. + */ + if( ! bIsFile ) + { + pFilepath->szPath = hb_set.HB_SET_DEFAULT ? hb_set.HB_SET_DEFAULT : "."; + hb_fsFNameMerge( (char*) Path, pFilepath ); + } } hb_xfree( pFilepath ); - if( bIsFile == FALSE ) - { - Path[0] = '\0'; - } - - if( RetPath == NULL ) + if( pRetPath == NULL ) { hb_xfree( Path ); } @@ -117,7 +124,7 @@ BOOL hb_spFile( BYTE * pFilename, BYTE RetPath[ _POSIX_PATH_MAX + 3 + 10 ] ) FHANDLE hb_spOpen( BYTE * pFilename, USHORT uiFlags ) { - BYTE path[ _POSIX_PATH_MAX + 3 + 10 ]; + BYTE path[ _POSIX_PATH_MAX + 1 ]; HB_TRACE(HB_TR_DEBUG, ("hb_spOpen(%p, %hu)", pFilename, uiFlags)); diff --git a/harbour/source/vm/fm.c b/harbour/source/vm/fm.c index ab9f8b6225..3d5a79135f 100644 --- a/harbour/source/vm/fm.c +++ b/harbour/source/vm/fm.c @@ -143,8 +143,8 @@ void HB_EXPORT * hb_xalloc( ULONG ulSize ) /* allocates fixed memory, re s_pLastBlock->pNextBlock = ( PHB_MEMINFO ) pMem; } s_pLastBlock = ( PHB_MEMINFO ) pMem; - ( ( PHB_MEMINFO ) pMem )->pNextBlock = NULL; + ( ( PHB_MEMINFO ) pMem )->pNextBlock = NULL; ( ( PHB_MEMINFO ) pMem )->ulSignature = HB_MEMINFO_SIGNATURE; HB_PUT_LONG( ( ( BYTE * ) pMem ) + ulSize + sizeof(HB_MEMINFO), HB_MEMINFO_SIGNATURE ); ( ( PHB_MEMINFO ) pMem )->ulSize = ulSize; /* size of the memory block */ @@ -225,8 +225,8 @@ void HB_EXPORT * hb_xgrab( ULONG ulSize ) /* allocates fixed memory, exi s_pLastBlock->pNextBlock = ( PHB_MEMINFO ) pMem; } s_pLastBlock = ( PHB_MEMINFO ) pMem; - ( ( PHB_MEMINFO ) pMem )->pNextBlock = NULL; + ( ( PHB_MEMINFO ) pMem )->pNextBlock = NULL; ( ( PHB_MEMINFO ) pMem )->ulSignature = HB_MEMINFO_SIGNATURE; HB_PUT_LONG( ( ( BYTE * ) pMem ) + ulSize + sizeof(HB_MEMINFO), HB_MEMINFO_SIGNATURE ); ( ( PHB_MEMINFO ) pMem )->ulSize = ulSize; /* size of the memory block */ @@ -302,6 +302,8 @@ void HB_EXPORT * hb_xrealloc( void * pMem, ULONG ulSize ) /* reallocates m if ( HB_GET_LONG( ( ( BYTE * ) pMem ) + ulMemSize ) != HB_MEMINFO_SIGNATURE ) hb_errInternal( HB_EI_XMEMOVERFLOW, NULL, NULL, NULL ); + HB_PUT_LONG( ( ( BYTE * ) pMem ) + ulMemSize, 0 ); + pMem = realloc( pMemBlock, ulSize + sizeof( HB_MEMINFO ) + sizeof( ULONG ) ); s_lMemoryConsumed += ( ulSize - ulMemSize ); @@ -374,6 +376,9 @@ void HB_EXPORT hb_xfree( void * pMem ) /* frees fixed memory */ else s_pLastBlock = pMemBlock->pPrevBlock; + pMemBlock->ulSignature = 0; + HB_PUT_LONG( ( ( BYTE * ) pMem ) + pMemBlock->ulSize, 0 ); + free( ( void * ) pMemBlock ); } else diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index 11faa0ccf8..490627de36 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -2039,7 +2039,11 @@ static void hb_vmDivide( void ) pItem1 = hb_stackItemFromTop( -2 ); pItem2 = hb_stackItemFromTop( -1 ); - if( HB_IS_NUMINT( pItem1 ) && HB_IS_NUMINT( pItem2 ) ) + /* + * This code is commented out for Clipper compatibility. + * See David's note below, Druzus. + */ + /* if( HB_IS_NUMINT( pItem1 ) && HB_IS_NUMINT( pItem2 ) ) { HB_LONG lNumber2 = hb_vmPopHBLong(); HB_LONG lNumber1 = hb_vmPopHBLong(); @@ -2057,9 +2061,9 @@ static void hb_vmDivide( void ) else if ( lNumber1 % lNumber2 == 0 ) hb_vmPushNumInt( lNumber1 / lNumber2 ); else - hb_vmPushDouble( ( double ) lNumber1 / ( double ) lNumber2, 0 ); + hb_vmPushDouble( ( ( double ) lNumber1 ) / ( double ) lNumber2, hb_set.HB_SET_DECIMALS ); } - else if( HB_IS_NUMERIC( pItem1 ) && HB_IS_NUMERIC( pItem2 ) ) + else */ if( HB_IS_NUMERIC( pItem1 ) && HB_IS_NUMERIC( pItem2 ) ) { double d2 = hb_vmPopNumber(); double d1 = hb_vmPopNumber();