20000412-01:17 GMT+1 Victor Szakats <info@szelvesz.hu>

This commit is contained in:
Viktor Szakats
2000-04-11 23:20:43 +00:00
parent 1f05184914
commit 3b8ce8f432
11 changed files with 123 additions and 95 deletions

View File

@@ -1,3 +1,22 @@
20000412-01:17 GMT+1 Victor Szakats <info@szelvesz.hu>
* source/rtl/gtapi.c
% hb_gtWrite() one more variable removed.
% hb_gtRepChar() the terminating zero was superfluous.
% hb_gtWriteAt() is now native instead of calling the high-level
functions, so it's faster, because of that hb_gtBox() is also faster.
% hb_gtRepChar() uses WriteAt() instead of Write(), so it's faster.
% Many functions calls low-level hb_gt_() functions instead of the same
level, this way some calls could be eliminated and gain some speed.
(hb_gtMaxRow(), hb_gtMaxCol(), hb_gtVersion(), hb_gtColorSelect(), ...)
The number of same level calls has been reduced by 20.
! hb_gtInit() fixed the order of some init steps.
* include/hbapigt.h
* source/rtl/gtapi.c
* source/rtl/gt*/gt*.c
* hb_gt_Done() renamed to hb_gt_Exit()
20000411-23:09 GMT+1 Victor Szakats <info@szelvesz.hu>
* source/rtl/gtapi.c

View File

@@ -101,7 +101,6 @@ typedef enum
extern void hb_gtInit( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr );
extern void hb_gtExit( void );
extern int hb_gtReadKey( HB_inkey_enum eventmask );
extern void hb_gtAdjustPos( int iHandle, char * pStr, ULONG ulLen );
extern USHORT hb_gtBox( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, BYTE * pbyBoxString );
extern USHORT hb_gtBoxD( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight );
@@ -120,6 +119,7 @@ extern USHORT hb_gtMaxCol( void );
extern USHORT hb_gtMaxRow( void );
extern USHORT hb_gtPostExt( void );
extern USHORT hb_gtPreExt( void );
extern int hb_gtReadKey( HB_inkey_enum eventmask );
extern USHORT hb_gtRectSize( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, USHORT * puiBuffSize );
extern USHORT hb_gtRepChar( USHORT uiRow, USHORT uiCol, BYTE byChar, USHORT uiCount );
extern USHORT hb_gtRest( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, void * pScrBuff );
@@ -141,29 +141,29 @@ extern char * hb_gtVersion( void );
/* Private interface listed below. these are common to all platforms */
extern void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr );
extern BOOL hb_gt_IsColor( void );
extern void hb_gt_Done( void );
extern void hb_gt_Exit( void );
extern BOOL hb_gt_AdjustPos( BYTE * pStr, ULONG ulLen );
extern int hb_gt_ReadKey( HB_inkey_enum eventmask );
extern USHORT hb_gt_GetScreenWidth( void );
extern USHORT hb_gt_GetScreenHeight( void );
extern void hb_gt_SetPos( SHORT iRow, SHORT iCol );
extern SHORT hb_gt_Col( void );
extern SHORT hb_gt_Row( void );
extern void hb_gt_Scroll( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, BYTE byAttr, SHORT iRows, SHORT iCols );
extern void hb_gt_SetCursorStyle( USHORT uiCursorShape );
extern USHORT hb_gt_GetCursorStyle( void );
extern void hb_gt_Puts( USHORT uiRow, USHORT uiCol, BYTE byAttr, BYTE * pbyStr, ULONG ulLen );
extern void hb_gt_GetText( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, BYTE * pbyDst );
extern void hb_gt_PutText( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, BYTE * pbySrc );
extern void hb_gt_SetAttribute( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, BYTE byAttr );
extern void hb_gt_DispBegin( void );
extern USHORT hb_gt_DispCount( void );
extern void hb_gt_DispEnd( void );
extern BOOL hb_gt_SetMode( USHORT uiRows, USHORT uiCols );
extern BOOL hb_gt_GetBlink( void );
extern void hb_gt_SetBlink( BOOL bBlink );
extern USHORT hb_gt_GetCursorStyle( void );
extern USHORT hb_gt_GetScreenHeight( void );
extern USHORT hb_gt_GetScreenWidth( void );
extern void hb_gt_GetText( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, BYTE * pbyDst );
extern BOOL hb_gt_IsColor( void );
extern void hb_gt_Puts( USHORT uiRow, USHORT uiCol, BYTE byAttr, BYTE * pbyStr, ULONG ulLen );
extern void hb_gt_PutText( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, BYTE * pbySrc );
extern int hb_gt_ReadKey( HB_inkey_enum eventmask );
extern void hb_gt_Replicate( BYTE byChar, ULONG ulLen );
extern SHORT hb_gt_Row( void );
extern void hb_gt_Scroll( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, BYTE byAttr, SHORT iRows, SHORT iCols );
extern void hb_gt_SetAttribute( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, BYTE byAttr );
extern void hb_gt_SetBlink( BOOL bBlink );
extern void hb_gt_SetCursorStyle( USHORT uiCursorShape );
extern BOOL hb_gt_SetMode( USHORT uiRows, USHORT uiCols );
extern void hb_gt_SetPos( SHORT iRow, SHORT iCol );
extern void hb_gt_Tone( double dFrequency, double dDuration );
extern char * hb_gt_Version( void );

