2016-06-20 21:59 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)

* doc/cmpopt.txt
    * enumeration
    ! typos

  * src/codepage/uckam.c
    + added info about Kamenicky codepage number: CP895

  * include/hbapi.h
  * src/common/hbstr.c
    + added new C function:
         char * hb_dblToStr( char * szBuf, HB_SIZE nSize,
                             double dNumber, int iMaxDec );
      it converts numeric value to string trying to keep all significant
      digits in double numbers

  * include/harbour.hbx
  * src/rtl/hbntos.c
    + added new PRG function:
         hb_ntoc( <nValue> ) -> cValue
      it converts numeric value to string trying to keep all significant
      digits in double numbers

  * src/rtl/hbsocket.c
    + added support for error codes returned by
      getaddrinfo() / getnameinfo() and gethostbyname() / gethostbyaddr()

  * src/rtl/hbinet.c
    + set HB_SOCKET_ERR_WRONGADDR error code if hb_socketResolveAddr()
      returns NULL without setting error code

  * src/vm/arrays.c
  * src/vm/hashfunc.c
    ! fix hb_HScan(), AScan(), hb_AScan() and hb_RAScan() for very large
      integers with more then 53 significant bits. Such bits were lost
      after conversion to double value used in scan process

  * src/vm/itemapi.c
    * formatting

  * src/rtl/gtwvt/gtwvt.c
    ! do not convert characters received with ALTGR or ALT+CTRL flags to
      extended keycodes - some national keyboards may use such combination
      for national characters and even pure ASCII ones
This commit is contained in:
Przemysław Czerpak
2016-06-20 21:59:34 +02:00
parent 88fc3b1579
commit 6df7fc6132
13 changed files with 415 additions and 23 deletions

View File

