2004-06-07 14:15 UTC+0300 Phil Krylov <phil@newstar.rinet.ru>

This commit is contained in:
Phil Krylov
2004-06-07 10:15:40 +00:00
parent 4c9284dcec
commit c4d8ff8810
3 changed files with 103 additions and 46 deletions

View File

@@ -8,6 +8,20 @@
2002-12-01 23:12 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
2004-06-07 14:15 UTC+0300 Phil Krylov <phil@newstar.rinet.ru>
* source/rtl/inkey.c
+ Added hb_setInkeyLast() (copyright 2002 by Walter Negro) and
SETLASTKEY() (copyright 2003 by Przemyslaw Czerpak). Both functions
are borrowed from xHarbour.
* source/debug/debugger.prg
! Fixed Left and Right keys behaviour in the code window (fix by Lorenzo
Fiorini, borrowed from xHarbour).
! Also from xHarbour, but written by myself:
! Restore LastKey() value on program execution.
! Fixed Step() behaviour.
! Removed the last dependencies of the debugger on SET_EXACT setting.
! Fixed some issues with the Monitor window.
2004-06-07 13:45 UTC+0300 Phil Krylov <phil@newstar.rinet.ru>
* source/debug/dbgwa.prg
* source/debug/dbgtarr.prg

View File