View File

@@ -48,9 +48,9 @@ void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
/* TODO: Is anything required to initialize the video subsystem? */
}
void hb_gt_Done( void )
void hb_gt_Exit( void )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Done()"));
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Exit()"));
/* TODO: */
}

View File

@@ -103,18 +103,20 @@ void hb_gtInit( int s_iFilenoStdin, int s_iFilenoStdout, int s_iFilenoStderr )
hb_gt_Init( s_iFilenoStdin, s_iFilenoStdout, s_iFilenoStderr );
hb_gtSetColorStr( hb_set.HB_SET_COLOR );
hb_gtSetCursor( SC_NORMAL );
s_iRow = hb_gt_Row();
s_iCol = hb_gt_Col();
s_uiPreCount = 0;
s_uiPreCNest = 0;
/* This should be called after s_iRow/s_iCol initialization. */
hb_gtSetCursor( SC_NORMAL );
s_bInit = TRUE;
if( hb_cmdargCheck( "INFO" ) )
{
hb_conOutErr( hb_gtVersion(), 0 );
hb_conOutErr( hb_gt_Version(), 0 );
hb_conOutErr( hb_conNewLine(), 0 );
}
}
@@ -128,7 +130,7 @@ void hb_gtExit( void )
while( hb_gt_DispCount() )
hb_gt_DispEnd();
hb_gt_Done();
hb_gt_Exit();
hb_xfree( s_pColor );
}
@@ -159,14 +161,14 @@ USHORT hb_gtBox( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, B
HB_TRACE(HB_TR_DEBUG, ("hb_gtBox(%hu, %hu, %hu, %hu, %p)", uiTop, uiLeft, uiBottom, uiRight, pbyFrame));
uiMaxRow = hb_gtMaxRow();
uiMaxCol = hb_gtMaxCol();
uiMaxRow = hb_gt_GetScreenHeight();
uiMaxCol = hb_gt_GetScreenWidth();
/* TODO: Would be better to support these cases, Clipper implementation was
quite messy, which can be considered as a bug there. [vszakats] */
if( uiTop <= uiMaxRow && uiBottom <= uiMaxRow &&
uiLeft <= uiMaxCol && uiRight <= uiMaxCol )
if( uiTop < uiMaxRow && uiBottom < uiMaxRow &&
uiLeft < uiMaxCol && uiRight < uiMaxCol )
{
BYTE szBox[ 10 ];
BYTE cPadChar;
@@ -343,7 +345,6 @@ USHORT hb_gtPreExt( void )
++s_uiPreCNest;
return 0;
}
USHORT hb_gtPostExt( void )
@@ -489,6 +490,7 @@ USHORT hb_gtSetColorStr( char * szColorString )
}
++nCount;
switch( c )
{
case 'B':
@@ -590,7 +592,7 @@ USHORT hb_gtSetColorStr( char * szColorString )
if( nPos > 0 && nPos < 4 )
s_pColor[ 4 ] = s_pColor[ 1 ];
hb_gtColorSelect( CLR_STANDARD );
s_uiColorIndex = CLR_STANDARD; /* hb_gtColorSelect( CLR_STANDARD ); */
return 0;
}
@@ -611,8 +613,8 @@ USHORT hb_gtSetCursor( USHORT uiCursorStyle )
if( uiCursorStyle <= SC_SPECIAL2 )
{
/* Set the cursor only when, it's in bounds. */
if( s_iRow >= 0 && s_iRow <= hb_gtMaxRow() &&
s_iCol >= 0 && s_iCol <= hb_gtMaxCol() )
if( s_iRow >= 0 && s_iRow < hb_gt_GetScreenHeight() &&
s_iCol >= 0 && s_iCol < hb_gt_GetScreenWidth() )
hb_gt_SetCursorStyle( uiCursorStyle );
s_uiCursorStyle = uiCursorStyle;
@@ -627,8 +629,8 @@ USHORT hb_gtGetPos( SHORT * piRow, SHORT * piCol )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gtGetPos(%p, %p)", piRow, piCol));
if( s_iRow >= 0 && s_iRow <= hb_gtMaxRow() &&
s_iCol >= 0 && s_iCol <= hb_gtMaxCol() )
if( s_iRow >= 0 && s_iRow < hb_gt_GetScreenHeight() &&
s_iCol >= 0 && s_iCol < hb_gt_GetScreenWidth() )
{
/* Only return the actual cursor position if the current
cursor position was not previously set out of bounds. */
@@ -644,22 +646,27 @@ USHORT hb_gtGetPos( SHORT * piRow, SHORT * piCol )
USHORT hb_gtSetPos( SHORT iRow, SHORT iCol )
{
USHORT uiMaxRow;
USHORT uiMaxCol;
HB_TRACE(HB_TR_DEBUG, ("hb_gtSetPos(%hd, %hd)", iRow, iCol));
uiMaxRow = hb_gt_GetScreenHeight();
uiMaxCol = hb_gt_GetScreenWidth();
/* Validate the new cursor position */
if( iRow < 0 || iCol < 0 || iRow > hb_gtMaxRow() || iCol > hb_gtMaxCol() )
{
/* Disable cursor if out of bounds */
hb_gt_SetCursorStyle( SC_NONE );
}
else
if( iRow >= 0 && iRow < uiMaxRow &&
iCol >= 0 && iCol < uiMaxCol )
{
hb_gt_SetPos( iRow, iCol );
/* If back in bounds, enable the cursor */
if( s_iRow < 0 || s_iCol < 0 || s_iRow > hb_gtMaxRow() || s_iCol > hb_gtMaxCol() )
/* If cursor was out bounds, now enable it */
if( s_iRow < 0 || s_iRow >= uiMaxRow ||
s_iCol < 0 || s_iCol >= uiMaxCol )
hb_gt_SetCursorStyle( s_uiCursorStyle );
}
else
hb_gt_SetCursorStyle( SC_NONE ); /* Disable cursor if out of bounds */
s_iRow = iRow;
s_iCol = iCol;
@@ -706,25 +713,21 @@ USHORT hb_gtRepChar( USHORT uiRow, USHORT uiCol, BYTE byChar, USHORT uiCount )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gtRepChar(%hu, %hu, %d, %hu)", uiRow, uiCol, (int) byChar, uiCount));
hb_gtSetPos( uiRow, uiCol );
if( uiCount < REPCHAR_BUFFER_SIZE )
if( uiCount <= REPCHAR_BUFFER_SIZE )
{
BYTE buffer[ REPCHAR_BUFFER_SIZE ];
memset( buffer, byChar, uiCount );
buffer[ uiCount ] = '\0';
hb_gtWrite( buffer, uiCount );
hb_gtWriteAt( uiRow, uiCol, buffer, uiCount );
}
else
{
BYTE * buffer = ( BYTE * ) hb_xgrab( uiCount + 1 );
BYTE * buffer = ( BYTE * ) hb_xgrab( uiCount );
memset( buffer, byChar, uiCount );
buffer[ uiCount ] = '\0';
hb_gtWrite( buffer, uiCount );
hb_gtWriteAt( uiRow, uiCol, buffer, uiCount );
hb_xfree( buffer );
}
@@ -732,20 +735,20 @@ USHORT hb_gtRepChar( USHORT uiRow, USHORT uiCol, BYTE byChar, USHORT uiCount )
return 0;
}
USHORT hb_gtRest( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, void * vlpScrBuff )
USHORT hb_gtRest( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, void * pScrBuff )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gtRest(%hu, %hu, %hu, %hu, %p)", uiTop, uiLeft, uiBottom, uiRight, vlpScrBuff));
HB_TRACE(HB_TR_DEBUG, ("hb_gtRest(%hu, %hu, %hu, %hu, %p)", uiTop, uiLeft, uiBottom, uiRight, pScrBuff));
hb_gt_PutText( uiTop, uiLeft, uiBottom, uiRight, ( BYTE * ) vlpScrBuff );
hb_gt_PutText( uiTop, uiLeft, uiBottom, uiRight, ( BYTE * ) pScrBuff );
return 0;
}
USHORT hb_gtSave( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, void * vlpScrBuff )
USHORT hb_gtSave( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, void * pScrBuff )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gtSave(%hu, %hu, %hu, %hu, %p)", uiTop, uiLeft, uiBottom, uiRight, vlpScrBuff));
HB_TRACE(HB_TR_DEBUG, ("hb_gtSave(%hu, %hu, %hu, %hu, %p)", uiTop, uiLeft, uiBottom, uiRight, pScrBuff));
hb_gt_GetText( uiTop, uiLeft, uiBottom, uiRight, ( BYTE * ) vlpScrBuff );
hb_gt_GetText( uiTop, uiLeft, uiBottom, uiRight, ( BYTE * ) pScrBuff );
return 0;
}
@@ -754,17 +757,17 @@ USHORT hb_gtScrDim( USHORT * uipHeight, USHORT * uipWidth )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gtScrDim(%p, %p)", uipHeight, uipWidth));
*uipHeight = hb_gtMaxRow();
*uipWidth = hb_gtMaxCol();
*uipHeight = hb_gt_GetScreenHeight() - 1;
*uipWidth = hb_gt_GetScreenWidth() - 1;
return 0;
}
USHORT hb_gtGetBlink( BOOL * bBlink )
USHORT hb_gtGetBlink( BOOL * bpBlink )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gtGetBlink(%p)", bBlink));
HB_TRACE(HB_TR_DEBUG, ("hb_gtGetBlink(%p)", bpBlink));
*bBlink = hb_gt_GetBlink();
*bpBlink = hb_gt_GetBlink();
return 0;
}
@@ -785,14 +788,13 @@ USHORT hb_gtSetMode( USHORT uiRows, USHORT uiCols )
return hb_gt_SetMode( uiRows, uiCols ) ? 0 : 1;
}
/* NOTE: This is a compatibility function.
If you're running on a CGA and snow is a problem speak up! */
USHORT hb_gtSetSnowFlag( BOOL bNoSnow )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gtSetSnowFlag(%d)", (int) bNoSnow));
/* NOTE: This is a compatibility function.
If you're running on a CGA and snow is a problem
speak up! */
HB_SYMBOL_UNUSED( bNoSnow );
return 0;
@@ -805,21 +807,15 @@ USHORT hb_gtWrite( BYTE * pStr, ULONG ulLength )
HB_TRACE(HB_TR_DEBUG, ("hb_gtWrite(%p, %lu)", pStr, ulLength));
/* Optimize access to max col position */
iMaxCol = hb_gtMaxCol();
iMaxCol = hb_gt_GetScreenWidth();
/* Display the text if the cursor is on screen */
if( s_iCol >= 0 && s_iCol <= iMaxCol &&
s_iRow >= 0 && s_iRow <= hb_gtMaxRow() )
if( s_iCol >= 0 && s_iCol < iMaxCol &&
s_iRow >= 0 && s_iRow < hb_gt_GetScreenHeight() )
{
ULONG ulSize;
/* Truncate the text if the cursor will end up off the right edge */
if( s_iCol + ( SHORT ) ulLength > iMaxCol + 1 )
ulSize = ( ULONG ) ( iMaxCol - s_iCol + 1 );
else
ulSize = ulLength;
hb_gt_Puts( s_iRow, s_iCol, ( BYTE ) s_pColor[ s_uiColorIndex ], pStr, ulSize );
hb_gt_Puts( s_iRow, s_iCol, ( BYTE ) s_pColor[ s_uiColorIndex ], pStr,
HB_MIN( ulLength, ( ULONG ) ( iMaxCol - s_iCol ) ) );
}
/* Finally, save the new cursor position, even if off-screen */
@@ -830,11 +826,25 @@ USHORT hb_gtWrite( BYTE * pStr, ULONG ulLength )
USHORT hb_gtWriteAt( USHORT uiRow, USHORT uiCol, BYTE * pStr, ULONG ulLength )
{
USHORT uiMaxCol;
HB_TRACE(HB_TR_DEBUG, ("hb_gtWriteAt(%hu, %hu, %p, %lu)", uiRow, uiCol, pStr, ulLength));
hb_gtSetPos( uiRow, uiCol );
/* Optimize access to max col position */
uiMaxCol = hb_gt_GetScreenWidth();
return hb_gtWrite( pStr, ulLength );
/* Display the text if the cursor is on screen */
if( uiCol < uiMaxCol && uiRow < hb_gt_GetScreenHeight() )
{
/* Truncate the text if the cursor will end up off the right edge */
hb_gt_Puts( uiRow, uiCol, ( BYTE ) s_pColor[ s_uiColorIndex ], pStr,
HB_MIN( ulLength, ( ULONG ) ( uiMaxCol - uiCol ) ) );
}
/* Finally, save the new cursor position, even if off-screen */
hb_gtSetPos( uiRow, uiCol + ( SHORT ) ulLength );
return 0;
}
#define WRITECON_BUFFER_SIZE 500
@@ -852,8 +862,8 @@ USHORT hb_gtWriteCon( BYTE * pStr, ULONG ulLength )
HB_TRACE(HB_TR_DEBUG, ("hb_gtWriteCon(%p, %lu)", pStr, ulLength));
iMaxRow = hb_gtMaxRow();
iMaxCol = hb_gtMaxCol();
iMaxRow = hb_gt_GetScreenHeight() - 1;
iMaxCol = hb_gt_GetScreenWidth() - 1;
/* Limit the starting cursor position to maxrow(),maxcol()
on the high end, but don't limit it on the low end. */
@@ -885,7 +895,6 @@ USHORT hb_gtWriteCon( BYTE * pStr, ULONG ulLength )
--iRow;
bDisp = TRUE;
}
break;
case HB_CHAR_LF:
@@ -977,8 +986,8 @@ USHORT hb_gtDrawShadow( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiR
HB_TRACE(HB_TR_DEBUG, ("hb_gtDrawShadow(%hu, %hu, %hu, %hu, %d)", uiTop, uiLeft, uiBottom, uiRight, (int) byAttr));
uiMaxRow = hb_gtMaxRow();
uiMaxCol = hb_gtMaxCol();
uiMaxRow = hb_gt_GetScreenHeight() - 1;
uiMaxCol = hb_gt_GetScreenWidth() - 1;
uiLeft += 2;
++uiBottom;

View File

@@ -231,9 +231,9 @@ void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
keypad( stdscr, FALSE );
}
void hb_gt_Done( void )
void hb_gt_Exit( void )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Done()"));
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Exit()"));
noraw();
refresh();