@@ -1,5 +1,5 @@
/*
* Czech and Slovak Kamenicky <-> Unicode conversion table
* Czech and Slovak Kamenicky (CP895) <-> Unicode conversion table
*
* Copyright 2006 Vojtech Obrdlik <vobrdlik@centrum.cz>
* adapted from David Kozub - http://linux.fjfi.cvut.cz/%7Ezub/cp895/

View File

@@ -819,6 +819,124 @@ char * hb_numToStr( char * szBuf, HB_SIZE nSize, HB_MAXINT lNumber )
return &szBuf[ iPos ];
}
/* if you want to be sure that size of buffer is enough to hold each
double number with '\0' terminating character then it should have
at least HB_MAX_DOUBLE_LENGTH bytes. If buffer is not large enough
then NULL is returned */
char * hb_dblToStr( char * szBuf, HB_SIZE nSize, double dNumber, int iMaxDec )
{
double dInt, dFract, dDig, doBase = 10.0;
int iLen, iPos, iPrec;
char * szResult;
HB_BOOL fFirst;
HB_TRACE( HB_TR_DEBUG, ( "hb_dblToStr(%p, %" HB_PFS "u, %f, %d)", szBuf, nSize, dNumber, iMaxDec ) );
iLen = ( int ) ( nSize - 1 );
if( iLen <= 0 )
return NULL;
#ifdef HB_NUM_PRECISION
iPrec = HB_NUM_PRECISION;
#else
iPrec = 16;
#endif
szResult = szBuf;
if( dNumber < 0 )
{
if( --iLen == 0 )
return NULL;
*szBuf++ = '-';
dFract = modf( -dNumber, &dInt );
}
else
dFract = modf( dNumber, &dInt );
iPos = iLen;
do
{
dDig = modf( dInt / doBase + 0.01, &dInt ) * doBase;
szBuf[ --iPos ] = '0' + ( char ) ( dDig + 0.01 );
if( iPos == 0 )
{
if( dInt >= 1 )
return NULL;
break;
}
}
while( dInt >= 1 );
if( iPos > 0 )
memmove( szBuf, szBuf + iPos, HB_MIN( iLen - iPos, iPrec ) );
iPos = iLen - iPos;
fFirst = iPos > 1 || szBuf[ 0 ] != '0';
if( fFirst )
{
if( iPos >= iPrec )
{
while( iPrec < iPos )
szBuf[ iPrec++ ] = '0';
iPrec = 0;
}
else
iPrec -= iPos;
}
while( dInt >= 1 )
{
if( iPos >= iLen )
return NULL;
dDig = modf( dInt / doBase + 0.01, &dInt ) * doBase;
szBuf[ iPos++ ] = iPrec-- > 0 ? '0' + ( char ) ( dDig + 0.01 ) : '0';
}
if( iPrec > 0 && iLen - iPos > 1 && iMaxDec != 0 && dFract > 0 )
{
int iDec = iPos;
szBuf[ iPos ] = '.';
while( ++iPos < iLen && iPrec > 0 && iMaxDec-- != 0 )
{
dFract = modf( dFract * doBase, &dDig );
szBuf[ iPos ] = '0' + ( char ) ( dDig + 0.01 );
if( szBuf[ iPos ] != '0' )
fFirst = HB_TRUE;
if( fFirst )
--iPrec;
}
if( dFract > ( iPrec > 0 ? 0.5 - hb_numPow10( -iPrec ) : 0.2 ) )
{
iPrec = iPos;
for( ;; )
{
if( --iPrec < 0 )
{
memmove( szBuf + 1, szBuf, iPos );
*szBuf = '1';
if( iPos < iLen )
++iPos;
++iDec;
break;
}
if( iPrec == iDec )
--iPrec;
if( szBuf[ iPrec ] != '9' )
{
++szBuf[ iPrec ];
break;
}
szBuf[ iPrec ] = '0';
}
}
while( iPos > iDec && szBuf[ iPos - 1 ] == '0' )
--iPos;
if( szBuf[ iPos - 1 ] == '.' )
--iPos;
}
szBuf[ iPos ] = '\0';
return iPos == 1 && *szResult == '-' && *szBuf == '0' ? szBuf : szResult;
}
/*
* This function copies szText to destination buffer.
* NOTE: Unlike the documentation for strncpy, this routine will always append

View File

@@ -140,6 +140,8 @@ static HB_CRITICAL_NEW( s_wvtMtx );
#endif
#endif
#define HB_KF_ALTGR 0x10
static PHB_GTWVT s_wvtWindows[ WVT_MAX_WINDOWS ];
static int s_wvtCount = 0;
@@ -2133,8 +2135,21 @@ static int hb_gt_wvt_GetKeyFlags( void )
iFlags |= HB_KF_SHIFT;
if( GetKeyState( VK_CONTROL ) & 0x8000 )
iFlags |= HB_KF_CTRL;
if( GetKeyState( VK_MENU ) & 0x8000 )
if( GetKeyState( VK_RMENU ) & 0x8000 )
iFlags |= HB_KF_ALT;
if( GetKeyState( VK_LMENU ) & 0x8000 )
iFlags |= HB_KF_ALTGR;
return iFlags;
}
static int hb_gt_wvt_UpdateKeyFlags( int iFlags )
{
if( iFlags & HB_KF_ALTGR )
{
iFlags |= HB_KF_ALT;
iFlags &= ~HB_KF_ALTGR;
}
return iFlags;
}
@@ -2384,7 +2399,8 @@ static void hb_gt_wvt_MouseEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, L
if( keyCode != 0 )
hb_gt_wvt_AddCharToInputQueue( pWVT,
HB_INKEY_NEW_MKEY( keyCode, hb_gt_wvt_GetKeyFlags() ) );
HB_INKEY_NEW_MKEY( keyCode,
hb_gt_wvt_UpdateKeyFlags( hb_gt_wvt_GetKeyFlags() ) ) );
}
static HB_BOOL hb_gt_wvt_KeyEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, LPARAM lParam )
@@ -2524,7 +2540,7 @@ static HB_BOOL hb_gt_wvt_KeyEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam,
pWVT->IgnoreWM_SYSCHAR = HB_TRUE;
iKey = ( int ) wParam - VK_NUMPAD0 + '0';
}
else if( iFlags == HB_KF_ALT )
else if( iFlags == HB_KF_ALT || iFlags == HB_KF_ALTGR )
iFlags = 0; /* for ALT + <ASCII_VALUE_FROM_KEYPAD> */
iFlags |= HB_KF_KEYPAD;
break;
@@ -2575,7 +2591,7 @@ static HB_BOOL hb_gt_wvt_KeyEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam,
iKey = iKeyPad;
if( ( lParam & WVT_EXTKEY_FLAG ) == 0 )
{
if( iFlags == HB_KF_ALT )
if( iFlags == HB_KF_ALT || iFlags == HB_KF_ALTGR )
iFlags = iKey = 0; /* for ALT + <ASCII_VALUE_FROM_KEYPAD> */
else
iFlags |= HB_KF_KEYPAD;
@@ -2583,13 +2599,16 @@ static HB_BOOL hb_gt_wvt_KeyEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam,
}
pWVT->keyFlags = iFlags;
if( iKey != 0 )
iKey = HB_INKEY_NEW_KEY( iKey, iFlags );
iKey = HB_INKEY_NEW_KEY( iKey, hb_gt_wvt_UpdateKeyFlags( iFlags ) );
break;
case WM_CHAR:
if( ( iFlags & HB_KF_CTRL ) != 0 && ( iFlags & HB_KF_ALT ) != 0 )
if( ( iFlags & HB_KF_CTRL ) != 0 ? ( iFlags & HB_KF_ALT ) != 0 :
( ( iFlags & HB_KF_ALTGR ) != 0 ) )
/* workaround for AltGR and German keyboard */
iFlags &= ~( HB_KF_CTRL | HB_KF_ALT );
iFlags &= ~( HB_KF_CTRL | HB_KF_ALT | HB_KF_ALTGR );
else
iFlags = hb_gt_wvt_UpdateKeyFlags( iFlags );
case WM_SYSCHAR:
if( ! pWVT->IgnoreWM_SYSCHAR )
{

View File

@@ -1272,7 +1272,11 @@ static void hb_inetConnectInternal( HB_BOOL fResolve )
szHost = szAddr = hb_socketResolveAddr( szHost, HB_SOCKET_AF_INET );
if( fResolve && ! szAddr )
{
hb_inetGetError( socket );
if( socket->iError == 0 )
socket->iError = HB_SOCKET_ERR_WRONGADDR;
}
else
{
/* Creates comm socket */

View File

@@ -2,6 +2,7 @@
* hb_ntos() function
*
* Copyright 2008 Viktor Szakats (vszakats.net/harbour)
* Copyright 2016 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
*
* 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
@@ -72,3 +73,37 @@ HB_FUNC( HB_NTOS )
hb_retc_null();
}
HB_FUNC( HB_NTOC )
{
PHB_ITEM pNumber = hb_param( 1, HB_IT_NUMERIC );
if( pNumber )
{
char szBuffer[ HB_MAX_DOUBLE_LENGTH ];
if( ! HB_IS_DOUBLE( pNumber ) )
{
HB_MAXINT nNumber = hb_itemGetNInt( pNumber );
int iPos = sizeof( szBuffer );
HB_BOOL fNeg = nNumber < 0;
if( fNeg )
nNumber = -nNumber;
szBuffer[ --iPos ] = '\0';
do
{
szBuffer[ --iPos ] = '0' + ( char ) ( nNumber % 10 );
nNumber /= 10;
}
while( nNumber != 0 );
hb_retc( szBuffer + iPos );
}
else
hb_retc( hb_dblToStr( szBuffer, sizeof( szBuffer ),
hb_itemGetND( pNumber ), hb_parnidef( 2, 20 ) ) );
}
else
hb_retc_null();
}

View File

@@ -183,6 +183,7 @@
# endif
# define HB_IS_INET_NTOA_MT_SAFE
# define HB_HAS_GETHOSTBYADDR
# define hb_socketSetResolveError( err ) hb_socketSetOsError( err )
#elif defined( HB_OS_OS2 )
# if defined( __WATCOMC__ )
# define HB_HAS_INET_PTON
@@ -209,6 +210,10 @@
/* # define HB_HAS_INET6 */
#endif
#if defined( HB_HAS_NAMEINFO ) && ! defined( HB_HAS_ADDRINFO )
# undef HB_HAS_NAMEINFO
#endif
#if defined( HB_OS_WIN )
# include <winsock2.h>
@@ -812,14 +817,17 @@ PHB_ITEM hb_socketGetIFaces( int af, HB_BOOL fNoAliases )
#if defined( HB_OS_WIN )
# define HB_SOCK_GETERROR() WSAGetLastError()
# define HB_SOCK_GETHERROR() WSAGetLastError()
# define HB_SOCK_IS_EINTR( err ) ( (err) == WSAEINTR )
# define HB_SOCK_IS_EINPROGRES( err ) ( (err) == WSAEWOULDBLOCK )
#elif defined( HB_OS_OS2 ) && defined( __WATCOMC__ )
# define HB_SOCK_GETERROR() sock_errno()
# define HB_SOCK_GETHERROR() h_errno
# define HB_SOCK_IS_EINTR( err ) ( (err) == EINTR )
# define HB_SOCK_IS_EINPROGRES( err ) ( (err) == EINPROGRESS )
#else
# define HB_SOCK_GETERROR() errno
# define HB_SOCK_GETHERROR() h_errno
# define HB_SOCK_IS_EINTR( err ) ( (err) == EINTR )
# define HB_SOCK_IS_EINPROGRES( err ) ( (err) == EINPROGRESS )
#endif
@@ -1088,6 +1096,9 @@ static void hb_socketSetOsError( int err )
case WSA_E_CANCELLED:
uiErr = HB_SOCKET_ERR_CANCELLED;
break;
case WSA_NOT_ENOUGH_MEMORY:
uiErr = HB_SOCKET_ERR_NOMEM;
break;
default:
uiErr = HB_SOCKET_ERR_OTHER;
break;
@@ -1323,7 +1334,93 @@ static void hb_socketSetOsError( int err )
break;
# endif
#endif
/*
default:
uiErr = HB_SOCKET_ERR_OTHER;
break;
}
#endif
pError->uiSocketError = uiErr;
pError->iSocketOsError = err;
}
#if ! defined( HB_OS_WIN )
static void hb_socketSetResolveError( int err )
{
PHB_IOERRORS pError = hb_stackIOErrors();
HB_ERRCODE uiErr;
switch( err )
{
case 0:
uiErr = 0;
break;
#if defined( HB_HAS_ADDRINFO ) || defined( HB_HAS_NAMEINFO )
/* getaddrinfo() / getnameinfo() */
#if defined( EAI_AGAIN )
case EAI_AGAIN:
uiErr = HB_SOCKET_ERR_TRYAGAIN;
break;
#endif
#if defined( EAI_BADFLAGS )
case EAI_BADFLAGS:
uiErr = HB_SOCKET_ERR_INVAL;
break;
#endif
#if defined( EAI_FAIL )
case EAI_FAIL:
uiErr = HB_SOCKET_ERR_NORECOVERY;
break;
#endif
#if defined( EAI_ADDRFAMILY )
case EAI_ADDRFAMILY:
#endif
#if defined( EAI_FAMILY )
case EAI_FAMILY:
uiErr = HB_SOCKET_ERR_AFNOSUPPORT;
break;
#endif
#if defined( EAI_MEMORY )
case EAI_MEMORY:
uiErr = HB_SOCKET_ERR_NOMEM;
break;
#endif
#if defined( EAI_NODATA )
case EAI_NODATA:
uiErr = HB_SOCKET_ERR_NODATA;
break;
#endif
#if defined( EAI_NONAME )
case EAI_NONAME:
uiErr = HB_SOCKET_ERR_HOSTNOTFOUND;
break;
#endif
#if defined( EAI_OVERFLOW )
case EAI_OVERFLOW:
uiErr = HB_SOCKET_ERR_NAMETOOLONG;
break;
#endif
#if defined( EAI_SERVICE )
case EAI_SERVICE:
uiErr = HB_SOCKET_ERR_TYPENOTFOUND;
break;
#endif
#if defined( EAI_SOCKTYPE )
case EAI_SOCKTYPE:
uiErr = HB_SOCKET_ERR_NOSUPPORT;
break;
#endif
#if defined( EAI_SYSTEM )
case EAI_SYSTEM:
uiErr = HB_SOCKET_ERR_SYSCALLFAILURE;
break;
#endif
#else /* ! HB_HAS_ADDRINFO && ! HB_HAS_NAMEINFO */
/* gethostbyname() / gethostbyaddr() */
#if defined( TRY_AGAIN )
case TRY_AGAIN:
uiErr = HB_SOCKET_ERR_TRYAGAIN;
@@ -1350,16 +1447,17 @@ static void hb_socketSetOsError( int err )
uiErr = HB_SOCKET_ERR_NODATA;
break;
#endif
*/
#endif /* ! HB_HAS_ADDRINFO && ! HB_HAS_NAMEINFO */
default:
uiErr = HB_SOCKET_ERR_OTHER;
uiErr = HB_SOCKET_ERR_WRONGADDR;
break;
}
#endif
pError->uiSocketError = uiErr;
pError->iSocketOsError = err;
}
#endif
#if defined( HB_SOCKET_TRANSLATE_DOMAIN )
static int hb_socketTransDomain( int domain, int *err )
@@ -3267,11 +3365,14 @@ HB_BOOL hb_socketResolveInetAddr( void ** pSockAddr, unsigned * puiLen, const ch
{
#if defined( HB_HAS_ADDRINFO )
struct addrinfo hints, * res = NULL;
int iError;
hb_vmUnlock();
memset( &hints, 0, sizeof( hints ) );
hints.ai_family = AF_INET;
if( getaddrinfo( szAddr, NULL, &hints, &res ) == 0 )
iError = getaddrinfo( szAddr, NULL, &hints, &res );
hb_socketSetResolveError( iError );
if( iError == 0 )
{
if( ( int ) res->ai_addrlen >= ( int ) sizeof( struct sockaddr_in ) &&
hb_socketGetAddrFamily( res->ai_addr, ( unsigned ) res->ai_addrlen ) == AF_INET )
@@ -3287,6 +3388,7 @@ HB_BOOL hb_socketResolveInetAddr( void ** pSockAddr, unsigned * puiLen, const ch
hb_vmUnlock();
he = gethostbyname( szAddr );
hb_socketSetResolveError( he == NULL ? HB_SOCK_GETHERROR() : 0 );
if( he && he->h_addr_list[ 0 ] )
{
sa.sin_addr.s_addr = ( ( struct in_addr * ) he->h_addr_list[ 0 ] )->s_addr;
@@ -3316,6 +3418,7 @@ char * hb_socketResolveAddr( const char * szAddr, int af )
{
char * szResult = NULL;
HB_BOOL fTrans = HB_FALSE;
int iError = 0;
if( ! szAddr || ! *szAddr )
return NULL;
@@ -3345,6 +3448,8 @@ char * hb_socketResolveAddr( const char * szAddr, int af )
sin.s_addr = ( ( struct in_addr * ) he->h_addr_list[ 0 ] )->s_addr;
fTrans = HB_TRUE;
}
else
iError = HB_SOCK_GETHERROR();
hb_vmLock();
}
#endif
@@ -3397,7 +3502,8 @@ char * hb_socketResolveAddr( const char * szAddr, int af )
# endif
memset( &hints, 0, sizeof( hints ) );
hints.ai_family = af;
if( getaddrinfo( szAddr, NULL, &hints, &res ) == 0 )
iError = getaddrinfo( szAddr, NULL, &hints, &res );
if( iError == 0 )
{
szResult = hb_socketAddrGetName( res->ai_addr, ( unsigned ) res->ai_addrlen );
freeaddrinfo( res );
@@ -3405,6 +3511,7 @@ char * hb_socketResolveAddr( const char * szAddr, int af )
hb_vmLock();
#endif
}
hb_socketSetResolveError( iError );
return szResult;
}
@@ -3424,6 +3531,7 @@ PHB_ITEM hb_socketGetHosts( const char * szAddr, int af )
memset( &hints, 0, sizeof( hints ) );
hints.ai_family = af;
iResult = getaddrinfo( szAddr, NULL, &hints, &res );
hb_socketSetResolveError( iResult );
hb_vmLock();
if( iResult == 0 )
@@ -3467,7 +3575,7 @@ PHB_ITEM hb_socketGetHosts( const char * szAddr, int af )
}
freeaddrinfo( res );
}
#else
#else /* ! HB_HAS_ADDRINFO */
if( af == HB_SOCKET_AF_INET )
{
@@ -3501,6 +3609,8 @@ PHB_ITEM hb_socketGetHosts( const char * szAddr, int af )
if( he == NULL )
he = gethostbyname( szAddr );
hb_socketSetResolveError( he == NULL ? HB_SOCK_GETHERROR() : 0 );
hb_vmLock();
if( he )
@@ -3565,20 +3675,24 @@ char * hb_socketGetHostName( const void * pSockAddr, unsigned len )
hb_vmUnlock();
iResult = getnameinfo( ( const struct sockaddr * ) pSockAddr, len, szHost, NI_MAXHOST, NULL, 0, 0 );
hb_socketSetResolveError( iResult );
hb_vmLock();
if( iResult == 0 )
szResult = hb_strdup( szHost );
#elif defined( HB_HAS_ADDRINFO ) && ! defined( HB_HAS_GETHOSTBYADDR )
#elif defined( HB_HAS_ADDRINFO )
char * szAddr = hb_socketAddrGetName( pSockAddr, len );
if( szAddr )
{
struct addrinfo hints, * res = NULL;
int iError;
hb_vmUnlock();
memset( &hints, 0, sizeof( hints ) );
hints.ai_family = af;
hints.ai_flags = AI_CANONNAME;
if( getaddrinfo( szAddr, NULL, &hints, &res ) == 0 )
iError = getaddrinfo( szAddr, NULL, &hints, &res );
hb_socketSetResolveError( iError );
if( iError == 0 )
{
if( res->ai_canonname )
szResult = hb_strdup( res->ai_canonname );
@@ -3586,7 +3700,7 @@ char * hb_socketGetHostName( const void * pSockAddr, unsigned len )
}
hb_vmLock();
}
#else
#else /* ! HB_HAS_ADDRINFO */
struct hostent * he = NULL;
if( af == AF_INET )
@@ -3595,6 +3709,7 @@ char * hb_socketGetHostName( const void * pSockAddr, unsigned len )
const struct sockaddr_in * sa = ( const struct sockaddr_in * ) pSockAddr;
hb_vmUnlock();
he = gethostbyaddr( ( const char * ) &sa->sin_addr, sizeof( sa->sin_addr ), af );
hb_socketSetResolveError( he == NULL ? HB_SOCK_GETHERROR() : 0 );
hb_vmLock();
#else
char * szAddr = hb_socketAddrGetName( pSockAddr, len );
@@ -3602,6 +3717,7 @@ char * hb_socketGetHostName( const void * pSockAddr, unsigned len )
{
hb_vmUnlock();
he = gethostbyname( szAddr );
hb_socketSetResolveError( he == NULL ? HB_SOCK_GETHERROR() : 0 );
hb_vmLock();
}
#endif
@@ -3612,12 +3728,13 @@ char * hb_socketGetHostName( const void * pSockAddr, unsigned len )
const struct sockaddr_in6 * sa = ( const struct sockaddr_in6 * ) pSockAddr;
hb_vmUnlock();
he = gethostbyaddr( ( const char * ) &sa->sin6_addr, sizeof( sa->sin6_addr ), af );
hb_socketSetResolveError( he == NULL ? HB_SOCK_GETHERROR() : 0 );
hb_vmLock();
}
#endif
if( he && he->h_name )
szResult = hb_strdup( he->h_name );
#endif
#endif /* ! HB_HAS_ADDRINFO */
}
return szResult;
}