@@ -76,8 +76,7 @@
#define ALTD_ENABLE 1
/* Information structure hold by DATA aCallStack
*/
/* Information structure stored in DATA aCallStack */
#define CSTACK_FUNCTION 1 //function name
#define CSTACK_LOCALS 2 //an array with local variables
#define CSTACK_LINE 3 //start line
@@ -85,28 +84,26 @@
#define CSTACK_STATICS 5 //an array with static variables
#define CSTACK_LEVEL 6 //eval stack level of the function
/* Information structure hold by aCallStack[n][ CSTACK_LOCALS ]
{ cLocalName, nLocalIndex, "Local", ProcName( 1 ) }
*/
/* Information structure stored in aCallStack[n][ CSTACK_LOCALS ]
{ cLocalName, nLocalIndex, "Local", ProcName( 1 ), nLevel } */
#define VAR_NAME 1
#define VAR_POS 2
#define VAR_TYPE 3
#define VAR_FUNCNAME 4
#define VAR_LEVEL 5 //eval stack level of the function
/* Information structure hold by ::aWatch (watchpoints)
*/
/* Information structure stored in ::aWatch (watchpoints) */
#define WP_TYPE 1 //wp = watchpoint, tr = tracepoint
#define WP_EXPR 2 //source of an expression
#define WP_BLOCK 3 //codeblock to retrieve a value
/* Information structure hold by ::aTrace (tracepoints)
*/
/* Information structure stored in ::aTrace (tracepoints) */
#define TR_IDX 1 //index into ::aWatch item storing expression
#define TR_VALUE 2 //the current value of the expression
static s_oDebugger
static s_lExit := .F.
memvar __DbgStatics
@@ -404,7 +401,7 @@ CLASS TDebugger
METHOD Stack()
METHOD Static()
METHOD Step() INLINE ::RestoreAppStatus(), ::Exit()
METHOD Step()
METHOD TabWidth() INLINE ;
::nTabWidth := ::InputBox( "Tab width", ::nTabWidth )
@@ -412,7 +409,7 @@ CLASS TDebugger
METHOD ToggleBreakPoint()
METHOD Trace() INLINE ::lTrace := .t., ::nTraceLevel := Len( ::aCallStack ),;
__Keyboard( Chr( 255 ) ) //forces a Step()
::Step() //forces a Step()
METHOD ToCursor()
METHOD NextRoutine()
@@ -1032,8 +1029,8 @@ METHOD EditVar( nVar ) CLASS TDebugger
if LastKey() != K_ESC
do case
case cVarStr == "{ ... }"
// aArray := ::VarGetValue( ::aVars[ nVar ] )
if Len( aArray ) > 0
//aArray := ::VarGetValue( ::aVars[ nVar ] )
if Len( uVarValue ) > 0
__DbgArrays( uVarValue, cVarName )
else
Alert( "Array is empty" )
@@ -1068,6 +1065,10 @@ METHOD HandleEvent() CLASS TDebugger
local nPopup, oWnd
local nKey, nMRow, nMCol, n
local nLastKey
/* Save LastKey() */
nLastKey := LastKey()
if ::lAnimate
if ::nSpeed != 0
@@ -1076,7 +1077,9 @@ METHOD HandleEvent() CLASS TDebugger
if HB_DBG_INVOKEDEBUG() //NextKey() == K_ALT_D
::lAnimate := .f.
else
KEYBOARD Chr( 255 ) // Forces a Step(). Only 0-255 range is supported
::Step()
RETURN nil
//KEYBOARD Chr( 255 ) // Forces a Step(). Only 0-255 range is supported
endif
endif
@@ -1148,17 +1151,18 @@ METHOD HandleEvent() CLASS TDebugger
endif
case nKey == K_RBUTTONDOWN
/*
case nKey == K_ESC
/*case nKey == K_ESC
::RestoreAppStatus()
s_oDebugger := nil
s_lExit := .T.
DispEnd()
::Exit()
*/
::Exit()*/
case nKey == K_UP .or. nKey == K_DOWN .or. nKey == K_HOME .or. ;
nKey == K_END .or. nKey == K_ENTER .or. nKey == K_PGDN .or. ;
nKey == K_PGUP .OR. nKey == K_DEL
nKey == K_PGUP .or. nKey == K_DEL .or. nKey == K_LEFT .or. ;
nKey == K_RIGHT
oWnd := ::aWindows[ ::nCurrentWindow ]
oWnd:KeyPressed( nKey )
@@ -1186,11 +1190,6 @@ METHOD HandleEvent() CLASS TDebugger
::ToCursor()
case nKey == K_F8 .or. nKey == 255
// we are starting to run again so reset to the deepest call if
// displaying stack
if ! ::oBrwStack == nil
::oBrwStack:GoTop()
endif
::Step()
case nKey == K_F9
@@ -1218,6 +1217,8 @@ METHOD HandleEvent() CLASS TDebugger
endcase
end
/* Restore LastKey() */
SetLastKey( nLastKey )
return nil
METHOD Hide() CLASS TDebugger
@@ -1644,6 +1645,9 @@ METHOD ShowVars() CLASS TDebugger
if ::oWndVars:nBottom - ::oWndVars:nTop > 1
::oWndVars:Resize( ,, ::oWndVars:nTop + 1 )
lRepaint := .t.
else
/* We still need to redraw window caption, it could have changed */
::oWndVars:Refresh()
endif
elseif Len( ::aVars ) > ::oWndVars:nBottom - ::oWndVars:nTop - 1
::oWndVars:Resize( ,, ::oWndVars:nTop + Min( Len( ::aVars ) + 1, 7 ) )
@@ -1652,7 +1656,8 @@ METHOD ShowVars() CLASS TDebugger
::oWndVars:Resize( ,, ::oWndVars:nTop + Len( ::aVars ) + 1 )
lRepaint := .t.
else
::oBrwVars:refreshAll():ForceStable()
::oBrwVars:RefreshAll():ForceStable()
::oWndVars:Refresh()
endif
if ! ::oWndVars:lVisible .OR. lRepaint
::ResizeWindows( ::oWndVars )
@@ -2925,6 +2930,18 @@ LOCAL oWindow2, nTop, i
RETURN self
METHOD Step() CLASS TDebugger
// we are starting to run again so reset to the deepest call if
// displaying stack
if ! ::oBrwStack == nil
::oBrwStack:GoTop()
endif
::RestoreAppStatus()
::Exit()
RETURN nil
STATIC FUNCTION CreateExpression( cExpr, aWatch )
LOCAL nLen
LOCAL i,j
@@ -2948,12 +2965,12 @@ LOCAL cRet
DO WHILE( SUBSTR(cExpr,i,1)==" ")
i++
ENDDO
IF( SUBSTR(cExpr,i,1) = '(' )
IF( SUBSTR(cExpr,i,1) == '(' )
//function call
j := i+1
LOOP
ENDIF
IF( SUBSTR(cExpr,i,2) = "->" )
IF( SUBSTR(cExpr,i,2) == "->" )
//alias expressions are not expanded
i += 2
DO WHILE( i<=nLen .AND. IsIdentChar(SUBSTR(cExpr,i,1)," ()") )
@@ -3037,34 +3054,33 @@ RETURN cRet
STATIC FUNCTION IsIdentChar( cChar, cSeeAlso )
IF( ISALPHA(cChar) .OR. ISDIGIT(cChar) .OR. cChar = '_' )
IF( ISALPHA(cChar) .OR. ISDIGIT(cChar) .OR. cChar == '_' )
RETURN .T.
ENDIF
RETURN IIF(cSeeAlso!=NIL, cChar $ cSeeAlso, .F. )
STATIC PROCEDURE StripUntil( pcLine, i, cChar )
LOCAL j, n
LOCAL nLen:=LEN(pcLine)
LOCAL j, n
LOCAL nLen:=LEN(pcLine)
n := LEN(cChar)
j := i+n
DO WHILE( j<=nLen .AND. SUBSTR(pcLine, j, n) != cChar )
DO WHILE j<=nLen .AND. SUBSTR(pcLine, j, n) != cChar
j++
ENDDO
IF( j <= nLen )
IF j <= nLen
pcLine := LEFT( pcLine, i-1 ) + SUBSTR(pcLine, j+n)
ENDIF
RETURN
STATIC FUNCTION IsValidStopLine( cLine )
LOCAL i, c, c2
LOCAL lSet:=SET(_SET_EXACT,.F.)
LOCAL i, c, c2
cLine := UPPER( ALLTRIM( cLine ) )
i := 1
DO WHILE( i <= LEN(cLine) )
DO WHILE i <= LEN(cLine)
c := SUBSTR( cLine, i, 1 )
c2 := SUBSTR( cLine, i, 2 )
DO CASE
@@ -3089,25 +3105,26 @@ LOCAL lSet:=SET(_SET_EXACT,.F.)
ENDDO
cLine := ALLTRIM( cLine )
IF( EMPTY(cLine) )
SET(_SET_EXACT, lSet)
IF EMPTY(cLine)
RETURN .F.
ENDIF
IF( cLine = 'FUNC' .OR.;
cLine = 'PROC' .OR.;
cLine = 'NEXT' .OR.;
cLine = 'END' .OR.;
cLine = 'ELSE' .OR.;
cLine = 'LOCA' .OR.;
cLine = 'STAT' .OR.;
cLine = 'MEMV' )
SET(_SET_EXACT, lSet)
c := Left( cLine, 4 )
IF ( Left( c, 3 ) == 'END' .OR.;
c == 'FUNC' .OR.;
c == 'PROC' .OR.;
c == 'NEXT' .OR.;
c == 'ELSE' .OR.;
c == 'LOCA' .OR.;
c == 'STAT' .OR.;
c == 'MEMV' )
RETURN .F.
ENDIF
RETURN .T.
function __DbgColors()
return iif( ! s_oDebugger:lMonoDisplay, s_oDebugger:aColors,;

View File

@@ -57,6 +57,12 @@
* Copyright 1999-2001 Viktor Szakats <viktor.szakats@syenar.hu>
* HB_KEYPUT()
*
* Copyright 2002 Walter Negro <anegro@overnet.com.ar>
* hb_setInkeyLast()
*
* Copyright 2003 Przemyslaw Czerpak <druzus@acn.waw.pl>
* SETLASTKEY()
*
* See doc/license.txt for licensing terms.
*
*/
@@ -181,6 +187,17 @@ int hb_inkeyLast( HB_inkey_enum event_mask ) /* Return the value of the las
return hb_inkeyTranslate( s_inkeyLast, event_mask );
}
int hb_setInkeyLast( int ch ) /* Force a value to s_inkeyLast and return previous value */
{
int last = s_inkeyLast;
HB_TRACE(HB_TR_DEBUG, ("hb_setInkeyLast()"));
s_inkeyLast = ch;
return last;
}
int hb_inkeyNext( HB_inkey_enum event_mask ) /* Return the next key without extracting it */
{
int key = s_inkeyForce; /* Assume that typeahead support is disabled */
@@ -368,6 +385,15 @@ HB_FUNC( LASTKEY )
hb_retni( hb_inkeyTranslate( s_inkeyLast, ( HB_inkey_enum ) hb_inkeyNext( ISNUM( 1 ) ? ( HB_inkey_enum ) hb_parni( 1 ) : hb_set.HB_SET_EVENTMASK ) ) );
}
HB_FUNC( SETLASTKEY )
{
if( ISNUM(1) )
{
hb_setInkeyLast( hb_parni(1) );
}
hb_retc( "" );
}
int hb_inkeyTranslate( int key, HB_inkey_enum event_mask )
{
if( key && hb_gtExtendedKeySupport() && ! ( event_mask & HB_INKEY_EXTENDED ) )