From 030f9c0b24a21ee18feb4794f180dc5dacb543af Mon Sep 17 00:00:00 2001 From: Eddie Runia Date: Sun, 23 May 1999 11:25:04 +0000 Subject: [PATCH] By ref problem --- harbour/ChangeLog | 9 +++++++++ harbour/include/types.h | 4 ++-- harbour/source/rtl/strings.c | 6 +++--- harbour/source/vm/hvm.c | 24 +++++++++++++++++------- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 9c9269a734..bf4472b069 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,12 @@ +19990523-12:20 CET Eddie Runia + * include/types.h + modified the IS_* to work for reference passed variables + * source/vm/hvm.c + Changed ->wType to IS_* if possible else added & ~IT_BYREF + * source/rtl/strings.c + Strings also modified + + 19990523-11:36 CET Manuel Ruiz * source/rtl/files.c Add HAVE_POSIX_IO for Borland and GCC compilers diff --git a/harbour/include/types.h b/harbour/include/types.h index 10eeb725fa..74ddd18127 100644 --- a/harbour/include/types.h +++ b/harbour/include/types.h @@ -69,9 +69,9 @@ typedef HARBOUR ( * HARBOURFUNC )( void ); #define _POSIX_PATH_MAX 255 #endif -#define IS_OF_TYPE( p, t ) ( ( p )->wType == t ) +#define IS_BYREF( p ) ( ( p )->wType & IT_BYREF ) +#define IS_OF_TYPE( p, t ) ( ( ( p )->wType & ~IT_BYREF ) == t ) #define IS_ARRAY( p ) IS_OF_TYPE( p, IT_ARRAY ) -#define IS_BYREF( p ) IS_OF_TYPE( p, IT_BYREF ) #define IS_NIL( p ) IS_OF_TYPE( p, IT_NIL ) #define IS_BLOCK( p ) IS_OF_TYPE( p, IT_BLOCK ) #define IS_DATE( p ) IS_OF_TYPE( p, IT_DATE ) diff --git a/harbour/source/rtl/strings.c b/harbour/source/rtl/strings.c index 88f52aa3ef..91d4d0ad3e 100644 --- a/harbour/source/rtl/strings.c +++ b/harbour/source/rtl/strings.c @@ -310,7 +310,7 @@ HARBOUR AT( void ) if( pText && pSub ) { - if( pText->wType == IT_STRING && pSub->wType == IT_STRING ) + if( IS_STRING( pText ) && IS_STRING( pSub ) ) { _retnl( hb_strAt(pSub->value.szText, pSub->wLength, pText->value.szText, pText->wLength) ); } @@ -1046,7 +1046,7 @@ char * hb_str( PITEM pNumber, PITEM pWidth, PITEM pDec ) /* Be paranoid and use a large amount of padding */ szResult = (char *)_xgrab( iWidth + iDec + 64 ); - if( pNumber->wType == IT_DOUBLE || iDec != 0 ) + if( IS_DOUBLE( pNumber ) || iDec != 0 ) { double dNumber = _parnd( 1 ); if( iDec > 0 ) @@ -1054,7 +1054,7 @@ char * hb_str( PITEM pNumber, PITEM pWidth, PITEM pDec ) else iBytes = sprintf( szResult, "%*ld", iWidth, (long)dNumber ); } - else switch( pNumber->wType ) + else switch( pNumber->wType & ~IT_BYREF ) { case IT_LONG: iBytes = sprintf( szResult, "%*li", iWidth, pNumber->value.lNumber ); diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index 128db041a4..5780e2db9b 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -1058,11 +1058,13 @@ void Instring( void ) PITEM pItem1 = stack.pPos - 2; PITEM pItem2 = stack.pPos - 1; int iResult; + ULONG ul; if( IS_STRING( pItem1 ) && IS_STRING( pItem2 ) ) { - iResult = hb_strAt( pItem1->value.szText, pItem1->wLength, - pItem2->value.szText, pItem2->wLength ); + for( iResult = 0, ul = 0; !iResult && ul < (ULONG) pItem1->wLength; ul++ ) + iResult = hb_strAt( pItem1->value.szText + ul, 1, + pItem2->value.szText, pItem2->wLength ); StackPop(); StackPop(); PushLogical( iResult == 0 ? 0 : 1 ); @@ -1464,7 +1466,7 @@ double PopDouble( void ) StackPop(); - switch( stack.pPos->wType ) + switch( stack.pPos->wType & ~IT_BYREF ) { case IT_INTEGER: d = stack.pPos->value.iNumber; @@ -1535,7 +1537,7 @@ double PopNumber( void ) StackPop(); - switch( pItem->wType ) + switch( pItem->wType & ~IT_BYREF ) { case IT_INTEGER: dNumber = ( double ) pItem->value.iNumber; @@ -1593,9 +1595,17 @@ void PushLogical( int iTrueFalse ) void PushLocal( SHORT iLocal ) { + PITEM pLocal; + if( iLocal >= 0 ) + { /* local variable or local parameter */ - ItemCopy( stack.pPos, stack.pBase + 1 + iLocal ); + pLocal = stack.pBase + 1 + iLocal; + if( IS_BYREF( pLocal ) ) + ItemCopy( stack.pPos, stack.pItems + pLocal->value.wItem ); + else + ItemCopy( stack.pPos, pLocal ); + } else /* local variable referenced in a codeblock */ ItemCopy( stack.pPos, CodeblockGetVar( stack.pBase + 1, iLocal ) ); @@ -2039,7 +2049,7 @@ HARBOUR EMPTY() if( pItem ) { - switch( pItem->wType ) + switch( pItem->wType & ~IT_BYREF ) { case IT_ARRAY: _retl( ( ( PBASEARRAY ) pItem->value.pBaseArray )->ulLen == 0 ); @@ -2091,7 +2101,7 @@ HARBOUR VALTYPE( void ) { pItem = _param( 1, IT_ANY ); - switch( pItem->wType ) + switch( pItem->wType & ~IT_BYREF ) { case IT_ARRAY: if( ( ( PBASEARRAY ) pItem->value.pBaseArray )->wClass )