View File

@@ -1075,6 +1075,20 @@ HB_SIZE hb_arrayScan( PHB_ITEM pArray, PHB_ITEM pValue, HB_SIZE * pnStart, HB_SI
}
while( --nCount > 0 );
}
else if( HB_IS_NUMINT( pValue ) )
{
HB_MAXINT nValue = hb_itemGetNInt( pValue );
do
{
PHB_ITEM pItem = pBaseArray->pItems + nStart++;
if( HB_IS_NUMERIC( pItem ) && hb_itemGetNInt( pItem ) == nValue &&
hb_itemGetND( pItem ) == ( double ) nValue )
return nStart;
}
while( --nCount > 0 );
}
else if( HB_IS_NUMERIC( pValue ) )
{
double dValue = hb_itemGetND( pValue );
@@ -1242,6 +1256,20 @@ HB_SIZE hb_arrayRevScan( PHB_ITEM pArray, PHB_ITEM pValue, HB_SIZE * pnStart, HB
}
while( --nCount && nStart-- );
}
else if( HB_IS_NUMINT( pValue ) )
{
HB_MAXINT nValue = hb_itemGetNInt( pValue );
do
{
PHB_ITEM pItem = pBaseArray->pItems + nStart;
if( HB_IS_NUMERIC( pItem ) && hb_itemGetNInt( pItem ) == nValue &&
hb_itemGetND( pItem ) == ( double ) nValue )
return nStart + 1;
}
while( --nCount && nStart-- );
}
else if( HB_IS_NUMERIC( pValue ) )
{
double dValue = hb_itemGetND( pValue );

View File

@@ -514,6 +514,26 @@ HB_FUNC( HB_HSCAN )
++nStart;
}
}
else if( HB_IS_NUMINT( pValue ) )
{
HB_MAXINT nValue = hb_itemGetNInt( pValue );
while( nCount-- )
{
PHB_ITEM pItem = hb_hashGetValueAt( pHash, nStart );
if( pItem )
{
if( HB_IS_NUMERIC( pItem ) && hb_itemGetNInt( pItem ) == nValue &&
hb_itemGetND( pItem ) == ( double ) nValue )
{
fFound = HB_TRUE;
break;
}
}
else
break;
++nStart;
}
}
else if( HB_IS_NUMERIC( pValue ) )
{
double dValue = hb_itemGetND( pValue );

View File

@@ -2060,7 +2060,7 @@ PHB_ITEM hb_itemReSizeString( PHB_ITEM pItem, HB_SIZE nSize )
{
HB_SIZE nAlloc = nSize + 1 +
( pItem->item.asString.allocated <= nSize ? nSize : 0 );
pItem->item.asString.value = ( char* )
pItem->item.asString.value = ( char * )
hb_xRefResize( pItem->item.asString.value,
pItem->item.asString.length,
nAlloc, &pItem->item.asString.allocated );