From 58ff9119943dbcbda8702165af7072fa73758fc4 Mon Sep 17 00:00:00 2001 From: "David G. Holm" Date: Fri, 10 Aug 2001 16:20:17 +0000 Subject: [PATCH] See ChangeLog entry 2001-08-10 12:15 UTC-0400 David G. Holm --- harbour/ChangeLog | 6 ++++ harbour/source/vm/extend.c | 61 +++++++++++++++++++++++++++++--------- 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index aed85efd3f..aaa80da9d1 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,9 @@ +2001-08-10 12:15 UTC-0400 David G. Holm + + * source/vm/extend.c + Submitted by Ricardo Ramirez R. + ! Allow hb_stor... functions to store to arrays passed by reference + 2001-08-09 20:45 UTC-0800 Ron Pinkas * contrib/dot/pp.prg * Corrected logic for closing ppo output file. diff --git a/harbour/source/vm/extend.c b/harbour/source/vm/extend.c index a9783b883f..0f3c3fde8a 100644 --- a/harbour/source/vm/extend.c +++ b/harbour/source/vm/extend.c @@ -1,3 +1,4 @@ + /* * $Id$ */ @@ -64,6 +65,9 @@ * Copyright 2000 Jose Lalin * hb_retd() * + * Modifications to hb_stor functions by Ricardo Ramirez R. + * + * * See doc/license.txt for licensing terms. * */ @@ -582,6 +586,10 @@ void hb_storc( char * szText, int iParam, ... ) if( ( iParam >= 0 && iParam <= hb_pcount() ) || ( iParam == -1 ) ) { PHB_ITEM pItem = ( iParam == -1 ) ? &hb_stack.Return : hb_stackItemFromBase( iParam ); + int iByRef = HB_IS_BYREF( pItem ); + + if( iByRef ) + pItem = hb_itemUnRef( pItem ); if( HB_IS_ARRAY( pItem ) ) { @@ -592,8 +600,8 @@ void hb_storc( char * szText, int iParam, ... ) va_end( va ); hb_itemRelease( pItemNew ); } - else if( HB_IS_BYREF( pItem ) || iParam == -1 ) - hb_itemPutC( hb_itemUnRef( pItem ), szText ); + else if( iByRef || iParam == -1 ) + hb_itemPutC( pItem, szText ); } } @@ -604,6 +612,10 @@ void hb_storclen( char * szText, ULONG ulLen, int iParam, ... ) if( ( iParam >= 0 && iParam <= hb_pcount() ) || ( iParam == -1 ) ) { PHB_ITEM pItem = ( iParam == -1 ) ? &hb_stack.Return : hb_stackItemFromBase( iParam ); + int iByRef = HB_IS_BYREF( pItem ); + + if( iByRef ) + pItem = hb_itemUnRef( pItem ); if( HB_IS_ARRAY( pItem ) ) { @@ -614,8 +626,8 @@ void hb_storclen( char * szText, ULONG ulLen, int iParam, ... ) va_end( va ); hb_itemRelease( pItemNew ); } - else if( HB_IS_BYREF( pItem ) || iParam == -1 ) - hb_itemPutCL( hb_itemUnRef( pItem ), szText, ulLen ); + else if( iByRef || iParam == -1 ) + hb_itemPutCL( pItem, szText, ulLen ); } } @@ -628,6 +640,10 @@ void hb_stords( char * szDate, int iParam, ... ) if( ( iParam >= 0 && iParam <= hb_pcount() ) || ( iParam == -1 ) ) { PHB_ITEM pItem = ( iParam == -1 ) ? &hb_stack.Return : hb_stackItemFromBase( iParam ); + int iByRef = HB_IS_BYREF( pItem ); + + if( iByRef ) + pItem = hb_itemUnRef( pItem ); if( HB_IS_ARRAY( pItem ) ) { @@ -638,8 +654,8 @@ void hb_stords( char * szDate, int iParam, ... ) va_end( va ); hb_itemRelease( pItemNew ); } - else if( HB_IS_BYREF( pItem ) || iParam == -1 ) - hb_itemPutDS( hb_itemUnRef( pItem ), szDate ); + else if( iByRef || iParam == -1 ) + hb_itemPutDS( pItem, szDate ); } } @@ -650,6 +666,10 @@ void hb_storl( int iLogical, int iParam, ... ) if( ( iParam >= 0 && iParam <= hb_pcount() ) || ( iParam == -1 ) ) { PHB_ITEM pItem = ( iParam == -1 ) ? &hb_stack.Return : hb_stackItemFromBase( iParam ); + int iByRef = HB_IS_BYREF( pItem ); + + if( iByRef ) + pItem = hb_itemUnRef( pItem ); if( HB_IS_ARRAY( pItem ) ) { @@ -660,8 +680,8 @@ void hb_storl( int iLogical, int iParam, ... ) va_end( va ); hb_itemRelease( pItemNew ); } - else if( HB_IS_BYREF( pItem ) || iParam == -1 ) - hb_itemPutL( hb_itemUnRef( pItem ), iLogical ? TRUE : FALSE ); + else if( iByRef || iParam == -1 ) + hb_itemPutL( pItem, iLogical ? TRUE : FALSE ); } } @@ -672,6 +692,10 @@ void hb_storni( int iValue, int iParam, ... ) if( ( iParam >= 0 && iParam <= hb_pcount() ) || ( iParam == -1 ) ) { PHB_ITEM pItem = ( iParam == -1 ) ? &hb_stack.Return : hb_stackItemFromBase( iParam ); + int iByRef = HB_IS_BYREF( pItem ); + + if( iByRef ) + pItem = hb_itemUnRef( pItem ); if( HB_IS_ARRAY( pItem ) ) { @@ -682,8 +706,9 @@ void hb_storni( int iValue, int iParam, ... ) va_end( va ); hb_itemRelease( pItemNew ); } - else if( HB_IS_BYREF( pItem ) || iParam == -1 ) - hb_itemPutNI( hb_itemUnRef( pItem ), iValue ); + else if( iByRef || iParam == -1 ) + hb_itemPutNI( pItem, iValue ); + } } } @@ -694,6 +719,10 @@ void hb_stornl( long lValue, int iParam, ... ) if( ( iParam >= 0 && iParam <= hb_pcount() ) || ( iParam == -1 ) ) { PHB_ITEM pItem = ( iParam == -1 ) ? &hb_stack.Return : hb_stackItemFromBase( iParam ); + int iByRef = HB_IS_BYREF( pItem ); + + if( iByRef ) + pItem = hb_itemUnRef( pItem ); if( HB_IS_ARRAY( pItem ) ) { @@ -704,8 +733,8 @@ void hb_stornl( long lValue, int iParam, ... ) va_end( va ); hb_itemRelease( pItemNew ); } - else if( HB_IS_BYREF( pItem ) || iParam == -1 ) - hb_itemPutNL( hb_itemUnRef( pItem ), lValue ); + else if( iByRef || iParam == -1 ) + hb_itemPutNL( pItem, lValue ); } } @@ -716,6 +745,10 @@ void hb_stornd( double dNumber, int iParam, ... ) if( ( iParam >= 0 && iParam <= hb_pcount() ) || ( iParam == -1 ) ) { PHB_ITEM pItem = ( iParam == -1 ) ? &hb_stack.Return : hb_stackItemFromBase( iParam ); + int iByRef = HB_IS_BYREF( pItem ); + + if( iByRef ) + pItem = hb_itemUnRef( pItem ); if( HB_IS_ARRAY( pItem ) ) { @@ -726,7 +759,7 @@ void hb_stornd( double dNumber, int iParam, ... ) va_end( va ); hb_itemRelease( pItemNew ); } - else if( HB_IS_BYREF( pItem ) || iParam == -1 ) - hb_itemPutND( hb_itemUnRef( pItem ), dNumber ); + else if( iByRef || iParam == -1 ) + hb_itemPutND( pItem, dNumber ); } }