2008-06-03 17:23 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/contrib/hbw32/w32_regc.c
    ! fixed typo hb_free() => hb_xfree()
    ! fixed UNICODE build

  * harbour/source/vm/itemapi.c
    * changed hb_itemPutC() and hb_itemPutCL() to be safe when
      user call it passing string which is stored in item passed
      as first parameter. It should fix problem located by Chen.
      Please test.
This commit is contained in:
Przemyslaw Czerpak
2008-06-03 15:23:59 +00:00
parent 6414835fe7
commit 0d57df5ce5
3 changed files with 95 additions and 85 deletions

View File

@@ -8,6 +8,17 @@
2008-12-31 13:59 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
2008-06-03 17:23 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/contrib/hbw32/w32_regc.c
! fixed typo hb_free() => hb_xfree()
! fixed UNICODE build
* harbour/source/vm/itemapi.c
* changed hb_itemPutC() and hb_itemPutCL() to be safe when
user call it passing string which is stored in item passed
as first parameter. It should fix problem located by Chen.
Please test.
2008-06-03 15:10 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/vm/extrap.c
! fixed unregistering exception error handler in OS2 builds

View File

@@ -86,19 +86,20 @@ static HKEY hb_regkeyconv( ULONG nKey )
return Result;
}
HB_FUNC( WIN32_REGCREATEKEYEX )
HB_FUNC( WIN32_REGCREATEKEYEX )
{
HKEY hWnd = ( HKEY ) hb_parnl( 8 );
ULONG nResult = hb_parnl( 9 );
if( RegCreateKeyEx( hb_regkeyconv( hb_parnl( 1 ) ),
( const char * ) hb_parc( 2 ),
0,
NULL,
hb_parnl( 5 ),
hb_parnl( 6 ),
NULL,
&hWnd,
LPTSTR lpText = HB_TCHAR_CONVTO( hb_parc( 2 ) );
if( RegCreateKeyEx( hb_regkeyconv( hb_parnl( 1 ) ),
lpText,
0,
NULL,
hb_parnl( 5 ),
hb_parnl( 6 ),
NULL,
&hWnd,
&nResult ) == ERROR_SUCCESS )
{
hb_stornl( ( ULONG ) hWnd, 8 );
@@ -108,16 +109,19 @@ HB_FUNC( WIN32_REGCREATEKEYEX )
}
else
hb_retnl( -1 );
HB_TCHAR_FREE( lpText );
}
HB_FUNC( WIN32_REGOPENKEYEX )
{
HKEY hWnd;
LPTSTR lpText = HB_TCHAR_CONVTO( hb_parc( 2 ) );
if( RegOpenKeyEx( hb_regkeyconv( hb_parnl( 1 ) ),
hb_parc( 2 ),
0,
hb_parnl( 4 ),
if( RegOpenKeyEx( hb_regkeyconv( hb_parnl( 1 ) ),
lpText,
0,
hb_parnl( 4 ),
&hWnd ) == ERROR_SUCCESS )
{
hb_stornl( ( ULONG ) hWnd, 5 );
@@ -125,67 +129,72 @@ HB_FUNC( WIN32_REGOPENKEYEX )
}
else
hb_retnl( -1 );
HB_TCHAR_FREE( lpText );
}
HB_FUNC( WIN32_REGQUERYVALUEEX )
{
const char * cKey = ( const char * ) hb_parc( 2 ) ;
DWORD nType = 0;
DWORD nSize = 0;
if( RegQueryValueEx( hb_regkeyconv( hb_parnl( 1 ) ),
cKey,
NULL,
&nType,
NULL,
LPTSTR lpKey = HB_TCHAR_CONVTO( hb_parc( 2 ) );
if( RegQueryValueEx( hb_regkeyconv( hb_parnl( 1 ) ),
lpKey,
NULL,
&nType,
NULL,
&nSize ) == ERROR_SUCCESS )
{
if( nSize > 0 )
{
BYTE * cValue = ( BYTE * ) hb_xgrab( nSize + 1 );
RegQueryValueEx( hb_regkeyconv( hb_parnl( 1 ) ),
cKey,
NULL,
&nType,
( BYTE * ) cValue,
RegQueryValueEx( hb_regkeyconv( hb_parnl( 1 ) ),
lpKey,
NULL,
&nType,
( BYTE * ) cValue,
&nSize );
hb_stornl( nType, 4 );
if( ! hb_storclen_buffer( ( char * ) cValue, nSize, 5 ) )
hb_free( cValue );
hb_xfree( cValue );
}
}
HB_TCHAR_FREE( lpKey );
hb_retnl( nSize );
}
HB_FUNC( WIN32_REGSETVALUEEX )
{
const char * cKey = hb_parc( 2 );
DWORD nType = hb_parnl( 4 );
LPTSTR lpKey = HB_TCHAR_CONVTO( hb_parc( 2 ) );
if( nType != REG_DWORD )
{
BYTE * cValue = ( BYTE * ) hb_parc( 5 );
hb_retni( RegSetValueEx( hb_regkeyconv( hb_parnl( 1 ) ),
cKey,
0,
nType,
( BYTE * ) cValue,
hb_retni( RegSetValueEx( hb_regkeyconv( hb_parnl( 1 ) ),
lpKey,
0,
nType,
( BYTE * ) cValue,
hb_parclen( 5 ) + 1 ) );
}
else
{
DWORD nSpace = hb_parnl( 5 );
hb_retni( RegSetValueEx( hb_regkeyconv( hb_parnl( 1 ) ),
cKey,
0,
nType,
( BYTE * ) &nSpace,
hb_retni( RegSetValueEx( hb_regkeyconv( hb_parnl( 1 ) ),
lpKey,
0,
nType,
( BYTE * ) &nSpace,
sizeof( REG_DWORD ) ) );
}
HB_TCHAR_FREE( lpKey );
}
HB_FUNC( WIN32_REGCLOSEKEY )

View File

@@ -215,10 +215,22 @@ HB_EXPORT PHB_ITEM hb_itemArrayPut( PHB_ITEM pArray, ULONG ulIndex, PHB_ITEM pIt
HB_EXPORT PHB_ITEM hb_itemPutC( PHB_ITEM pItem, const char * szText )
{
ULONG ulLen = szText ? strlen( szText ) : 0;
ULONG ulLen, ulAlloc;
HB_TRACE(HB_TR_DEBUG, ("hb_itemPutC(%p, %s)", pItem, szText));
ulLen = szText ? strlen( szText ) : 0;
if( ulLen > 1 )
{
ulAlloc = ulLen + 1;
szText = ( char * ) hb_xmemcpy( hb_xgrab( ulAlloc ), szText, ulAlloc );
}
else
{
ulAlloc = 0;
szText = ( char * ) ( ulLen ? hb_szAscii[ ( unsigned char ) ( szText[0] ) ] : "" );
}
if( pItem )
{
if( HB_IS_COMPLEX( pItem ) )
@@ -227,36 +239,32 @@ HB_EXPORT PHB_ITEM hb_itemPutC( PHB_ITEM pItem, const char * szText )
else
pItem = hb_itemNew( NULL );
if( ulLen == 0 )
{
pItem->item.asString.value = "";
pItem->item.asString.length = 0;
pItem->item.asString.allocated = 0;
}
else if( ulLen == 1 )
{
pItem->item.asString.value = ( char * ) hb_szAscii[ (unsigned char) ( szText[0] ) ];
pItem->item.asString.length = 1;
pItem->item.asString.allocated = 0;
}
else
{
pItem->item.asString.value = ( char * ) hb_xgrab( ulLen + 1 );
/* we used strlen() above so we know it's 0-ended string */
hb_xmemcpy( pItem->item.asString.value, szText, ulLen + 1 );
pItem->item.asString.length = ulLen;
pItem->item.asString.allocated = ulLen + 1;
}
pItem->type = HB_IT_STRING;
pItem->item.asString.value = ( char * ) szText;
pItem->item.asString.length = ulLen;
pItem->item.asString.allocated = ulAlloc;
return pItem;
}
HB_EXPORT PHB_ITEM hb_itemPutCL( PHB_ITEM pItem, const char * szText, ULONG ulLen )
{
ULONG ulAlloc;
HB_TRACE(HB_TR_DEBUG, ("hb_itemPutCL(%p, %s, %lu)", pItem, szText, ulLen));
if( ulLen > 1 )
{
ulAlloc = ulLen + 1;
szText = ( char * ) hb_xmemcpy( hb_xgrab( ulAlloc ), szText, ulLen );
( ( char * ) szText )[ ulLen ] = '\0';
}
else
{
ulAlloc = 0;
szText = ( char * ) ( ulLen ? hb_szAscii[ ( unsigned char ) ( szText[0] ) ] : "" );
}
if( pItem )
{
if( HB_IS_COMPLEX( pItem ) )
@@ -269,28 +277,10 @@ HB_EXPORT PHB_ITEM hb_itemPutCL( PHB_ITEM pItem, const char * szText, ULONG ulLe
trash if the szText buffer is NULL, at least with hb_retclen().
[vszakats] */
if( szText == NULL || ulLen == 0 )
{
pItem->item.asString.value = "";
pItem->item.asString.length = 0;
pItem->item.asString.allocated = 0;
}
else if( ulLen == 1 )
{
pItem->item.asString.value = ( char * ) hb_szAscii[ (unsigned char) ( szText[0] ) ];
pItem->item.asString.length = 1;
pItem->item.asString.allocated = 0;
}
else
{
pItem->item.asString.value = ( char * ) hb_xgrab( ulLen + 1 );
hb_xmemcpy( pItem->item.asString.value, szText, ulLen );
pItem->item.asString.value[ ulLen ] = '\0';
pItem->item.asString.length = ulLen;
pItem->item.asString.allocated = ulLen + 1;
}
pItem->type = HB_IT_STRING;
pItem->item.asString.value = ( char * ) szText;
pItem->item.asString.length = ulLen;
pItem->item.asString.allocated = ulAlloc;
return pItem;
}
@@ -336,9 +326,6 @@ HB_EXPORT PHB_ITEM hb_itemPutCLConst( PHB_ITEM pItem, const char * szText, ULONG
else
pItem = hb_itemNew( NULL );
pItem->type = HB_IT_STRING;
pItem->item.asString.allocated = 0;
if( szText == NULL )
{
pItem->item.asString.value = "";
@@ -353,6 +340,9 @@ HB_EXPORT PHB_ITEM hb_itemPutCLConst( PHB_ITEM pItem, const char * szText, ULONG
pItem->item.asString.length = ulLen;
}
pItem->type = HB_IT_STRING;
pItem->item.asString.allocated = 0;
return pItem;
}