2010-10-08 10:17 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/include/hbapi.h
  * harbour/src/common/hbstr.c
    + added new C function:
         double hb_numExpConv( double dNum, int iExp )
  * harbour/src/rdd/dbf1.c
    + added support for decoding exponents part from 'F' fields
This commit is contained in:
Przemyslaw Czerpak
2010-10-08 08:17:16 +00:00
parent edf6cf3b46
commit e22c6c7e28
4 changed files with 66 additions and 46 deletions

View File

@@ -16,6 +16,14 @@
The license applies to all entries newer than 2009-04-28.
*/
2010-10-08 10:17 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbapi.h
* harbour/src/common/hbstr.c
+ added new C function:
double hb_numExpConv( double dNum, int iExp )
* harbour/src/rdd/dbf1.c
+ added support for decoding exponents part from 'F' fields
2010-10-07 18:05 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/hbide/ideedit.prg
! Fixed: paste operation was not deleting the selected text

View File

@@ -971,6 +971,7 @@ extern HB_EXPORT double hb_numRound( double dResult, int iDec ); /* round a n
extern HB_EXPORT double hb_numInt( double dNum ); /* take the integer part of the number */
extern HB_EXPORT double hb_random_num( void );
extern HB_EXPORT double hb_numDecConv( double dNum, int iDec );
extern HB_EXPORT double hb_numExpConv( double dNum, int iDec );
extern HB_EXPORT void hb_strtohex( const char * pSource, HB_SIZE size, char * pDest );
extern HB_EXPORT PHB_ITEM hb_strFormat( PHB_ITEM pItemReturn, PHB_ITEM pItemFormat, int iCount, PHB_ITEM * pItemArray );

View File

