From e2cca2e1e631630de35559b91cdb3c6ec9df8255 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Mon, 20 Jul 2009 15:48:57 +0000 Subject: [PATCH] 2009-07-20 17:45 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * contrib/hbwin/win_reg.prg * contrib/hbwin/win_regc.c ! GETREGISTRY() fixed to return default only if the registry entry doesn't exist. Previously it was falling back to default even if the value existed but was empty. In case of empty string, these weren't possible to write from hbwin, but could exist in registry when written by other tools. ! GETREGISTRY() fixed to return binary data as string for REG_BINARY types. (previously it was returning an unsigned int - essentially truncating everything beyong the first 4 bytes). ! GETREGISTRY() fixed to swap words for REG_DWORD_BIG_ENDIAN values to return correct unsigned integer results. (not tested) ! GETREGISTRY() fixed to strip only the ending Chr( 0 ) from string values. This makes it possible to utilize strings containing nul chars (obviously) and also to parse REG_MULTI_SZ multistring values. ! GETREGISTRY() fixed to not RTE if WIN_REGQUERYVALUEEX() returned non-null length and a non-string value. I still have to understand how this was possible, but I got a report that it happened on a system. ! WIN_REGQUERYVALUEEX() fixed to store NIL in 5th param, if the registry entry doesn't exist. ! WIN_REGQUERYVALUEEX() fixed to store empty string when registry value is zero length. * include/hbapi.h * source/vm/extend.c + Added API hb_stor() to store a NIL into a parameter passed by reference. * source/vm/arrays.c * Minor formatting. --- harbour/ChangeLog | 37 +++++++++++++++++++++++++++++++ harbour/contrib/hbwin/win_reg.prg | 27 ++++++++++++++-------- harbour/contrib/hbwin/win_regc.c | 6 +++-- harbour/include/hbapi.h | 1 + harbour/source/vm/arrays.c | 8 ------- harbour/source/vm/extend.c | 27 +++++++++++++++++++++- 6 files changed, 86 insertions(+), 20 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index c7c3395bdb..e32040c695 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,43 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-07-20 17:45 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * contrib/hbwin/win_reg.prg + * contrib/hbwin/win_regc.c + ! GETREGISTRY() fixed to return default only if the + registry entry doesn't exist. Previously it was + falling back to default even if the value existed but + was empty. In case of empty string, these weren't + possible to write from hbwin, but could exist in registry + when written by other tools. + ! GETREGISTRY() fixed to return binary data as string + for REG_BINARY types. (previously it was returning + an unsigned int - essentially truncating everything + beyong the first 4 bytes). + ! GETREGISTRY() fixed to swap words for REG_DWORD_BIG_ENDIAN + values to return correct unsigned integer results. + (not tested) + ! GETREGISTRY() fixed to strip only the ending Chr( 0 ) + from string values. This makes it possible to utilize + strings containing nul chars (obviously) and also to + parse REG_MULTI_SZ multistring values. + ! GETREGISTRY() fixed to not RTE if WIN_REGQUERYVALUEEX() + returned non-null length and a non-string value. + I still have to understand how this was possible, but + I got a report that it happened on a system. + ! WIN_REGQUERYVALUEEX() fixed to store NIL in 5th param, + if the registry entry doesn't exist. + ! WIN_REGQUERYVALUEEX() fixed to store empty string when + registry value is zero length. + + * include/hbapi.h + * source/vm/extend.c + + Added API hb_stor() to store a NIL into a parameter passed + by reference. + + * source/vm/arrays.c + * Minor formatting. + 2009-07-20 08:45 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) * contrib/hbqt/hbqt_slots.cpp * contrib/hbqt/hbqt_slots.h diff --git a/harbour/contrib/hbwin/win_reg.prg b/harbour/contrib/hbwin/win_reg.prg index 3ba0ae9221..e13c920742 100644 --- a/harbour/contrib/hbwin/win_reg.prg +++ b/harbour/contrib/hbwin/win_reg.prg @@ -159,26 +159,35 @@ FUNCTION QueryRegistry( nHKEY, cKeyName, cEntryName, xValue, lSetIt ) RETURN lRetVal FUNCTION GetRegistry( nHKEY, cKeyName, cEntryName, xDefault ) - LOCAL xRetVal := xDefault + LOCAL xRetVal LOCAL pKeyHandle LOCAL nValueType IF win_RegOpenKeyEx( nHKEY, cKeyName, 0, KEY_QUERY_VALUE, @pKeyHandle ) /* retrieve the length of the value */ - IF win_RegQueryValueEx( pKeyHandle, cEntryName, 0, @nValueType, @xRetVal ) > 0 - IF nValueType == REG_DWORD .OR. ; - nValueType == REG_DWORD_LITTLE_ENDIAN .OR. ; - nValueType == REG_DWORD_BIG_ENDIAN .OR. ; - nValueType == REG_BINARY + win_RegQueryValueEx( pKeyHandle, cEntryName, 0, @nValueType, @xRetVal ) + + IF ISCHARACTER( xRetVal ) + DO CASE + CASE nValueType == REG_DWORD .OR. nValueType == REG_DWORD_LITTLE_ENDIAN xRetVal := Bin2U( xRetVal ) - ELSE - xRetVal := StrTran( xRetVal, Chr( 0 ) ) - ENDIF + CASE nValueType == REG_DWORD_BIG_ENDIAN + xRetVal := Bin2U( Right( xRetVal, 2 ) + Left( xRetVal, 2 ) ) + OTHERWISE + /* Strip ending zero byte */ + IF Right( xRetVal, 1 ) == Chr( 0 ) + xRetVal := hb_StrShrink( xRetVal, 1 ) + ENDIF + ENDCASE + ELSE + xRetVal := xDefault ENDIF win_RegCloseKey( pKeyHandle ) + ELSE + xRetVal := xDefault ENDIF RETURN xRetVal diff --git a/harbour/contrib/hbwin/win_regc.c b/harbour/contrib/hbwin/win_regc.c index 4d375c85ed..0fe207eaf6 100644 --- a/harbour/contrib/hbwin/win_regc.c +++ b/harbour/contrib/hbwin/win_regc.c @@ -143,7 +143,11 @@ HB_FUNC( WIN_REGQUERYVALUEEX ) if( ! hb_storclen_buffer( ( char * ) cValue, nSize, 5 ) ) hb_xfree( cValue ); } + else + hb_storc( NULL, 5 ); } + else + hb_stor( 5 ); hb_stornl( nType, 4 ); hb_retnl( nSize ); @@ -167,14 +171,12 @@ HB_FUNC( WIN_REGSETVALUEEX ) sizeof( REG_DWORD ) ) == ERROR_SUCCESS ); } else - { hb_retl( RegSetValueEx( ( HKEY ) hb_parptr( 1 ), lpKey, 0, nType, ( BYTE * ) hb_parcx( 5 ) /* cValue */, hb_parclen( 5 ) + 1 ) == ERROR_SUCCESS ); - } HB_TCHAR_FREE( lpKey ); } diff --git a/harbour/include/hbapi.h b/harbour/include/hbapi.h index e9e417e5be..41ddf07a53 100644 --- a/harbour/include/hbapi.h +++ b/harbour/include/hbapi.h @@ -725,6 +725,7 @@ extern HB_EXPORT void hb_retnlllen( LONGLONG lNumber, int iWidth ); /* returns #endif /* HB_API_MACROS */ +extern HB_EXPORT int hb_stor( int iParam ); /* stores a NIL on a variable by reference */ extern HB_EXPORT int hb_storc( const char * szText, int iParam ); /* stores a szString on a variable by reference */ extern HB_EXPORT int hb_storclen( const char * szText, ULONG ulLength, int iParam ); /* stores a fixed length string on a variable by reference */ extern HB_EXPORT int hb_storclen_buffer( char * szText, ULONG ulLength, int iParam ); /* stores a fixed length string buffer on a variable by reference */ diff --git a/harbour/source/vm/arrays.c b/harbour/source/vm/arrays.c index 2d51d9a3ec..b903d8eb4e 100644 --- a/harbour/source/vm/arrays.c +++ b/harbour/source/vm/arrays.c @@ -1506,9 +1506,7 @@ PHB_ITEM hb_arrayFromStack( USHORT uiLen ) hb_arrayNew( pArray, uiLen ); for( uiPos = 1; uiPos <= uiLen; uiPos++ ) - { hb_arraySet( pArray, uiPos, hb_stackItemFromTop( uiPos - uiLen - 1 ) ); - } return pArray; } @@ -1530,9 +1528,7 @@ PHB_ITEM hb_arrayFromParams( int iLevel ) pArray = hb_itemArrayNew( uiPCount ); for( uiPos = 1; uiPos <= uiPCount; uiPos++ ) - { hb_arraySet( pArray, uiPos, hb_stackItem( lBaseOffset + uiPos + 1 ) ); - } return pArray; } @@ -1551,9 +1547,7 @@ PHB_ITEM hb_arrayBaseParams( void ) hb_arrayNew( pArray, uiPCount ); for( uiPos = 1; uiPos <= uiPCount; uiPos++ ) - { hb_arraySet( pArray, uiPos, hb_stackItemFromBase( uiPos ) ); - } return pArray; } @@ -1572,9 +1566,7 @@ PHB_ITEM hb_arraySelfParams( void ) hb_arrayNew( pArray, uiPCount + 1 ); for( uiPos = 0; uiPos <= uiPCount; uiPos++ ) - { hb_arraySet( pArray, uiPos + 1, hb_stackItemFromBase( uiPos ) ); - } return pArray; } diff --git a/harbour/source/vm/extend.c b/harbour/source/vm/extend.c index 8f05c00d5b..8669d5f60a 100644 --- a/harbour/source/vm/extend.c +++ b/harbour/source/vm/extend.c @@ -54,7 +54,8 @@ * The following parts are Copyright of the individual authors. * www - http://www.harbour-project.org * - * Copyright 1999-2001 Viktor Szakats (harbour.01 syenar.hu) + * Copyright 1999-2009 Viktor Szakats (harbour.01 syenar.hu) + * hb_stor() * hb_retnlen() * hb_retnilen() * hb_retnllen() @@ -1491,6 +1492,30 @@ void hb_retptrGC( void * pointer ) hb_itemPutPtrGC( hb_stackReturnItem(), pointer ); } +int hb_stor( int iParam ) +{ + HB_STACK_TLS_PRELOAD + + HB_TRACE(HB_TR_DEBUG, ("hb_stor( %d )", iParam)); + + if( iParam == -1 ) + { + hb_itemClear( hb_stackReturnItem() ); + return 1; + } + else if( iParam >= 0 && iParam <= hb_pcount() ) + { + PHB_ITEM pItem = hb_stackItemFromBase( iParam ); + + if( HB_IS_BYREF( pItem ) ) + { + hb_itemClear( hb_itemUnRef( pItem ) ); + return 1; + } + } + + return 0; +} int hb_storc( const char * szText, int iParam ) {