19990824-19:05 GMT+1

This commit is contained in:
Viktor Szakats
1999-08-24 17:19:11 +00:00
parent b958703cd9
commit 2134bc1c91
2 changed files with 99 additions and 28 deletions

View File

@@ -1,3 +1,16 @@
19990824-19:05 GMT+1 Victor Szel <info@szelvesz.hu>
* source/rtl/math.c
! MIN(), MAX() code fixed to behave exactly like Clipper, it will now
return a DOUBLE if any parameter is DOUBLE, it will return LONG if
any parameter is LONG, otherwise it will return INT, the HB_ITEM
decimals now are only accessed for DOUBLE types (and of course only set
for DOUBLE return types). The bug could be observed by running AC_TEST
pressing PgDn at the bottom of the list then pressing Up button, the
index display was showed with decimals in it.
% MIN(), MAX() code optimalized.
* Some direct hb_param() calls changed to macros.
19990824-18:05 GMT+1 Victor Szel <info@szelvesz.hu>
* source/rtl/extend.c

View File

@@ -82,17 +82,17 @@ HARBOUR HB_INT( void )
{
if( hb_pcount() == 1 )
{
if( hb_param(1, IT_NUMERIC) )
if( ISNUM( 1 ) )
hb_retnl( hb_parnd( 1 ) );
else
{
hb_errRT_BASE(EG_ARG, 1090, NULL, "INT");
hb_errRT_BASE( EG_ARG, 1090, NULL, "INT" );
}
}
else
{
/* NOTE: Clipper catches this at compile time! */
hb_errRT_BASE(EG_ARGCOUNT, 3000, NULL, "INT");
hb_errRT_BASE( EG_ARGCOUNT, 3000, NULL, "INT" );
}
}
@@ -127,31 +127,60 @@ HARBOUR HB_MAX( void )
{
if( hb_pcount() == 2 )
{
PHB_ITEM p1 = hb_param(1, IT_ANY), p2 = hb_param(2, IT_ANY);
PHB_ITEM p1 = hb_param( 1, IT_ANY );
PHB_ITEM p2 = hb_param( 2, IT_ANY );
if( ( IS_NUMERIC( p1 ) && IS_NUMERIC( p2 ) ) || ( IS_DATE( p1 ) && IS_DATE( p2 ) ) )
if ( IS_NUMERIC( p1 ) && IS_NUMERIC( p2 ) )
{
if( p1->type == IT_DATE )
WORD wType1 = p1->type;
WORD wType2 = p1->type;
/* NOTE: The order of these if() branches is significant, */
/* Don't change it */
if( wType1 == IT_DOUBLE || wType2 == IT_DOUBLE )
{
long l1 = p1->item.asDate.value, l2 = p2->item.asDate.value;
hb_retds(l1 >= l2? hb_pards(1): hb_pards(2));
double d1 = hb_parnd( 1 );
double d2 = hb_parnd( 2 );
int iDec1 = ( wType1 == IT_DOUBLE ) ? p1->item.asDouble.decimal : 0;
int iDec2 = ( wType2 == IT_DOUBLE ) ? p2->item.asDouble.decimal : 0;
hb_retnd( d1 >= d2 ? d1 : d2 );
stack.Return.item.asDouble.decimal = ( d1 >= d2 ? iDec1 : iDec2 );
}
else if( wType1 == IT_LONG || wType2 == IT_LONG )
{
long l1 = hb_parnl( 1 );
long l2 = hb_parnl( 2 );
hb_retnl( l1 >= l2 ? l1 : l2 );
}
else
{
double d1 = hb_parnd(1), d2 = hb_parnd(2);
hb_retnd(d1 >= d2? d1: d2);
stack.Return.item.asDouble.decimal = (d1 >= d2? p1->item.asDouble.decimal : p2->item.asDouble.decimal);
int i1 = hb_parni( 1 );
int i2 = hb_parni( 2 );
hb_retni( i1 >= i2 ? i1 : i2 );
}
}
else if( IS_DATE( p1 ) && IS_DATE( p2 ) )
{
long l1 = p1->item.asDate.value;
long l2 = p2->item.asDate.value;
hb_retds( l1 >= l2 ? hb_pards( 1 ) : hb_pards( 2 ) );
}
else
{
hb_errRT_BASE(EG_ARG, 1093, NULL, "MAX");
hb_errRT_BASE( EG_ARG, 1093, NULL, "MAX" );
}
}
else
{
/* NOTE: Clipper catches this at compile time! */
hb_errRT_BASE(EG_ARGCOUNT, 3000, NULL, "MAX");
hb_errRT_BASE( EG_ARGCOUNT, 3000, NULL, "MAX" );
}
}
@@ -160,31 +189,60 @@ HARBOUR HB_MIN( void )
{
if( hb_pcount() == 2 )
{
PHB_ITEM p1 = hb_param(1, IT_ANY), p2 = hb_param(2, IT_ANY);
PHB_ITEM p1 = hb_param( 1, IT_ANY );
PHB_ITEM p2 = hb_param( 2, IT_ANY );
if( ( IS_NUMERIC( p1 ) && IS_NUMERIC( p2 ) ) || ( IS_DATE( p1 ) && IS_DATE( p2 ) ) )
if( IS_NUMERIC( p1 ) && IS_NUMERIC( p2 ) )
{
if( p1->type == IT_DATE )
WORD wType1 = p1->type;
WORD wType2 = p1->type;
/* NOTE: The order of these if() branches is significant, */
/* Don't change it */
if( wType1 == IT_DOUBLE || wType2 == IT_DOUBLE )
{
long l1 = p1->item.asDate.value, l2 = p2->item.asDate.value;
hb_retds(l1 <= l2? hb_pards(1): hb_pards(2));
double d1 = hb_parnd( 1 );
double d2 = hb_parnd( 2 );
int iDec1 = ( wType1 == IT_DOUBLE ) ? p1->item.asDouble.decimal : 0;
int iDec2 = ( wType2 == IT_DOUBLE ) ? p2->item.asDouble.decimal : 0;
hb_retnd( d1 <= d2 ? d1 : d2 );
stack.Return.item.asDouble.decimal = ( d1 <= d2 ? iDec1 : iDec2 );
}
else if( wType1 == IT_LONG || wType2 == IT_LONG )
{
long l1 = hb_parnl( 1 );
long l2 = hb_parnl( 2 );
hb_retnl( l1 <= l2 ? l1 : l2 );
}
else
{
double d1 = hb_parnd(1), d2 = hb_parnd(2);
hb_retnd(d1 <= d2? d1: d2);
stack.Return.item.asDouble.decimal = (d1 <= d2? p1->item.asDouble.decimal : p2->item.asDouble.decimal);
int i1 = hb_parni( 1 );
int i2 = hb_parni( 2 );
hb_retni( i1 <= i2 ? i1 : i2 );
}
}
else if( IS_DATE( p1 ) && IS_DATE( p2 ) )
{
long l1 = p1->item.asDate.value;
long l2 = p2->item.asDate.value;
hb_retds( l1 <= l2 ? hb_pards( 1 ) : hb_pards( 2 ) );
}
else
{
hb_errRT_BASE(EG_ARG, 1092, NULL, "MIN");
hb_errRT_BASE( EG_ARG, 1092, NULL, "MIN" );
}
}
else
{
/* NOTE: Clipper catches this at compile time! */
hb_errRT_BASE(EG_ARGCOUNT, 3000, NULL, "MIN");
hb_errRT_BASE( EG_ARGCOUNT, 3000, NULL, "MIN" );
}
}
@@ -208,8 +266,8 @@ FUNCTION MOD(cl_num, cl_base)
if( pNumber && ISNUM( 2 ) )
{
double dNumber = hb_parnd(1);
double dBase = hb_parnd(2); /* dBase! Cool! */
double dNumber = hb_parnd( 1 );
double dBase = hb_parnd( 2 ); /* dBase! Cool! */
double dResult;
if( dBase )
@@ -278,7 +336,7 @@ HARBOUR HB_ROUND( void )
{
if( hb_pcount() == 2 )
{
if( hb_param(1, IT_NUMERIC) && hb_param( 2, IT_NUMERIC ) )
if( ISNUM( 1 ) && ISNUM( 2 ) )
{
int iDec = hb_parni( 2 );
@@ -287,13 +345,13 @@ HARBOUR HB_ROUND( void )
}
else
{
hb_errRT_BASE(EG_ARG, 1094, NULL, "ROUND");
hb_errRT_BASE( EG_ARG, 1094, NULL, "ROUND" );
}
}
else
{
/* NOTE: Clipper catches this at compile time! */
hb_errRT_BASE(EG_ARGCOUNT, 3000, NULL, "ROUND");
hb_errRT_BASE( EG_ARGCOUNT, 3000, NULL, "ROUND" );
}
}