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()
This commit is contained in:
Viktor Szakats
2008-06-12 09:36:54 +00:00
parent cbab994f5c
commit 704fe9b6d7
4 changed files with 80 additions and 111 deletions

View File

@@ -8,6 +8,16 @@
2008-12-31 13:59 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
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

View File

@@ -4,7 +4,7 @@
/*
* Harbour Project source code:
* _SPD() function
* SQL_SPRINTF() function
*
* Copyright 2008 Xavi <jarabal/at/gmail.com>
*
@@ -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;

View File

@@ -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();
}

View File

@@ -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;
}