diff --git a/harbour/ChangeLog b/harbour/ChangeLog index e3157080b7..5f0023d231 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,16 @@ 2008-12-31 13:59 UTC+0100 Foo Bar */ +2008-06-12 11:02 UTC+0200 Viktor Szakats (harbour.01 syenar hu) + * source/rtl/gtwvt/gtwvt.c + % Minor optimization in new screen marking code. + + * contrib/hbmisc/strfmt.c + * Cleanup, optimization, some internal limits removed. + + * contrib/hbmisc/spd.c + * Former _SPD() function renamed to SQL_SPRINTF() + 2008-06-12 00:40 UTC+0800 Pritpal Bedi (pritpal@vouchcac.com * harbour/source/rtl/gtwvt/gtwvt.c ! Completely removed flickering under Mark and Copy operation diff --git a/harbour/contrib/hbmisc/spd.c b/harbour/contrib/hbmisc/spd.c index fae82aad9d..770def083f 100644 --- a/harbour/contrib/hbmisc/spd.c +++ b/harbour/contrib/hbmisc/spd.c @@ -4,7 +4,7 @@ /* * Harbour Project source code: - * _SPD() function + * SQL_SPRINTF() function * * Copyright 2008 Xavi * @@ -127,7 +127,7 @@ static ULONG SCItm( char *cBuffer, ULONG ulMaxBuf, char *cParFrm, int iCOut, int /******************************************************************************* * ANSI C sprintf() for ANSI SQL with DATE, DATETIME, LOGICAL, NIL, NUMERIC * ------------------------------------------------------------------------ -* cRes := _SPD( cFrm, ... ) +* cRes := SQL_SPRINTF( cFrm, ... ) * cFrm : %s for DATE = YYYY-MM-DD, DATETIME = YYYY-MM-DD HH:MM:SS * %t for DATE = 'YYYY-MM-DD', DATETIME = 'YYYY-MM-DD HH:MM:SS' * %t for STRING = 'String''s ANSI SQL' @@ -137,11 +137,11 @@ static ULONG SCItm( char *cBuffer, ULONG ulMaxBuf, char *cParFrm, int iCOut, int * * NOTE .- * Remove C ESC sequences and converts them to Clipper chars in cRes. -* OutStd( _SPD( 'Hello\nworld!' ) ) => like printf( "Hello\nworld!" ); +* OutStd( SQL_SPRINTF( 'Hello\nworld!' ) ) => like printf( "Hello\nworld!" ); * Accepts conversion inside if variable is passed by reference. -* Local xDate := Date(); _SPD('%s', @xDate) => xDate == '2008-05-19' +* Local xDate := Date(); SQL_SPRINTF('%s', @xDate) => xDate == '2008-05-19' * Support index & indirect arguments C99. -* cRes := _SPD( "Phi = %2$0*3$.*1$f \n", 10, (1 + 5**0.5) / 2, 13 ) +* cRes := SQL_SPRINTF( "Phi = %2$0*3$.*1$f \n", 10, (1 + 5**0.5) / 2, 13 ) *******************************************************************************/ #define DK_INCRES 1024 @@ -150,10 +150,10 @@ static ULONG SCItm( char *cBuffer, ULONG ulMaxBuf, char *cParFrm, int iCOut, int #define DK_FRMTIM "HH:MM:SS" #if defined( __XHARBOUR__ ) && ! defined( HB_ERR_FUNCNAME ) - #define HB_ERR_FUNCNAME "C_SPRINTF" + #define HB_ERR_FUNCNAME "SQL_SPRINTF" #endif -HB_FUNC( C_SPRINTF ) +HB_FUNC( SQL_SPRINTF ) { ULONG ulItmFrm; char *cRes, *cItmFrm; diff --git a/harbour/contrib/hbmisc/strfmt.c b/harbour/contrib/hbmisc/strfmt.c index 749da6234d..b2f152ce4d 100644 --- a/harbour/contrib/hbmisc/strfmt.c +++ b/harbour/contrib/hbmisc/strfmt.c @@ -53,110 +53,71 @@ #include "hbapi.h" #define HB_STRFORMAT_PARNUM_MAX_ 9 +#define POS_TO_PAR( pos ) ( pos + 2 ) HB_FUNC( STRFORMAT ) { - char* pszMask = hb_parc(1); - ULONG nMaskLen = hb_parclen(1); - ULONG nMaskPos; ULONG nParNum = hb_pcount(); - ULONG nLenTable [HB_STRFORMAT_PARNUM_MAX_]; - char* pszVarTable [HB_STRFORMAT_PARNUM_MAX_]; - ULONG nRetValLen; - char* pszRetVal; - char* pszRetValSave; - - ULONG tmp; - - if (nParNum < 1) + if( nParNum >= 1 ) { - hb_retc(""); - return; - } + char * pszMask = hb_parc( 1 ); + ULONG nMaskLen = hb_parclen( 1 ); + ULONG nMaskPos; + + ULONG nRetValLen; + char * pszRetVal; + char * pszRetValSave; - nParNum--; + nParNum--; - if (nParNum > HB_STRFORMAT_PARNUM_MAX_) nParNum = HB_STRFORMAT_PARNUM_MAX_; - - for (tmp = 0; tmp < nParNum; tmp++) - { - nLenTable[tmp] = hb_parclen(tmp + 2); - pszVarTable[tmp] = hb_parc(tmp + 2); - } - - nMaskPos = 0; - - nRetValLen = 0; - while (nMaskPos < nMaskLen) - { - if (pszMask[nMaskPos] == '%') + if( nParNum > HB_STRFORMAT_PARNUM_MAX_ ) + nParNum = HB_STRFORMAT_PARNUM_MAX_; + + nRetValLen = 0; + for( nMaskPos = 0; nMaskPos < nMaskLen; nMaskPos++ ) { - nMaskPos++; - - if (pszMask[nMaskPos] == '\0') + if( pszMask[ nMaskPos ] == '%' ) { - break; + nMaskPos++; + + if( pszMask[ nMaskPos ] == '\0' ) + break; + else if( pszMask[ nMaskPos ] == '%' ) + nRetValLen++; + else if( pszMask[ nMaskPos ] >= '1' && pszMask[ nMaskPos ] <= ( int )( nParNum + '0' ) ) + nRetValLen += hb_parclen( POS_TO_PAR( pszMask[ nMaskPos ] - '1' ) ); } - else if (pszMask[nMaskPos] == '%') - { + else nRetValLen++; - } - else if (pszMask[nMaskPos] >= '1' && pszMask[nMaskPos] <= (int)(nParNum + '0')) + } + + pszRetVal = pszRetValSave = ( char * ) hb_xgrab( nRetValLen + 1 ); + for( nMaskPos = 0; nMaskPos < nMaskLen; nMaskPos++ ) + { + if( pszMask[ nMaskPos ] == '%' ) { - nRetValLen += nLenTable[pszMask[nMaskPos] - '1']; + nMaskPos++; + + if( pszMask[ nMaskPos ] == '\0' ) + break; + else if( pszMask[ nMaskPos ] == '%' ) + *pszRetVal++ = pszMask[ nMaskPos ]; + else if( pszMask[ nMaskPos ] >= '1' && pszMask[ nMaskPos ] <= ( int ) ( nParNum + '0' ) ) + { + ULONG nPos = pszMask[ nMaskPos ] - '1'; + ULONG nLen = hb_parclen( POS_TO_PAR( nPos ) ); + + memcpy( pszRetVal, hb_parc( POS_TO_PAR( nPos ) ), nLen ); + pszRetVal += nLen; + } } else - { - /* ; do nothing */ - } + *pszRetVal++ = pszMask[ nMaskPos ]; } - else - { - nRetValLen++; - } - - nMaskPos++; + + hb_retclen_buffer( pszRetValSave, nRetValLen ); } - - nMaskPos = 0; - - pszRetVal = pszRetValSave = (char *) hb_xgrab(nRetValLen + 1); - while (nMaskPos < nMaskLen) - { - if (pszMask[nMaskPos] == '%') - { - nMaskPos++; - - if (pszMask[nMaskPos] == '\0') - { - break; - } - else if (pszMask[nMaskPos] == '%') - { - *pszRetVal++ = pszMask[nMaskPos]; - } - else if (pszMask[nMaskPos] >= '1' && pszMask[nMaskPos] <= (int)(nParNum + '0')) - { - ULONG nPos = pszMask[nMaskPos] - '1'; - - memcpy(pszRetVal, pszVarTable[nPos], nLenTable[nPos]); - pszRetVal += nLenTable[nPos]; - } - else - { - /* ; do nothing */ - } - } - else - { - *pszRetVal++ = pszMask[nMaskPos]; - } - - nMaskPos++; - } - - hb_retclen(pszRetValSave, nRetValLen); - - hb_xfree(pszRetValSave); + else + hb_retc_null(); } diff --git a/harbour/source/rtl/gtwvt/gtwvt.c b/harbour/source/rtl/gtwvt/gtwvt.c index 2f083cf99e..3a9fcc2f6b 100644 --- a/harbour/source/rtl/gtwvt/gtwvt.c +++ b/harbour/source/rtl/gtwvt/gtwvt.c @@ -871,7 +871,7 @@ static void hb_gt_wvt_MouseEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, L pWVT->markEndColRow = colrow; a0 = hb_gt_wvt_GetXYFromColRow( pWVT, ( USHORT ) pWVT->markStaColRow.x, ( USHORT ) pWVT->markStaColRow.y ); - a1 = hb_gt_wvt_GetXYFromColRow( pWVT, ( USHORT ) pWVT->markEndColRow.x+1, ( USHORT ) pWVT->markEndColRow.y+1 ); + a1 = hb_gt_wvt_GetXYFromColRow( pWVT, ( USHORT ) pWVT->markEndColRow.x + 1, ( USHORT ) pWVT->markEndColRow.y + 1 ); rect.left = a0.x; rect.top = a0.y; @@ -883,28 +883,26 @@ static void hb_gt_wvt_MouseEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, L rect.right != s_rectOld.right || rect.bottom != s_rectOld.bottom ) { - HDC hdc = GetDC( pWVT->hWnd ); - HRGN rgn1,rgn2,rgn3; - int hr; - /* Concept forwarded by Andy Wos - thanks. */ - rgn1 = CreateRectRgn( s_rectOld.left, s_rectOld.top, s_rectOld.right, s_rectOld.bottom ); - rgn2 = CreateRectRgn( rect.left, rect.top, rect.right, rect.bottom ); - rgn3 = CreateRectRgn( 0,0,0,0 ); + HRGN rgn1 = CreateRectRgn( s_rectOld.left, s_rectOld.top, s_rectOld.right, s_rectOld.bottom ); + HRGN rgn2 = CreateRectRgn( rect.left, rect.top, rect.right, rect.bottom ); + HRGN rgn3 = CreateRectRgn( 0, 0, 0, 0 ); - hr = CombineRgn( rgn3, rgn1, rgn2, RGN_XOR ); - if( hr != 0 ) + if( CombineRgn( rgn3, rgn1, rgn2, RGN_XOR ) != 0 ) + { + HDC hdc = GetDC( pWVT->hWnd ); InvertRgn( hdc, rgn3 ); + ReleaseDC( pWVT->hWnd, hdc ); + } + + DeleteObject( rgn1 ); + DeleteObject( rgn2 ); + DeleteObject( rgn3 ); s_rectOld.left = rect.left; s_rectOld.top = rect.top; s_rectOld.right = rect.right; s_rectOld.bottom = rect.bottom; - - DeleteObject( rgn1 ); - DeleteObject( rgn2 ); - DeleteObject( rgn3 ); - ReleaseDC( pWVT->hWnd, hdc ); } return; }