@@ -537,6 +537,16 @@ double hb_numDecConv( double dNum, int iDec )
return hb_numRound( dNum, 0 );
}
double hb_numExpConv( double dNum, int iExp )
{
if( iExp > 0 )
return dNum / hb_numPow10( iExp );
else if( iExp < 0 )
return dNum * hb_numPow10( -iExp );
else
return dNum;
}
static HB_BOOL hb_str2number( HB_BOOL fPCode, const char * szNum, HB_SIZE nLen, HB_MAXINT * lVal, double * dVal, int * piDec, int * piWidth )
{
HB_BOOL fDbl = HB_FALSE, fDec = HB_FALSE, fNeg, fHex = HB_FALSE;

View File

@@ -1794,6 +1794,10 @@ static HB_ERRCODE hb_dbfGetValue( DBFAREAP pArea, HB_USHORT uiIndex, PHB_ITEM pI
HB_BOOL fError;
char * pszVal;
HB_SIZE nLen;
HB_MAXINT lVal;
double dVal;
HB_BOOL fDbl;
int iLen;
HB_TRACE(HB_TR_DEBUG, ("hb_dbfGetValue(%p, %hu, %p)", pArea, uiIndex, pItem));
@@ -1854,17 +1858,11 @@ static HB_ERRCODE hb_dbfGetValue( DBFAREAP pArea, HB_USHORT uiIndex, PHB_ITEM pI
case HB_FT_DATE:
if( pField->uiLen == 3 )
{
hb_itemPutDL( pItem, HB_GET_LE_UINT24( pArea->pRecord + pArea->pFieldOffset[ uiIndex ] ) );
}
else if( pField->uiLen == 4 )
{
hb_itemPutDL( pItem, HB_GET_LE_UINT32( pArea->pRecord + pArea->pFieldOffset[ uiIndex ] ) );
}
else
{
hb_itemPutDS( pItem, ( char * ) pArea->pRecord + pArea->pFieldOffset[ uiIndex ] );
}
break;
case HB_FT_TIME:
@@ -1887,37 +1885,35 @@ static HB_ERRCODE hb_dbfGetValue( DBFAREAP pArea, HB_USHORT uiIndex, PHB_ITEM pI
case HB_FT_ROWVER:
if( pField->uiDec )
{
double dValue;
int iLen;
switch( pField->uiLen )
{
case 1:
dValue = ( HB_SCHAR ) pArea->pRecord[ pArea->pFieldOffset[ uiIndex ] ];
dVal = ( HB_SCHAR ) pArea->pRecord[ pArea->pFieldOffset[ uiIndex ] ];
iLen = 4;
break;
case 2:
dValue = HB_GET_LE_INT16( pArea->pRecord + pArea->pFieldOffset[ uiIndex ] );
dVal = HB_GET_LE_INT16( pArea->pRecord + pArea->pFieldOffset[ uiIndex ] );
iLen = 6;
break;
case 3:
dValue = HB_GET_LE_INT24( pArea->pRecord + pArea->pFieldOffset[ uiIndex ] );
dVal = HB_GET_LE_INT24( pArea->pRecord + pArea->pFieldOffset[ uiIndex ] );
iLen = 10;
break;
case 4:
dValue = HB_GET_LE_INT32( pArea->pRecord + pArea->pFieldOffset[ uiIndex ] );
dVal = HB_GET_LE_INT32( pArea->pRecord + pArea->pFieldOffset[ uiIndex ] );
iLen = 10;
break;
case 8:
dValue = ( double ) HB_GET_LE_INT64( pArea->pRecord + pArea->pFieldOffset[ uiIndex ] );
dVal = ( double ) HB_GET_LE_INT64( pArea->pRecord + pArea->pFieldOffset[ uiIndex ] );
iLen = 20;
break;
default:
dValue = 0;
dVal = 0;
iLen = 0;
fError = HB_TRUE;
break;
}
hb_itemPutNDLen( pItem, hb_numDecConv( dValue, ( int ) pField->uiDec ),
hb_itemPutNDLen( pItem, hb_numDecConv( dVal, ( int ) pField->uiDec ),
iLen, ( int ) pField->uiDec );
}
else
@@ -1958,54 +1954,59 @@ static HB_ERRCODE hb_dbfGetValue( DBFAREAP pArea, HB_USHORT uiIndex, PHB_ITEM pI
break;
case HB_FT_LONG:
case HB_FT_FLOAT:
/* DBASE documentation defines maximum numeric field size as 20
* but Clipper allows to create longer fields so I remove this
* limit, Druzus
*/
/*
if( pField->uiLen > 20 )
fError = HB_TRUE;
else
*/
{
HB_MAXINT lVal;
double dVal;
HB_BOOL fDbl;
fDbl = hb_strnToNum( (const char *) pArea->pRecord + pArea->pFieldOffset[ uiIndex ],
pField->uiLen, &lVal, &dVal );
if( pField->uiDec )
{
hb_itemPutNDLen( pItem, fDbl ? dVal : ( double ) lVal,
( int ) ( pField->uiLen - pField->uiDec - 1 ),
( int ) pField->uiDec );
}
else if( fDbl )
{
hb_itemPutNDLen( pItem, dVal, ( int ) pField->uiLen, 0 );
}
else
{
hb_itemPutNIntLen( pItem, lVal, ( int ) pField->uiLen );
}
fError = HB_TRUE;
break;
}
*/
fDbl = hb_strnToNum( ( const char * ) pArea->pRecord + pArea->pFieldOffset[ uiIndex ],
pField->uiLen, &lVal, &dVal );
if( pField->uiDec )
hb_itemPutNDLen( pItem, fDbl ? dVal : ( double ) lVal,
( int ) ( pField->uiLen - pField->uiDec - 1 ),
( int ) pField->uiDec );
else if( fDbl )
hb_itemPutNDLen( pItem, dVal, ( int ) pField->uiLen, 0 );
else
hb_itemPutNIntLen( pItem, lVal, ( int ) pField->uiLen );
break;
case HB_FT_FLOAT:
pszVal = ( char * ) pArea->pRecord + pArea->pFieldOffset[ uiIndex ];
dVal = hb_strVal( pszVal, pField->uiLen );
nLen = pField->uiLen;
while( --nLen && HB_ISDIGIT( pszVal[ nLen ] ) ) { ; }
if( nLen && ( pszVal[ nLen ] == '+' || pszVal[ nLen ] == '-' ) &&
( pszVal[ nLen - 1 ] == 'e' || pszVal[ nLen - 1 ] == 'E' ) )
{
HB_USHORT uiLen = ( HB_USHORT ) nLen;
int iExp = 0;
while( ++uiLen < pField->uiLen )
iExp = iExp * 10 + ( pszVal[ uiLen ] - '0' );
if( pszVal[ nLen ] == '-' )
iExp = -iExp;
dVal = hb_numExpConv( dVal, -iExp );
}
hb_itemPutNDLen( pItem, dVal,
( int ) ( pField->uiLen - pField->uiDec - 1 ),
( int ) pField->uiDec );
break;
case HB_FT_ANY:
if( pField->uiLen == 3 )
{
hb_itemPutDL( pItem, hb_sxPtoD( ( char * ) pArea->pRecord + pArea->pFieldOffset[ uiIndex ] ) );
}
else if( pField->uiLen == 4 )
{
hb_itemPutNIntLen( pItem, ( HB_MAXINT ) HB_GET_LE_INT32( pArea->pRecord + pArea->pFieldOffset[ uiIndex ] ), 10 );
}
else
{
fError = HB_TRUE;
}
break;
case HB_FT_MEMO: