2010-01-22 17:26 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)

* contrib/hbwin/hbwapi.h
  * contrib/hbwin/wapi_wingdi.c
    ! Fixed potential GPD in hbwapi_par/stor*() functions
      when parameter was not passed at all.
    + Added hbwapi_par_DOCINFO() and hbwapi_strfree_DOCINFO()
      pairs to retrieve structures with strings in them.
      Hashes are supported now as well.
    ; TODO: Low-level string handling functions will GPF
            yet if the related hashes are missing (f.e. in
            posted test code). This requires proposed extra
            guards in low-level string functions.
    + WAPI_STARTDOC() changed to use hbwapi_par_DOCINFO().
    % Minor cleanup in WAPI_SELECTOBJECT().

  + contrib/hbwin/tests/testgdi.prg
    + Added test code for GDI function structure parameter exchange.

  * contrib/hbide/idethemes.prg
  * contrib/hbide/ideeditor.prg
    + Added 'sequence' and 'endsequence' to keywords.
    ; TOFIX: try/catch and a few more are not Harbour keywords.

  * contrib/hbide/ideeditor.prg
    % Optimized low-level keyword lookup functions:
      - Use hashes instead of arrays and ascan.
      - Use STATIC vars to avoid rebuilding tables on every call.
This commit is contained in:
Viktor Szakats
2010-01-22 16:29:38 +00:00
parent d6f1db5b95
commit b6fbba81d8
6 changed files with 252 additions and 70 deletions

View File

@@ -17,6 +17,34 @@
past entries belonging to author(s): Viktor Szakats.
*/
2010-01-22 17:26 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbwin/hbwapi.h
* contrib/hbwin/wapi_wingdi.c
! Fixed potential GPD in hbwapi_par/stor*() functions
when parameter was not passed at all.
+ Added hbwapi_par_DOCINFO() and hbwapi_strfree_DOCINFO()
pairs to retrieve structures with strings in them.
Hashes are supported now as well.
; TODO: Low-level string handling functions will GPF
yet if the related hashes are missing (f.e. in
posted test code). This requires proposed extra
guards in low-level string functions.
+ WAPI_STARTDOC() changed to use hbwapi_par_DOCINFO().
% Minor cleanup in WAPI_SELECTOBJECT().
+ contrib/hbwin/tests/testgdi.prg
+ Added test code for GDI function structure parameter exchange.
* contrib/hbide/idethemes.prg
* contrib/hbide/ideeditor.prg
+ Added 'sequence' and 'endsequence' to keywords.
; TOFIX: try/catch and a few more are not Harbour keywords.
* contrib/hbide/ideeditor.prg
% Optimized low-level keyword lookup functions:
- Use hashes instead of arrays and ascan.
- Use STATIC vars to avoid rebuilding tables on every call.
2010-01-22 08:24 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com)
* contrib/hbqt/hbqt_hbqplaintextedit.cpp
! Fix to handle unused variable : "txt".

View File

@@ -1706,43 +1706,89 @@ METHOD IdeEdit:findLastIndent()
/*----------------------------------------------------------------------*/
FUNCTION hbide_isHarbourKeyword( cWord )
LOCAL b_:= { 'function','return','static','local','default', ;
'if','else','elseif','endif','end', ;
'docase','case','endcase','otherwise', ;
'do','while','exit',;
'for','each','next','step','to',;
'class','endclass','method','data','var','destructor','inline','assign','access',;
'inherit','init','create','virtual','message',;
'begin','sequence','try','catch','always','recover','hb_symbol_unused', ;
'error','handler' }
STATIC s_b_ := { 'function' => NIL,;
'return' => NIL,;
'static' => NIL,;
'local' => NIL,;
'default' => NIL,;
'if' => NIL,;
'else' => NIL,;
'elseif' => NIL,;
'endif' => NIL,;
'end' => NIL,;
'endswitch' => NIL,;
'docase' => NIL,;
'case' => NIL,;
'endcase' => NIL,;
'otherwise' => NIL,;
'switch' => NIL,;
'do' => NIL,;
'while' => NIL,;
'exit' => NIL,;
'for' => NIL,;
'each' => NIL,;
'next' => NIL,;
'step' => NIL,;
'to' => NIL,;
'class' => NIL,;
'endclass' => NIL,;
'method' => NIL,;
'data' => NIL,;
'var' => NIL,;
'destructor' => NIL,;
'inline' => NIL,;
'assign' => NIL,;
'access' => NIL,;
'inherit' => NIL,;
'init' => NIL,;
'create' => NIL,;
'virtual' => NIL,;
'message' => NIL,;
'begin' => NIL,;
'sequence' => NIL,;
'try' => NIL,;
'catch' => NIL,;
'always' => NIL,;
'recover' => NIL,;
'hb_symbol_unused' => NIL,;
'error' => NIL,;
'handler' => NIL }
cWord := lower( cWord )
RETURN ascan( b_, {|e| e == cWord } ) > 0
RETURN Lower( cWord ) $ s_b_
/*----------------------------------------------------------------------*/
FUNCTION hbide_isIndentableKeyword( cWord )
LOCAL b_:= { 'function',;
'if','else','elseif', ;
'docase','case','otherwise', ;
'do','while',;
'for',;
'class','method',;
'begin','sequence','try','catch','always','recover','finally' }
LOCAL s_b_ := { 'function' => NIL,;
'if' => NIL,;
'else' => NIL,;
'elseif' => NIL,;
'docase' => NIL,;
'case' => NIL,;
'otherwise' => NIL,;
'do' => NIL,;
'while' => NIL,;
'switch' => NIL,;
'for' => NIL,;
'class' => NIL,;
'method' => NIL,;
'begin' => NIL,;
'sequence' => NIL,;
'try' => NIL,;
'catch' => NIL,;
'always' => NIL,;
'recover' => NIL,;
'finally' => NIL }
cWord := lower( cWord )
RETURN ascan( b_, {|e| e == cWord } ) > 0
RETURN Lower( cWord ) $ s_b_
/*----------------------------------------------------------------------*/
FUNCTION hbide_isStartingKeyword( cWord )
LOCAL b_:= { 'function','method' }
STATIC s_b_ := { 'function' => NIL,;
'method' => NIL }
cWord := lower( cWord )
RETURN ascan( b_, {|e| e == cWord } ) > 0
RETURN Lower( cWord ) $ s_b_
/*----------------------------------------------------------------------*/
@@ -1839,5 +1885,3 @@ FUNCTION hbide_getFrontSpacesAndWord( cText, cWord )
RETURN n
/*----------------------------------------------------------------------*/

View File

@@ -178,8 +178,8 @@ METHOD IdeThemes:create( oIde, cIniFile )
/* Harbour Keywords */
b_:= { 'function','return','static','local','default', ;
'if','else','elseif','endif','end', ;
'docase','case','endcase','otherwise', ;
'if','else','elseif','endif','end', 'endswitch', ;
'docase','case','endcase','otherwise', 'switch', ;
'do','while','exit',;
'for','each','next','step','to',;
'class','endclass','method','data','var','destructor','inline','assign','access',;

View File

@@ -105,6 +105,7 @@ HB_EXPORT DWORD hbwapi_GetLastError( void );
HB_EXPORT POINT * hbwapi_par_POINT( POINT * p, int iParam, HB_BOOL bMandatory );
HB_EXPORT RECT * hbwapi_par_RECT( RECT * p, int iParam, HB_BOOL bMandatory );
HB_EXPORT DEVMODE * hbwapi_par_DEVMODE( DEVMODE * p, int iParam, HB_BOOL bMandatory );
HB_EXPORT DOCINFO * hbwapi_par_DOCINFO( DOCINFO * p, int iParam, HB_BOOL bMandatory, void *** h );
HB_EXPORT void hbwapi_stor_POINT( POINT * p, int iParam );
HB_EXPORT void hbwapi_stor_RECT( RECT * p, int iParam );

View File

@@ -0,0 +1,71 @@
/*
* $Id$
*/
/*
* Harbour Project source code:
* GDI calls and passing structures.
*
* Copyright 2010 Viktor Szakats (harbour.01 syenar.hu)
* www - http://www.harbour-project.org
*
*/
#include "simpleio.ch"
#include "hbwin.ch"
PROCEDURE Main()
LOCAL hDC
LOCAL hDOCINFO
LOCAL hDEVMODE
LOCAL hRECT
LOCAL aRECT
LOCAL hOBJECT
hDEVMODE := hb_hash()
? hDC := wapi_CreateDC( NIL, "Microsoft XPS Document Writer", NIL, hDEVMODE )
hDOCINFO := hb_hash()
hDOCINFO[ "lpszDocName" ] := "test job"
? wapi_StartDoc( hDC, hDOCINFO )
? wapi_StartPage( hDC )
? hOBJECT := wapi_CreateFont( ,,,,,,,,,,,,, "Arial" )
? wapi_SelectObject( hDC, hOBJECT )
? "in ARR"
aRECT := { 100, 150, 450, 250 }
? wapi_DrawText( hDC, "0TEST", aRECT )
? "inout ARR"
aRECT := { 100, 150, 450, 250 }
? wapi_DrawText( hDC, "1TEST", aRECT, WIN_DT_CALCRECT )
? aRECT[ 1 ], aRECT[ 2 ], aRECT[ 3 ], aRECT[ 4 ]
? "out HASH"
hRECT := hb_hash()
? wapi_DrawText( hDC, "2TEST", hRECT, WIN_DT_CALCRECT )
? hRECT[ "left" ], hRECT[ "top" ], hRECT[ "bottom" ], hRECT[ "right" ]
? "inout HASH"
hRECT := hb_hash()
hRECT[ "left" ] := 300
hRECT[ "top" ] := 350
? wapi_DrawText( hDC, "3TEST", hRECT, WIN_DT_CALCRECT )
? hRECT[ "left" ], hRECT[ "top" ], hRECT[ "bottom" ], hRECT[ "right" ]
? "in HASH"
hRECT := hb_hash()
hRECT[ "left" ] := 300
hRECT[ "top" ] := 350
hRECT[ "right" ] := 650
hRECT[ "bottom" ] := 450
? wapi_DrawText( hDC, "4TEST", hRECT )
? wapi_EndPage( hDC )
? wapi_EndDoc( hDC )
hDC := NIL
hOBJECT := NIL
RETURN

View File

@@ -79,34 +79,36 @@ POINT * hbwapi_par_POINT( POINT * p, int iParam, HB_BOOL bMandatory )
memset( p, 0, sizeof( POINT ) );
if( HB_IS_HASH( pStru ) )
if( pStru && HB_IS_HASH( pStru ) )
{
p->x = ( LONG ) hb_itemGetNL( hb_hashGetCItemPtr( pStru, "x" ) );
p->y = ( LONG ) hb_itemGetNL( hb_hashGetCItemPtr( pStru, "y" ) );
return p;
}
else if( HB_IS_ARRAY( pStru ) && hb_arrayLen( pStru ) >= 2 )
else if( pStru && HB_IS_ARRAY( pStru ) && hb_arrayLen( pStru ) >= 2 )
{
p->x = ( LONG ) hb_arrayGetNL( pStru, 1 );
p->y = ( LONG ) hb_arrayGetNL( pStru, 2 );
return p;
}
else
return bMandatory ? p : NULL;
else if( bMandatory )
return p;
return NULL;
}
void hbwapi_stor_POINT( POINT * p, int iParam )
{
PHB_ITEM pStru = hb_param( iParam, HB_IT_ANY );
if( HB_IS_HASH( pStru ) )
if( pStru && HB_IS_HASH( pStru ) )
{
s_hb_hashSetCItemNL( pStru, "x", p->x );
s_hb_hashSetCItemNL( pStru, "y", p->y );
}
else if( HB_IS_ARRAY( pStru ) && hb_arrayLen( pStru ) >= 2 )
else if( pStru && HB_IS_ARRAY( pStru ) && hb_arrayLen( pStru ) >= 2 )
{
hb_arraySetNL( pStru, 1, p->x );
hb_arraySetNL( pStru, 2, p->y );
@@ -119,7 +121,7 @@ RECT * hbwapi_par_RECT( RECT * p, int iParam, HB_BOOL bMandatory )
memset( p, 0, sizeof( RECT ) );
if( HB_IS_HASH( pStru ) )
if( pStru && HB_IS_HASH( pStru ) )
{
p->left = ( LONG ) hb_itemGetNL( hb_hashGetCItemPtr( pStru, "left" ) );
p->top = ( LONG ) hb_itemGetNL( hb_hashGetCItemPtr( pStru, "top" ) );
@@ -128,7 +130,7 @@ RECT * hbwapi_par_RECT( RECT * p, int iParam, HB_BOOL bMandatory )
return p;
}
else if( HB_IS_ARRAY( pStru ) && hb_arrayLen( pStru ) >= 4 )
else if( pStru && HB_IS_ARRAY( pStru ) && hb_arrayLen( pStru ) >= 4 )
{
p->left = ( LONG ) hb_arrayGetNL( pStru, 1 );
p->top = ( LONG ) hb_arrayGetNL( pStru, 2 );
@@ -137,22 +139,24 @@ RECT * hbwapi_par_RECT( RECT * p, int iParam, HB_BOOL bMandatory )
return p;
}
else
return bMandatory ? p : NULL;
else if( bMandatory )
return p;
return NULL;
}
void hbwapi_stor_RECT( RECT * p, int iParam )
{
PHB_ITEM pStru = hb_param( iParam, HB_IT_ANY );
if( HB_IS_HASH( pStru ) )
if( pStru && HB_IS_HASH( pStru ) )
{
s_hb_hashSetCItemNL( pStru, "left" , p->left );
s_hb_hashSetCItemNL( pStru, "top" , p->top );
s_hb_hashSetCItemNL( pStru, "right" , p->right );
s_hb_hashSetCItemNL( pStru, "bottom", p->bottom );
}
else if( HB_IS_ARRAY( pStru ) && hb_arrayLen( pStru ) >= 4 )
else if( pStru && HB_IS_ARRAY( pStru ) && hb_arrayLen( pStru ) >= 4 )
{
hb_arraySetNL( pStru, 1, p->left );
hb_arraySetNL( pStru, 2, p->top );
@@ -169,7 +173,7 @@ DEVMODE * hbwapi_par_DEVMODE( DEVMODE * p, int iParam, HB_BOOL bMandatory )
p->dmSize = sizeof( DEVMODE );
if( HB_IS_HASH( pStru ) )
if( pStru && HB_IS_HASH( pStru ) )
{
p->dmOrientation = ( short ) hb_itemGetNI( hb_hashGetCItemPtr( pStru, "dmOrientation" ) );
p->dmPaperSize = ( short ) hb_itemGetNI( hb_hashGetCItemPtr( pStru, "dmPaperSize" ) );
@@ -193,15 +197,17 @@ DEVMODE * hbwapi_par_DEVMODE( DEVMODE * p, int iParam, HB_BOOL bMandatory )
return p;
}
else
return bMandatory ? p : NULL;
else if( bMandatory )
return p;
return NULL;
}
void hbwapi_stor_DEVMODE( DEVMODE * p, int iParam )
{
PHB_ITEM pStru = hb_param( iParam, HB_IT_ANY );
if( HB_IS_HASH( pStru ) )
if( pStru && HB_IS_HASH( pStru ) )
{
s_hb_hashSetCItemNL( pStru, "dmOrientation" , p->dmOrientation );
s_hb_hashSetCItemNL( pStru, "dmPaperSize" , p->dmPaperSize );
@@ -215,6 +221,54 @@ void hbwapi_stor_DEVMODE( DEVMODE * p, int iParam )
}
}
DOCINFO * hbwapi_par_DOCINFO( DOCINFO * p, int iParam, HB_BOOL bMandatory, void *** ph )
{
PHB_ITEM pStru = hb_param( iParam, HB_IT_ANY );
void ** h = ( void ** ) hb_xgrabz( 3 * sizeof( void * ) );
*ph = h;
memset( p, 0, sizeof( DOCINFO ) );
p->cbSize = sizeof( DOCINFO );
if( pStru && HB_IS_HASH( pStru ) )
{
p->lpszDocName = HB_ITEMGETSTR( hb_hashGetCItemPtr( pStru, "lpszDocName" ), &h[ 0 ], NULL );
p->lpszOutput = HB_ITEMGETSTR( hb_hashGetCItemPtr( pStru, "lpszOutput" ), &h[ 1 ], NULL );
p->lpszDatatype = HB_ITEMGETSTR( hb_hashGetCItemPtr( pStru, "lpszDatatype" ), &h[ 2 ], NULL );
p->fwType = ( DWORD ) hb_itemGetNL( hb_hashGetCItemPtr( pStru, "fwType" ) );
return p;
}
else if( pStru && HB_IS_ARRAY( pStru ) && hb_arrayLen( pStru ) >= 4 )
{
p->lpszDocName = HB_ARRAYGETSTR( pStru, 1, &h[ 0 ], NULL ); /* DEF? */
p->lpszOutput = HB_ARRAYGETSTR( pStru, 2, &h[ 1 ], NULL );
p->lpszDatatype = HB_ARRAYGETSTR( pStru, 3, &h[ 2 ], NULL );
p->fwType = ( DWORD ) hb_arrayGetNL( pStru, 4 );
return p;
}
else if( bMandatory )
return p;
hb_xfree( h );
*ph = NULL;
return NULL;
}
void hbwapi_strfree_DOCINFO( void ** h )
{
if( h )
{
int i;
for( i = 0; i < 3; ++i )
hb_strfree( h[ i ] );
}
}
#if ! defined( HB_OS_WIN_CE )
HB_FUNC( WAPI_CREATEDC )
@@ -248,31 +302,15 @@ HB_FUNC( WAPI_RESETDC )
HB_FUNC( WAPI_STARTDOC )
{
HDC hDC = hbwapi_par_HDC( 1 );
/* TODO: Use hash */
PHB_ITEM pDOCINFO = hb_param( 2, HB_IT_ARRAY );
if( hDC && pDOCINFO && hb_arrayLen( pDOCINFO ) >= 4 )
{
DOCINFO di;
void * hDocName;
void * hOutput;
void * hDatatype;
di.cbSize = sizeof( DOCINFO );
di.lpszDocName = HB_ARRAYGETSTR( pDOCINFO, 1, &hDocName , NULL ); /* DEF? */
di.lpszOutput = HB_ARRAYGETSTR( pDOCINFO, 2, &hOutput , NULL );
di.lpszDatatype = HB_ARRAYGETSTR( pDOCINFO, 3, &hDatatype, NULL );
di.fwType = ( DWORD ) hb_arrayGetNL( pDOCINFO, 4 );
void ** hDOCINFO = NULL;
DOCINFO di;
if( hDC && hbwapi_par_DOCINFO( &di, 2, HB_FALSE, &hDOCINFO ) )
hb_retni( StartDoc( hDC, &di ) );
hb_strfree( hDocName );
hb_strfree( hOutput );
hb_strfree( hDatatype );
}
else
hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
hbwapi_strfree_DOCINFO( hDOCINFO );
}
HB_FUNC( WAPI_ENDDOC )
@@ -512,9 +550,9 @@ HB_FUNC( WAPI_SELECTOBJECT )
HB_BOOL bRegion = HB_FALSE;
HGDIOBJ h;
if( ( h = hbwapi_par_HPEN( 2 ) ) != NULL );
else if( ( h = hbwapi_par_HBRUSH( 2 ) ) != NULL );
else if( ( h = hbwapi_par_HFONT( 2 ) ) != NULL );
if( ( h = hbwapi_par_HPEN( 2 ) ) != NULL ) {}
else if( ( h = hbwapi_par_HBRUSH( 2 ) ) != NULL ) {}
else if( ( h = hbwapi_par_HFONT( 2 ) ) != NULL ) {}
/* TODO: Add BITMAP, REGION */
else
h = NULL;