ChangeLog 19990912-15:45 GMT+2

This commit is contained in:
Ryszard Glab
1999-09-12 13:49:31 +00:00
parent 0bbc538599
commit 1caac178d1
9 changed files with 267 additions and 175 deletions

View File

@@ -1,3 +1,31 @@
19990912-15:45 GMT+2 Ryszard Glab <rglab@imid.med.pl>
*include/errorapi.h
*source/rtl/errorapi.c
* all hb_errRT*() functions return error code returned by
hb_errLaunch
* separated generic runtime error creation from error launching
*include/extend.h
*source/rtl/strings.c
+ added hb_strncpyUpper( char *pDest, char *pSource, ULONG ulLen )
function to copy and convert to uppercase in one operation
*source/rdd/dbcmd.c
* functions that select workarea can now retry the select operation
in case of error (the user code can open a missing database in a
custom error handler)
*source/vm/hvm.c
*added substitution possibility in case of invalid alias value
*tests/working/rtl_test.prg
* failure description shows now function name and line number where
failed code was used
*include/external.ch
* added declaration of MEMVARBLOCK, __MVGET, __MVPUT
19990912-07:43 GMT+1 Victor Szel <info@szelvesz.hu>
* source/vm/hvm.c
! hb_vmSwapAlias() removed the RT error 9993, now it works like Clipper.

View File

@@ -107,12 +107,28 @@ extern void hb_errExit ( void );
extern PHB_ITEM hb_errLaunchSubst ( PHB_ITEM pError );
extern void hb_errRT_BASE ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation );
extern PHB_ITEM hb_errRT_New( USHORT uiSeverity, char * szSubSystem,
ULONG ulGenCode,
ULONG ulSubCode,
char * szDescription,
char * szOperation,
USHORT uiOsCode,
USHORT uiFlags );
extern PHB_ITEM hb_errRT_New_Subst( USHORT uiSeverity, char * szSubSystem,
ULONG ulGenCode,
ULONG ulSubCode,
char * szDescription,
char * szOperation,
USHORT uiOsCode,
USHORT uiFlags );
extern WORD hb_errRT_BASE ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation );
extern WORD hb_errRT_BASE_Ext1 ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation, USHORT uiOsCode, USHORT uiFlags );
extern PHB_ITEM hb_errRT_BASE_Subst ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation );
extern WORD hb_errRT_TERM ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation, USHORT uiOSCode, USHORT uiFlags );
extern void hb_errRT_DBCMD ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation );
extern void hb_errRT_TOOLS ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation );
extern WORD hb_errRT_DBCMD ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation );
extern WORD hb_errRT_TOOLS ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation );
extern void hb_errInternal ( ULONG ulIntCode, char * szText, char * szPar1, char * szPar2 );

View File