View File

@@ -209,9 +209,9 @@ void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
#endif
}
void hb_gt_Done( void )
void hb_gt_Exit( void )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Done()"));
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Exit()"));
#if !defined(__DJGPP__)
if( scrnStealth != ( char * ) -1 )

View File

@@ -116,9 +116,9 @@ void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
*/
}
void hb_gt_Done( void )
void hb_gt_Exit( void )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Done()"));
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Exit()"));
/* TODO: */
}

View File

@@ -86,9 +86,9 @@ void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
fprintf( stdout, "\x1B[=7h" ); /* Enable line wrap (for OUTSTD() and OUTERR()) */
}
void hb_gt_Done( void )
void hb_gt_Exit( void )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Done()"));
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Exit()"));
/* TODO: */
}

View File

@@ -56,9 +56,9 @@ void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
SLsmg_init_smg ();
}
void hb_gt_Done( void )
void hb_gt_Exit( void )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Done()"));
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Exit()"));
SLsmg_refresh();
SLsmg_reset_smg ();

View File

@@ -76,9 +76,9 @@ void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
hb_fsSetDevMode( s_iFilenoStdout, FD_BINARY );
}
void hb_gt_Done( void )
void hb_gt_Exit( void )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Done()"));
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Exit()"));
}
int hb_gt_ReadKey( HB_inkey_enum eventmask )

View File

@@ -234,9 +234,9 @@ void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
*/
}
void hb_gt_Done( void )
void hb_gt_Exit( void )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Done()"));
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Exit()"));
if( s_HOutput != s_HOriginal )
{