Files
harbour-core/harbour/source/rtl/val.c
Ron Pinkas 06dad4687f 2001-03-22 11:00 UTC-0800 Ron Pinkas <ron@profit-master.com>
* hb_slex.vc
     * Minor corrections.

   * include/hbapi.h
     + extern PHB_ITEM hb_paramError( int iParam ); /* Returns either the generic parameter or a NIL item if param not provided */
     + extern PHB_ITEM hb_arrayFromStack( USHORT uiLen ); /* Creates and returns an Array of n Elements from the Eval Stack - Does NOT pop the items. */
     + extern PHB_ITEM hb_arrayFromParams( void ); /* Creates and returns an Array of current Generic Parameters. */

   * include/hbapierr.h
     * extern USHORT   hb_errRT_BASE           ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation, USHORT uiArgCount, ... );
     * extern USHORT   hb_errRT_BASE_Ext1      ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation, USHORT uiOsCode, USHORT uiFlags, USHORT uiArgCount, ... );
     * extern PHB_ITEM hb_errRT_BASE_Subst     ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation, USHORT uiArgCount, ... );
     * extern void     hb_errRT_BASE_SubstR    ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation, USHORT uiArgCount, ... );
       + Added support for variable number of Error Arguments.

   * source/rtl/errorapi.c
     * hb_errRT_BASE           ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation, USHORT uiArgCount, ... );
     * hb_errRT_BASE_Ext1      ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation, USHORT uiOsCode, USHORT uiFlags, USHORT uiArgCount, ... );
     * hb_errRT_BASE_Subst     ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation, USHORT uiArgCount, ... );
     * hb_errRT_BASE_SubstR    ( ULONG ulGenCode, ULONG ulSubCode, char * szDescription, char * szOperation, USHORT uiArgCount, ... );
       + Added support for variable number of Error Arguments.

   * source/vm/arrays.c
     + PHB_ITEM hb_arrayFromStack( USHORT uiLen )
     + PHB_ITEM hb_arrayFromParams( void )

   * source/vm/extend.c
      + PHB_ITEM hb_paramError( int iParam )

   * source/rdd/dbcmd.c
     * Added the Error Arguments as parameters to hb_errRT_BASE*().

   * source/rtl/abs.c
   * source/rtl/at.c
   * source/rtl/chrasc.c
   * source/rtl/copyfile.c
   * source/rtl/datec.c
   * source/rtl/dateshb.c
   * source/rtl/diskspac.c
   * source/rtl/disksphb.c
   * source/rtl/do.c
   * source/rtl/left.c
   * source/rtl/len.c
   * source/rtl/math.c
   * source/rtl/minmax.c
   * source/rtl/mod.c
   * source/rtl/philes.c
   * source/rtl/philesx.c
   * source/rtl/replic.c
   * source/rtl/round.c
   * source/rtl/set.c
   * source/rtl/space.c
   * source/rtl/str.c
   * source/rtl/strcase.c
   * source/rtl/strtran.c
   * source/rtl/strzero.c
   * source/rtl/substr.c
   * source/rtl/transfrm.c
   * source/rtl/trim.c
   * source/rtl/type.c
   * source/rtl/val.c
   * source/rtl/word.c
     * Added the Error Arguments as parameters to hb_errRT_BASE*().

   * source/vm/arrayshb.c
   * source/vm/eval.c
   * source/vm/hvm.c
   * source/vm/macro.c
   * source/vm/memvars.c
   * source/vm/runner.c
     * Added the Error Arguments as parameters to hb_errRT_BASE*().

   * source/vm/classes.c
     + Added 0 arguments (J.F. can you please decide what should be the arguments! )

   /* HBTEST now reports 173 failures ( down from 376 ) many of the failures are justified.

      I have tested this as much as I could, but since it invloved lots of "Cust & Pasets" more testing should be done.

      It would be great if someone could review each of HBTEST Reported Failures on a one-by-one basis.

     BTW, HBTEST reports 1 UN-RELEASED Memory Block (from before my changes)!
   */
2001-03-22 19:38:23 +00:00

127 lines
3.9 KiB
C

/*
* $Id$
*/
/*
* Harbour Project source code:
* VAL() function
*
* Copyright 1999 Victor Szakats <info@szelvesz.hu>
* www - http://www.harbour-project.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version, with one exception:
*
* The exception is that if you link the Harbour Runtime Library (HRL)
* and/or the Harbour Virtual Machine (HVM) with other files to produce
* an executable, this does not by itself cause the resulting executable
* to be covered by the GNU General Public License. Your use of that
* executable is in no way restricted on account of linking the HRL
* and/or HVM code into it.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit
* their web site at http://www.gnu.org/).
*
*/
#include <math.h>
#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapierr.h"
/* returns the numeric value of a character string representation of a number */
double hb_strVal( const char * szText, ULONG ulLen )
{
double dValue = 0.0;
ULONG ulPos;
ULONG ulDecPos = 0;
BOOL bNegative = FALSE;
HB_TRACE(HB_TR_DEBUG, ("hb_strVal(%s, %d)", szText, ulLen));
/* Look for sign */
for( ulPos = 0; ulPos < ulLen; ulPos++ )
{
if( szText[ ulPos ] == '-' )
{
bNegative = TRUE;
ulPos++;
break;
}
else if( szText[ ulPos ] == '+' )
{
ulPos++;
break;
}
else if( ! HB_ISSPACE( szText[ ulPos ] ) )
break;
}
/* Build the number */
for(; ulPos < ulLen; ulPos++ )
{
if( szText[ ulPos ] == '.' && ulDecPos == 0 )
{
ulDecPos++;
}
else if( szText[ ulPos ] >= '0' && szText[ ulPos ] <= '9' )
{
if( ulDecPos )
dValue += ( ( double ) ( szText[ ulPos ] - '0' ) ) / pow( 10.0, ( double ) ulDecPos++ );
else
dValue = ( dValue * 10 ) + ( ( double ) ( szText[ ulPos ] - '0' ) );
}
else
break;
}
return bNegative && dValue != 0.0 ? -dValue : dValue;
}
/* returns the numeric value of a character string representation of a number */
HB_FUNC( VAL )
{
PHB_ITEM pText = hb_param( 1, HB_IT_STRING );
if( pText )
{
char * szText = hb_itemGetCPtr( pText );
int iWidth = ( int ) hb_itemGetCLen( pText );
int iDec;
double dValue = hb_strVal( szText, hb_itemGetCLen( pText ) );
for( iDec = 0; iDec < iWidth && szText[ iDec ] != '.'; iDec++ );
if( iDec >= iWidth - 1 )
hb_retnlen( dValue, iWidth, 0 );
else
{
/* NOTE: Kludge Warning! This condition:
"|| ( iDec == 1 && szText[ 0 ] == '-' && dValue != 0.0 )"
may not be the generic way to handle the width of this "-.1"
string. I could not find a matching case which
fails for the same reason, nor a better way to handle it.
The problem is that in this case only, the width is
calculated upon conditions which can only be discovered by
parsing the string, but the parsing is made by a lower level
generic function. [vszakats] */
hb_retnlen( dValue, iDec + ( iDec == 0 || ( iDec == 1 && szText[ 0 ] == '-' && dValue != 0.0 ) ? 1 : 0 ), iWidth - iDec - 1 );
}
}
else
hb_errRT_BASE_SubstR( EG_ARG, 1098, NULL, "VAL", 1, hb_paramError( 1 ) );
}