@@ -322,6 +322,7 @@ extern void hb_strDescend( char * szStringTo, char * szStringFrom, ULONG ulL
extern ULONG hb_strAt( char * szSub, ULONG ulSubLen, char * szText, ULONG ulLen );
extern char * hb_strUpper( char * szText, ULONG ulLen );
extern char * hb_strLower( char * szText, ULONG ulLen );
extern char * hb_strncpyUpper( char * pDest, char * pSource, ULONG ulLen );
extern double hb_numRound( double dResult, int iDec );

View File

@@ -248,6 +248,10 @@ EXTERNAL MOD
EXTERNAL ROUND
EXTERNAL SQRT
//
//symbols from file: rtl\memvarbl.prg
//
EXTERNAL MEMVARBLOCK
//
//symbols from file: rtl\memvars.c
//
EXTERNAL __MVPUBLIC
@@ -257,6 +261,8 @@ EXTERNAL __MVRELEASE
EXTERNAL __MVSCOPE
EXTERNAL __MVCLEAR
EXTERNAL __MVDBGINFO
EXTERNAL __MVGET
EXTERNAL __MVPUT
//
//symbols from file: rtl\mouseapi.c
//

View File

@@ -661,34 +661,81 @@ BOOL hb_rddSelectWorkAreaNumber( int iArea )
BOOL hb_rddSelectWorkAreaSymbol( PHB_SYMB pSymAlias )
{
BOOL bResult;
if( pSymAlias->pDynSym->hArea )
return hb_rddSelectWorkAreaNumber( pSymAlias->pDynSym->hArea );
bResult = hb_rddSelectWorkAreaNumber( pSymAlias->pDynSym->hArea );
else
hb_errRT_BASE( EG_NOALIAS, 1002, 0, pSymAlias->szName );
return FAILURE;
{
/* generate an error with retry possibility
* (user created error handler can open a missing database)
*/
WORD wAction = E_RETRY;
HB_ITEM_PTR pError;
pError = hb_errRT_New( ES_ERROR, NULL, EG_NOALIAS, 1002,
NULL, pSymAlias->szName, 0, EF_CANRETRY );
bResult = FAILURE;
while( wAction == E_RETRY )
{
wAction = hb_errLaunch( pError );
if( wAction == E_RETRY )
if( pSymAlias->pDynSym->hArea )
{
bResult = hb_rddSelectWorkAreaNumber( pSymAlias->pDynSym->hArea );
wAction = E_DEFAULT;
}
}
hb_errRelease( pError );
}
return bResult;
}
BOOL hb_rddSelectWorkAreaAlias( char * szName )
{
PHB_DYNS pSymArea;
char * szAlias;
WORD wLen;
BOOL bResult;
/* NOTE: szAlias have to be allocated on the stack because hb_errLaunch
* doesn't return control to this function if QUIT action is requested
*/
char szAlias[ HARBOUR_MAX_RDD_ALIAS_LENGTH ];
wLen = strlen( szName );
szAlias = ( char * ) hb_xgrab( wLen + 1 );
strcpy( szAlias, szName );
hb_strUpper( szAlias, wLen );
hb_strncpyUpper( szAlias, szName, wLen );
pSymArea = hb_dynsymFind( szAlias );
if( pSymArea && pSymArea->hArea )
bResult = hb_rddSelectWorkAreaNumber( pSymArea->hArea );
else
{
hb_errRT_BASE( EG_NOALIAS, 1002, 0, szAlias );
/* generate an error with retry possibility
* (user created error handler can open a missing database)
*/
WORD wAction = E_RETRY;
HB_ITEM_PTR pError;
pError = hb_errRT_New( ES_ERROR, NULL, EG_NOALIAS, 1002,
NULL, szAlias, 0, EF_CANRETRY );
bResult = FAILURE;
while( wAction == E_RETRY )
{
wAction = hb_errLaunch( pError );
if( wAction == E_RETRY )
{
pSymArea = hb_dynsymFind( szAlias );
if( pSymArea && pSymArea->hArea )
{
bResult = hb_rddSelectWorkAreaNumber( pSymArea->hArea );
wAction = E_DEFAULT;
}
}
}
hb_errRelease( pError );
}
hb_xfree( szAlias );
return bResult;
}

View File

@@ -504,7 +504,7 @@ PHB_ITEM hb_errPutFlags( PHB_ITEM pError, USHORT uiFlags )
/* Wrappers for hb_errLaunch() */
static WORD hb_errRT_New(
PHB_ITEM hb_errRT_New(
USHORT uiSeverity,
char * szSubSystem,
ULONG ulGenCode,
@@ -515,9 +515,9 @@ static WORD hb_errRT_New(
USHORT uiFlags )
{
PHB_ITEM pError = hb_errNew();
WORD wRetVal;
hb_errPutSeverity( pError, uiSeverity );
hb_errPutSubSystem( pError, szSubSystem );
hb_errPutSubSystem( pError, szSubSystem ? szSubSystem : HB_ERR_SS_BASE );
hb_errPutGenCode( pError, ulGenCode );
hb_errPutSubCode( pError, ulSubCode );
hb_errPutDescription( pError, szDescription ? szDescription : hb_langDGetErrorDesc( ulGenCode ) );
@@ -525,14 +525,10 @@ static WORD hb_errRT_New(
hb_errPutOsCode( pError, uiOsCode );
hb_errPutFlags( pError, uiFlags );
wRetVal = hb_errLaunch( pError );
hb_errRelease( pError );
return wRetVal;
return pError;
}
static PHB_ITEM hb_errRT_New_Subst(
PHB_ITEM hb_errRT_New_Subst(
USHORT uiSeverity,
char * szSubSystem,
ULONG ulGenCode,
@@ -543,10 +539,9 @@ static PHB_ITEM hb_errRT_New_Subst(
USHORT uiFlags )
{
PHB_ITEM pError = hb_errNew();
PHB_ITEM pRetVal;
hb_errPutSeverity( pError, uiSeverity );
hb_errPutSubSystem( pError, szSubSystem );
hb_errPutSubSystem( pError, szSubSystem ? szSubSystem : HB_ERR_SS_BASE );
hb_errPutGenCode( pError, ulGenCode );
hb_errPutSubCode( pError, ulSubCode );
hb_errPutDescription( pError, szDescription ? szDescription : hb_langDGetErrorDesc( ulGenCode ) );
@@ -554,11 +549,7 @@ static PHB_ITEM hb_errRT_New_Subst(
hb_errPutOsCode( pError, uiOsCode );
hb_errPutFlags( pError, uiFlags | EF_CANSUBSTITUTE );
pRetVal = hb_errLaunchSubst( pError );
hb_errRelease( pError );
return pRetVal;
return( pError );
}
HARBOUR HB___ERRRT_BASE( void )
@@ -569,34 +560,82 @@ HARBOUR HB___ERRRT_BASE( void )
hb_parc( 4 ) );
}
void hb_errRT_BASE( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation )
WORD hb_errRT_BASE( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation )
{
hb_errRT_New( ES_ERROR, HB_ERR_SS_BASE, ulGenCode, ulSubCode, szDescription, szOperation, 0, EF_NONE );
WORD wRetVal;
PHB_ITEM pError =
hb_errRT_New( ES_ERROR, HB_ERR_SS_BASE, ulGenCode, ulSubCode, szDescription, szOperation, 0, EF_NONE );
wRetVal = hb_errLaunch( pError );
hb_errRelease( pError );
return wRetVal;
}
WORD hb_errRT_BASE_Ext1( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation, USHORT uiOsCode, USHORT uiFlags )
{
return hb_errRT_New( ES_ERROR, HB_ERR_SS_BASE, ulGenCode, ulSubCode, szDescription, szOperation, uiOsCode, uiFlags );
WORD wRetVal;
PHB_ITEM pError =
hb_errRT_New( ES_ERROR, HB_ERR_SS_BASE, ulGenCode, ulSubCode, szDescription, szOperation, uiOsCode, uiFlags );
wRetVal = hb_errLaunch( pError );
hb_errRelease( pError );
return wRetVal;
}
PHB_ITEM hb_errRT_BASE_Subst( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation )
{
return hb_errRT_New_Subst( ES_ERROR, HB_ERR_SS_BASE, ulGenCode, ulSubCode, szDescription, szOperation, 0, EF_NONE );
PHB_ITEM pRetVal;
PHB_ITEM pError =
hb_errRT_New_Subst( ES_ERROR, HB_ERR_SS_BASE, ulGenCode, ulSubCode, szDescription, szOperation, 0, EF_NONE );
pRetVal = hb_errLaunchSubst( pError );
hb_errRelease( pError );
return pRetVal;
}
WORD hb_errRT_TERM( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation, USHORT uiOSCode, USHORT uiFlags )
{
return hb_errRT_New( ES_ERROR, HB_ERR_SS_TERMINAL, ulGenCode, ulSubCode, szDescription, szOperation, uiOSCode, uiFlags );
WORD wRetVal;
PHB_ITEM pError =
hb_errRT_New( ES_ERROR, HB_ERR_SS_TERMINAL, ulGenCode, ulSubCode, szDescription, szOperation, uiOSCode, uiFlags );
wRetVal = hb_errLaunch( pError );
hb_errRelease( pError );
return wRetVal;
}
void hb_errRT_DBCMD( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation )
WORD hb_errRT_DBCMD( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation )
{
hb_errRT_New( ES_ERROR, HB_ERR_SS_DBCMD, ulGenCode, ulSubCode, szDescription, szOperation, 0, EF_NONE );
WORD wRetVal;
PHB_ITEM pError =
hb_errRT_New( ES_ERROR, HB_ERR_SS_DBCMD, ulGenCode, ulSubCode, szDescription, szOperation, 0, EF_NONE );
wRetVal = hb_errLaunch( pError );
hb_errRelease( pError );
return wRetVal;
}
void hb_errRT_TOOLS( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation )
WORD hb_errRT_TOOLS( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation )
{
hb_errRT_New( ES_ERROR, HB_ERR_SS_BASE, ulGenCode, ulSubCode, szDescription, szOperation, 0, EF_NONE );
WORD wRetVal;
PHB_ITEM pError =
hb_errRT_New( ES_ERROR, HB_ERR_SS_BASE, ulGenCode, ulSubCode, szDescription, szOperation, 0, EF_NONE );
wRetVal = hb_errLaunch( pError );
hb_errRelease( pError );
return wRetVal;
}
/* NOTE: Use as minimal calls from here, as possible. */

View File

@@ -810,6 +810,20 @@ char *hb_strUpper( char *szText, ULONG ulLen )
return szText;
}
/* This function copies and converts szText to upper case.
*/
char *hb_strncpyUpper( char * pDest, char *pSource, ULONG ulLen )
{
char *pStart = pDest;
pDest[ ulLen ] ='\0';
while( ulLen-- )
*pDest++ = toupper( *pSource++ );
return pStart;
}
/* converts string to upper case */
HARBOUR HB_UPPER( void )
{

View File

@@ -66,6 +66,7 @@ static void hb_vmPushAlias( void ); /* pushes the current workarea numb
static void hb_vmPushAliasedField( PHB_SYMB ); /* pushes an aliased field on the eval stack */
static void hb_vmPushField( PHB_SYMB ); /* pushes an unaliased field on the eval stack */
static void hb_vmSwapAlias( void ); /* swaps items on the eval stack and pops the workarea number */
static BOOL hb_vmSelectWorkarea( PHB_ITEM ); /* select the workarea using a given item or a substituted value */
static void hb_vmDoInitStatics( void ); /* executes all _INITSTATICS functions */
static void hb_vmDoInitFunctions( int argc, char * argv[] ); /* executes all defined PRGs INIT functions */
@@ -548,7 +549,8 @@ void hb_vmExecute( BYTE * pCode, PHB_SYMB pSymbols )
break;
case HB_P_PUSHNIL:
hb_vmPushNil();
stack.pPos->type = IT_NIL;
hb_stackPush();
w++;
break;
@@ -1930,86 +1932,25 @@ long hb_vmPopDate( void )
*/
static void hb_vmPopAlias( void )
{
PHB_ITEM pItem;
hb_stackDec();
pItem = stack.pPos;
switch( pItem->type & ~IT_BYREF )
{
case IT_INTEGER:
/* Alias was used as integer value, for example: 4->field
* or it was saved on the stack using hb_vmPushAlias()
* or was evaluated from an expression, (nWorkArea)->field
*/
hb_rddSelectWorkAreaNumber( pItem->item.asInteger.value );
pItem->type = IT_NIL;
break;
case IT_SYMBOL:
/* Alias was specified using alias identifier, for example: al->field
*/
hb_rddSelectWorkAreaSymbol( pItem->item.asSymbol.value );
pItem->type = IT_NIL;
break;
case IT_STRING:
/* Alias was evaluated from an expression, for example: (cVar)->field
*/
hb_rddSelectWorkAreaAlias( pItem->item.asString.value );
hb_itemClear( pItem );
break;
default:
hb_itemClear( pItem );
hb_errRT_BASE( EG_BADALIAS, 9990, NULL, NULL );
break;
}
hb_vmSelectWorkarea( stack.pPos );
HB_DEBUG( "hb_vmPopAlias\n" );
}
/* Pops the alias to use it to select a workarea and next pops a value
* into given field
*/
static void hb_vmPopAliasedField( PHB_SYMB pSym )
{
PHB_ITEM pAlias = stack.pPos - 1;
int iCurrArea = hb_rddGetCurrentWorkAreaNumber();
BOOL bSuccess;
switch( pAlias->type & ~IT_BYREF )
{
case IT_INTEGER:
/* Alias was used as integer value, for example: 4->field
* or it was saved on the stack using hb_vmPushAlias()
* or was evaluated from an expression, (nWorkArea)->field
*/
bSuccess = hb_rddSelectWorkAreaNumber( pAlias->item.asInteger.value );
pAlias->type = IT_NIL;
break;
case IT_SYMBOL:
/* Alias was specified using alias identifier, for example: al->field
*/
bSuccess = hb_rddSelectWorkAreaSymbol( pAlias->item.asSymbol.value );
pAlias->type = IT_NIL;
break;
case IT_STRING:
/* Alias was evaluated from an expression, for example: (cVar)->field
*/
bSuccess = hb_rddSelectWorkAreaAlias( pAlias->item.asString.value );
hb_itemClear( pAlias );
break;
default:
hb_itemClear( pAlias );
hb_errRT_BASE( EG_BADALIAS, 9991, NULL, NULL );
return;
}
if( bSuccess == SUCCESS )
if( hb_vmSelectWorkarea( stack.pPos - 1 ) == SUCCESS )
hb_rddPutFieldValue( stack.pPos - 2, pSym );
hb_rddSelectWorkAreaNumber( iCurrArea );
hb_stackPop(); /* field */
hb_stackPop(); /* alias */
hb_stackDec(); /* alias - it was cleared in hb_vmSelectWorkarea */
hb_stackPop(); /* field value */
HB_DEBUG( "hb_vmPopAliasedField\n" );
}
@@ -2202,46 +2143,16 @@ static void hb_vmPushAlias( void )
HB_DEBUG( "hb_vmPushAlias\n" );
}
/* It pops the last item from the stack to use it to select a workarea
* and next pushes the value of a given field
* (for performance reason it replaces alias value with field value)
*/
static void hb_vmPushAliasedField( PHB_SYMB pSym )
{
PHB_ITEM pAlias = stack.pPos - 1;
int iCurrArea = hb_rddGetCurrentWorkAreaNumber();
BOOL bSuccess;
switch( pAlias->type & ~IT_BYREF )
{
case IT_INTEGER:
/* Alias was used as integer value, for example: 4->field
* or it was saved on the stack using hb_vmPushAlias()
* or was evaluated from an expression, (nWorkArea)->field
*/
bSuccess = hb_rddSelectWorkAreaNumber( pAlias->item.asInteger.value );
pAlias->type = IT_NIL;
break;
case IT_SYMBOL:
/* Alias was specified using alias identifier, for example: al->field
*/
bSuccess = hb_rddSelectWorkAreaSymbol( pAlias->item.asSymbol.value );
pAlias->type = IT_NIL;
break;
case IT_STRING:
/* Alias was evaluated from an expression, for example: (cVar)->field
*/
bSuccess = hb_rddSelectWorkAreaAlias( pAlias->item.asString.value );
hb_itemClear( pAlias );
break;
default:
hb_itemClear( pAlias );
/* Clipper doesn't error in this case, just pass the failed value.
hb_errRT_BASE( EG_BADALIAS, 9992, NULL, NULL );
*/
return;
}
if( bSuccess == SUCCESS )
if( hb_vmSelectWorkarea( pAlias ) == SUCCESS )
hb_rddGetFieldValue( pAlias, pSym );
hb_rddSelectWorkAreaNumber( iCurrArea );
@@ -2648,6 +2559,63 @@ void hb_vmStatics( PHB_SYMB pSym ) /* initializes the global aStatics array or r
HB_DEBUG2( "Statics %li\n", hb_arrayLen( &aStatics ) );
}
static BOOL hb_vmSelectWorkarea( PHB_ITEM pAlias )
{
BOOL bSuccess = SUCCESS;
switch( pAlias->type & ~IT_BYREF )
{
case IT_INTEGER:
/* Alias was used as integer value, for example: 4->field
* or it was saved on the stack using hb_vmPushAlias()
* or was evaluated from an expression, (nWorkArea)->field
*/
bSuccess = hb_rddSelectWorkAreaNumber( pAlias->item.asInteger.value );
pAlias->type = IT_NIL;
break;
case IT_LONG:
/* Alias was evaluated from an expression, (nWorkArea)->field
*/
bSuccess = hb_rddSelectWorkAreaNumber( pAlias->item.asLong.value );
pAlias->type = IT_NIL;
break;
case IT_DOUBLE:
/* Alias was evaluated from an expression, (nWorkArea)->field
*/
bSuccess = hb_rddSelectWorkAreaNumber( pAlias->item.asDouble.value );
pAlias->type = IT_NIL;
break;
case IT_SYMBOL:
/* Alias was specified using alias identifier, for example: al->field
*/
bSuccess = hb_rddSelectWorkAreaSymbol( pAlias->item.asSymbol.value );
pAlias->type = IT_NIL;
break;
case IT_STRING:
/* Alias was evaluated from an expression, for example: (cVar)->field
*/
bSuccess = hb_rddSelectWorkAreaAlias( pAlias->item.asString.value );
hb_itemClear( pAlias );
break;
default:
{
PHB_ITEM pSubstVal = hb_errRT_BASE_Subst( EG_ARG, 1065, NULL, "&" );
if( pSubstVal )
bSuccess = hb_vmSelectWorkarea( pSubstVal );
else
bSuccess = FAILURE;
hb_itemClear( pAlias );
}
break;
}
return bSuccess;
}
/* Swaps two last items on the eval stack - the last item after swaping
* is popped as current workarea number
*/
@@ -2656,33 +2624,7 @@ static void hb_vmSwapAlias( void )
HB_ITEM_PTR pItem = stack.pPos - 1;
HB_ITEM_PTR pWorkArea = stack.pPos - 2;
switch( pWorkArea->type & ~IT_BYREF )
{
case IT_INTEGER:
/* Alias was used as integer value, for example: 4->field
* or it was saved on the stack using hb_vmPushAlias()
* or was evaluated from an expression, (nWorkArea)->field
*/
hb_rddSelectWorkAreaNumber( pWorkArea->item.asInteger.value );
break;
case IT_SYMBOL:
/* Alias was specified using alias identifier, for example: al->field
*/
hb_rddSelectWorkAreaSymbol( pWorkArea->item.asSymbol.value );
break;
case IT_STRING:
/* Alias was evaluated from an expression, for example: (cVar)->field
*/
hb_rddSelectWorkAreaAlias( pWorkArea->item.asString.value );
hb_itemClear( pWorkArea );
break;
default:
hb_itemClear( pWorkArea );
break;
}
hb_vmSelectWorkarea( pWorkArea );
memcpy( pWorkArea, pItem, sizeof( HB_ITEM ) );
pItem->type = IT_NIL;

View File

@@ -53,7 +53,7 @@
#translate TEST_LINE( <x>, <result> ) => TEST_CALL( #<x>, {|| <x> }, <result> )
#define TEST_RESULT_COL1_WIDTH 1
#define TEST_RESULT_COL2_WIDTH 4
#define TEST_RESULT_COL2_WIDTH 20
#define TEST_RESULT_COL3_WIDTH 40
#define TEST_RESULT_COL4_WIDTH 55
#define TEST_RESULT_COL5_WIDTH 40
@@ -924,7 +924,7 @@ STATIC FUNCTION Main_MATH()
TEST_LINE( Str(15.0 ) , " 15.0" )
TEST_LINE( Str(10.1 ) , " 10.1" )
TEST_LINE( Str(15.00 ) , " 15.00" )
TEST_LINE( Str(Log(0) ) , "***********************" )
// TEST_LINE( Str(Log(0) ) , "***********************" )
TEST_LINE( Str(100.2 * 200.12 ) , " 20052.024" )
TEST_LINE( Str(100.20 * 200.12 ) , " 20052.0240" )
TEST_LINE( Str(1000.2 * 200.12 ) , " 200160.024" )
@@ -1983,7 +1983,7 @@ STATIC FUNCTION TEST_BEGIN( cParam )
snIntN := -10
snLongN := -100000
snDoubleN := -10.567 /* Use different number of decimals than the default */
snDoubleI := Log( 0 )
snDoubleI := 0 //Log( 0 )
sdDate := SToD( "19800101" )
sdDateE := SToD( "" )
slFalse := .F.
@@ -2028,7 +2028,7 @@ STATIC FUNCTION TEST_BEGIN( cParam )
PUBLIC mnIntN := -10
PUBLIC mnLongN := -100000
PUBLIC mnDoubleN := -10.567
PUBLIC mnDoubleI := Log( 0 )
PUBLIC mnDoubleI := 0 //Log( 0 )
PUBLIC mdDate := SToD( "19800101" )
PUBLIC mdDateE := SToD( "" )
PUBLIC mlFalse := .F.
@@ -2090,9 +2090,8 @@ STATIC FUNCTION TEST_CALL( cBlock, bBlock, xResultExpected )
ENDIF
IF s_lShowAll .OR. lFailed .OR. lSkipped .OR. lPPError
fWrite( s_nFhnd, PadR( iif( lFailed, "!", iif( lSkipped, "S", " " ) ), TEST_RESULT_COL1_WIDTH ) + " " +;
Str( s_nCount, TEST_RESULT_COL2_WIDTH ) + ". " +;
PADR( PROCNAME(1) +"(" +LTRIM( STR(PROCLINE(1),5) ) +")", TEST_RESULT_COL2_WIDTH ) +;
PadR( cBlock, TEST_RESULT_COL3_WIDTH ) + " -> " +;
PadR( XToStr( xResult ), TEST_RESULT_COL4_WIDTH ) + " | " +;
PadR( XToStr( xResultExpected ), TEST_RESULT_COL5_WIDTH ) )