From b2d1490a0626e49cc8a292e82d146a1a9435b513 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Wed, 30 Jun 2010 21:02:04 +0000 Subject: [PATCH] 2010-06-30 22:49 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * utils/hbrun/hbrun.prg + Added load/save of command history. It can be disabled by -p cmdline option or by adding a single line "no" (without quotes) to the history filename. Otherwise last 500 commands will be remembered. History filename is %APPDATA|HOME%/.harbour/.hbrun_history if such envvar is present, otherwise hbrun dir. On MS-DOS it's hbrun dir and hbrunhst.ini. * utils/hbmk2/hbmk2.prg * Minor variable/constant name cleanup. * contrib/hbqt/hbmk2_plugin_qt.prg ! Typo in #if statements. --- harbour/ChangeLog | 16 +++ harbour/contrib/hbqt/hbmk2_plugin_qt.prg | 4 +- harbour/utils/hbmk2/hbmk2.prg | 56 ++++----- harbour/utils/hbrun/hbrun.prg | 147 ++++++++++++++++++----- 4 files changed, 161 insertions(+), 62 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index df03a89c58..d37be830e9 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,22 @@ The license applies to all entries newer than 2009-04-28. */ +2010-06-30 22:49 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * utils/hbrun/hbrun.prg + + Added load/save of command history. + It can be disabled by -p cmdline option or by adding + a single line "no" (without quotes) to the history filename. + Otherwise last 500 commands will be remembered. + History filename is %APPDATA|HOME%/.harbour/.hbrun_history + if such envvar is present, otherwise hbrun dir. On MS-DOS + it's hbrun dir and hbrunhst.ini. + + * utils/hbmk2/hbmk2.prg + * Minor variable/constant name cleanup. + + * contrib/hbqt/hbmk2_plugin_qt.prg + ! Typo in #if statements. + 2010-06-30 10:23 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) * contrib/hbide/idebrowse.prg ! Fixed: closing a table in ideDBU was causing RTE. diff --git a/harbour/contrib/hbqt/hbmk2_plugin_qt.prg b/harbour/contrib/hbqt/hbmk2_plugin_qt.prg index 3d9c3966de..8eddb7ea76 100644 --- a/harbour/contrib/hbqt/hbmk2_plugin_qt.prg +++ b/harbour/contrib/hbqt/hbmk2_plugin_qt.prg @@ -77,7 +77,7 @@ FUNCTION hbmk2_plugin_qt( hbmk2 ) NEXT FOR EACH cSrc IN hbmk2[ "vars" ][ "aQRC_Src" ] -#if __OWN_QRC_GENERATOR__ +#ifdef __OWN_QRC_GENERATOR__ cDst := hbmk2_FNameDirExtSet( "rcc_" + hbmk2_FNameNameGet( cSrc ), hbmk2[ "cWorkDir" ], ".c" ) AAdd( hbmk2[ "vars" ][ "aQRC_Dst" ], cDst ) hbmk2_AddInput_C( hbmk2, cDst ) @@ -228,7 +228,7 @@ FUNCTION hbmk2_plugin_qt( hbmk2 ) IF lBuildIt -#if __OWN_QRC_GENERATOR__ +#ifdef __OWN_QRC_GENERATOR__ FClose( hb_FTempCreateEx( @cTmp ) ) cCommand := cRCC_BIN +; diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index 7eed59f53f..72080c9132 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -192,12 +192,12 @@ REQUEST hbmk_KEYW #define _ESC_DBLQUOTE 1 #define _ESC_SGLQUOTE_WATCOM 2 #define _ESC_NIX 3 -#define _ESC_BACKSLASH 4 +#define _ESC_BCKSLASH 4 -#define _FNF_BACKSLASH 0 -#define _FNF_FWSLASH 1 -#define _FNF_FWSLASHCYGWIN 2 -#define _FNF_FWSLASHMSYS 3 +#define _FNF_BCKSLASH 0 +#define _FNF_FWDSLASH 1 +#define _FNF_FWDSLASHCYGWIN 2 +#define _FNF_FWDSLASHMSYS 3 #define _MACRO_NO_PREFIX "" #define _MACRO_NORM_PREFIX "$" @@ -2833,9 +2833,9 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) ( hbmk[ _HBMK_cPLAT ] == "win" .AND. hbmk[ _HBMK_cCOMP ] == "cygwin" ) IF hbmk[ _HBMK_cCOMP ] == "cygwin" - hbmk[ _HBMK_nCmd_FNF ] := _FNF_FWSLASHCYGWIN + hbmk[ _HBMK_nCmd_FNF ] := _FNF_FWDSLASHCYGWIN ELSE - hbmk[ _HBMK_nCmd_FNF ] := _FNF_FWSLASH + hbmk[ _HBMK_nCmd_FNF ] := _FNF_FWDSLASH ENDIF IF hbmk[ _HBMK_lDEBUG ] @@ -2981,7 +2981,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) ENDIF CASE hbmk[ _HBMK_cPLAT ] == "os2" .AND. hbmk[ _HBMK_cCOMP ] $ "gcc|gccomf" - hbmk[ _HBMK_nCmd_FNF ] := _FNF_BACKSLASH + hbmk[ _HBMK_nCmd_FNF ] := _FNF_BCKSLASH IF hbmk[ _HBMK_lDEBUG ] AAdd( hbmk[ _HBMK_aOPTC ], "-g" ) ENDIF @@ -3346,7 +3346,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) ENDIF CASE hbmk[ _HBMK_cPLAT ] == "win" .AND. hbmk[ _HBMK_cCOMP ] == "bcc" - hbmk[ _HBMK_nCmd_FNF ] := _FNF_BACKSLASH + hbmk[ _HBMK_nCmd_FNF ] := _FNF_BCKSLASH #if defined( __PLATFORM__UNIX ) hbmk[ _HBMK_nCmd_Esc ] := _ESC_NIX #else @@ -3442,7 +3442,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) CASE ( hbmk[ _HBMK_cPLAT ] == "win" .AND. hbmk[ _HBMK_cCOMP ] $ "msvc|msvc64|msvcia64|icc|iccia64" ) .OR. ; ( hbmk[ _HBMK_cPLAT ] == "wce" .AND. hbmk[ _HBMK_cCOMP ] == "msvcarm" ) /* NOTE: Cross-platform: wce/ARM on win/x86 */ - hbmk[ _HBMK_nCmd_FNF ] := _FNF_BACKSLASH + hbmk[ _HBMK_nCmd_FNF ] := _FNF_BCKSLASH #if defined( __PLATFORM__UNIX ) hbmk[ _HBMK_nCmd_Esc ] := _ESC_NIX #else @@ -3659,7 +3659,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) ( hbmk[ _HBMK_cPLAT ] == "wce" .AND. hbmk[ _HBMK_cCOMP ] == "poccarm" ) .OR. ; /* NOTE: Cross-platform: wce/ARM on win/x86 */ ( hbmk[ _HBMK_cPLAT ] == "win" .AND. hbmk[ _HBMK_cCOMP ] == "xcc" ) - hbmk[ _HBMK_nCmd_FNF ] := _FNF_BACKSLASH + hbmk[ _HBMK_nCmd_FNF ] := _FNF_BCKSLASH #if defined( __PLATFORM__UNIX ) hbmk[ _HBMK_nCmd_Esc ] := _ESC_NIX #else @@ -7213,19 +7213,19 @@ STATIC FUNCTION FN_Escape( cFileName, nEscapeMode, nFNNotation ) #if defined( __PLATFORM__WINDOWS ) .OR. ; defined( __PLATFORM__DOS ) .OR. ; defined( __PLATFORM__OS2 ) - DEFAULT nFNNotation TO _FNF_BACKSLASH + DEFAULT nFNNotation TO _FNF_BCKSLASH #else - DEFAULT nFNNotation TO _FNF_FWSLASH + DEFAULT nFNNotation TO _FNF_FWDSLASH #endif SWITCH nFNNotation - CASE _FNF_BACKSLASH + CASE _FNF_BCKSLASH cFileName := StrTran( cFileName, "/", "\" ) EXIT - CASE _FNF_FWSLASH + CASE _FNF_FWDSLASH cFileName := StrTran( cFileName, "\", "/" ) EXIT - CASE _FNF_FWSLASHCYGWIN + CASE _FNF_FWDSLASHCYGWIN hb_FNameSplit( cFileName, @cDir, @cName, @cExt, @cDrive ) IF ! Empty( cDrive ) cDir := SubStr( cDir, Len( cDrive + hb_osDriveSeparator() ) + 1 ) @@ -7237,7 +7237,7 @@ STATIC FUNCTION FN_Escape( cFileName, nEscapeMode, nFNNotation ) ENDIF cFileName := StrTran( cFileName, "\", "/" ) EXIT - CASE _FNF_FWSLASHMSYS + CASE _FNF_FWDSLASHMSYS hb_FNameSplit( cFileName, @cDir, @cName, @cExt, @cDrive ) IF ! Empty( cDrive ) cDir := SubStr( cDir, Len( cDrive + hb_osDriveSeparator() ) + 1 ) @@ -7273,7 +7273,7 @@ STATIC FUNCTION FN_Escape( cFileName, nEscapeMode, nFNNotation ) CASE _ESC_NIX cFileName := "'" + StrTran( cFileName, "'", "'\''" ) + "'" EXIT - CASE _ESC_BACKSLASH + CASE _ESC_BCKSLASH cFileName := StrTran( cFileName, "\", "\\" ) EXIT ENDSWITCH @@ -7416,10 +7416,10 @@ STATIC FUNCTION HBC_ProcessOne( hbmk, cFileName, nNestingLevel ) cFile := MemoRead( cFileName ) /* NOTE: Intentionally using MemoRead() which handles EOF char. */ - IF ! hb_osNewLine() == _CHR_EOL + IF !( hb_osNewLine() == _CHR_EOL ) cFile := StrTran( cFile, hb_osNewLine(), _CHR_EOL ) ENDIF - IF ! hb_osNewLine() == Chr( 13 ) + Chr( 10 ) + IF !( hb_osNewLine() == Chr( 13 ) + Chr( 10 ) ) cFile := StrTran( cFile, Chr( 13 ) + Chr( 10 ), _CHR_EOL ) ENDIF @@ -7879,10 +7879,10 @@ STATIC PROCEDURE HBM_Load( hbmk, aParams, cFileName, nNestingLevel ) cFile := MemoRead( cFileName ) /* NOTE: Intentionally using MemoRead() which handles EOF char. */ - IF ! hb_osNewLine() == _CHR_EOL + IF !( hb_osNewLine() == _CHR_EOL ) cFile := StrTran( cFile, hb_osNewLine(), _CHR_EOL ) ENDIF - IF ! hb_osNewLine() == Chr( 13 ) + Chr( 10 ) + IF !( hb_osNewLine() == Chr( 13 ) + Chr( 10 ) ) cFile := StrTran( cFile, Chr( 13 ) + Chr( 10 ), _CHR_EOL ) ENDIF @@ -8370,7 +8370,7 @@ STATIC PROCEDURE PlatformPRGFlags( hbmk, aOPTPRG ) #define RTLNK_MODE_SKIPNEXT 7 STATIC PROCEDURE rtlnk_libtrans( aLibList ) - STATIC hTrans := { ; + STATIC s_hTrans := { ; "CT" => "hbct" , ; "CTP" => "hbct" , ; "CLASSY" => NIL , ; @@ -8402,8 +8402,8 @@ STATIC PROCEDURE rtlnk_libtrans( aLibList ) IF Lower( Right( cLib, 4 ) ) == ".lib" cLib := Left( cLib, Len( cLib ) - 4 ) ENDIF - IF Upper( cLib ) $ hTrans - cLib := hTrans[ Upper( cLib ) ] + IF Upper( cLib ) $ s_hTrans + cLib := s_hTrans[ Upper( cLib ) ] IF cLib == NIL hb_ADel( aLibList, cLib:__enumIndex(), .T. ) ENDIF @@ -8413,7 +8413,7 @@ STATIC PROCEDURE rtlnk_libtrans( aLibList ) RETURN STATIC PROCEDURE rtlnk_filetrans( aFileList ) - STATIC hTrans := { ; + STATIC s_hTrans := { ; "CTUS" => NIL , ; "CTUSP" => NIL , ; "CTINT" => NIL , ; @@ -8441,8 +8441,8 @@ STATIC PROCEDURE rtlnk_filetrans( aFileList ) IF Lower( Right( cFile, 4 ) ) == ".obj" cFile := Left( cFile, Len( cFile ) - 4 ) ENDIF - IF Upper( cFile ) $ hTrans - cFile := hTrans[ Upper( cFile ) ] + IF Upper( cFile ) $ s_hTrans + cFile := s_hTrans[ Upper( cFile ) ] IF cFile == NIL hb_ADel( aFileList, cFile:__enumIndex(), .T. ) ENDIF diff --git a/harbour/utils/hbrun/hbrun.prg b/harbour/utils/hbrun/hbrun.prg index 076a2463d3..ff7295ffb1 100644 --- a/harbour/utils/hbrun/hbrun.prg +++ b/harbour/utils/hbrun/hbrun.prg @@ -74,6 +74,8 @@ REQUEST HB_GT_STD STATIC s_nRow := 2 STATIC s_nCol := 0 STATIC s_aIncDir := {} +STATIC s_aHistory := {} +STATIC s_lPreserveHistory := .T. /* ********************************************************************** */ @@ -99,11 +101,16 @@ PROCEDURE _APPMAIN( cFile, ... ) CASE "--help" CASE "/?" CASE "/h" - HB_DotUsage() + hbrun_Usage() EXIT CASE "-v" CASE "/v" - HB_DotPrompt( "? hb_version()" ) + hbrun_Prompt( "? hb_version()" ) + EXIT + CASE "-p" + CASE "/p" + s_lPreserveHistory := .F. + hbrun_Prompt() EXIT OTHERWISE hb_FNameSplit( cFile, NIL, NIL, @cExt ) @@ -115,11 +122,11 @@ PROCEDURE _APPMAIN( cFile, ... ) CASE ".dbf" EXIT OTHERWISE - cExt := HB_DotFileSig( cFile ) + cExt := hbrun_FileSig( cFile ) ENDSWITCH SWITCH cExt CASE ".dbf" - HB_DotPrompt( "USE " + cFile ) + hbrun_Prompt( "USE " + cFile ) EXIT CASE ".prg" CASE ".hbs" @@ -135,12 +142,18 @@ PROCEDURE _APPMAIN( cFile, ... ) ENDSWITCH ENDSWITCH ELSE - HB_DotPrompt() + hbrun_Prompt() ENDIF RETURN -STATIC FUNCTION HB_DotFileSig( cFile ) +EXIT PROCEDURE hbrun_exit() + + hbrun_HistorySave() + + RETURN + +STATIC FUNCTION hbrun_FileSig( cFile ) LOCAL hFile LOCAL cBuff, cSig, cExt @@ -158,23 +171,26 @@ STATIC FUNCTION HB_DotFileSig( cFile ) RETURN cExt -STATIC PROCEDURE HB_DotPrompt( cCommand ) +STATIC PROCEDURE hbrun_Prompt( cCommand ) LOCAL GetList LOCAL cLine LOCAL nMaxRow, nMaxCol - LOCAL aHistory, nHistIndex + LOCAL nHistIndex LOCAL bKeyUP, bKeyDown, bKeyIns CLEAR SCREEN SET SCOREBOARD OFF GetList := {} - aHistory := { padr( "quit", HB_LINE_LEN ) } - nHistIndex := 2 + + hbrun_HistoryLoad() + + AADD( s_aHistory, padr( "quit", HB_LINE_LEN ) ) + nHistIndex := Len( s_aHistory ) + 1 IF ISCHARACTER( cCommand ) - AADD( aHistory, PadR( cCommand, HB_LINE_LEN ) ) - HB_DotInfo( cCommand ) - HB_DotExec( cCommand ) + AADD( s_aHistory, PadR( cCommand, HB_LINE_LEN ) ) + hbrun_Info( cCommand ) + hbrun_Exec( cCommand ) ELSE cCommand := "" ENDIF @@ -185,7 +201,7 @@ STATIC PROCEDURE HB_DotPrompt( cCommand ) cLine := Space( HB_LINE_LEN ) ENDIF - HB_DotInfo( cCommand ) + hbrun_Info( cCommand ) nMaxRow := MaxRow() nMaxCol := MaxCol() @@ -199,12 +215,12 @@ STATIC PROCEDURE HB_DotPrompt( cCommand ) {|| SetCursor( IIF( ReadInsert( !ReadInsert() ), ; SC_NORMAL, SC_INSERT ) ) } ) bKeyUp := SetKey( K_UP, ; - {|| IIF( nHistIndex > 1, ; - cLine := aHistory[ --nHistIndex ], ) } ) + {|| IIF( nHistIndex > 1, ; + cLine := s_aHistory[ --nHistIndex ], ) } ) bKeyDown := SetKey( K_DOWN, ; - {|| cLine := IIF( nHistIndex < LEN( aHistory ), ; - aHistory[ ++nHistIndex ], ; - ( nHistIndex := LEN( aHistory ) + 1, Space( HB_LINE_LEN ) ) ) } ) + {|| cLine := IIF( nHistIndex < LEN( s_aHistory ), ; + s_aHistory[ ++nHistIndex ], ; + ( nHistIndex := LEN( s_aHistory ) + 1, Space( HB_LINE_LEN ) ) ) } ) READ @@ -220,22 +236,22 @@ STATIC PROCEDURE HB_DotPrompt( cCommand ) LOOP ENDIF - IF EMPTY( aHistory ) .OR. ! ATAIL( aHistory ) == cLine - IF LEN( aHistory ) < HB_HISTORY_LEN - AADD( aHistory, cLine ) + IF EMPTY( s_aHistory ) .OR. ! ATAIL( s_aHistory ) == cLine + IF LEN( s_aHistory ) < HB_HISTORY_LEN + AADD( s_aHistory, cLine ) ELSE - ADEL( aHistory, 1 ) - aHistory[ LEN( aHistory ) ] := cLine + ADEL( s_aHistory, 1 ) + s_aHistory[ LEN( s_aHistory ) ] := cLine ENDIF ENDIF - nHistIndex := LEN( aHistory ) + 1 + nHistIndex := LEN( s_aHistory ) + 1 cCommand := AllTrim( cLine, " " ) cLine := NIL @ nMaxRow, 0 CLEAR - HB_DotInfo( cCommand ) + hbrun_Info( cCommand ) - HB_DotExec( cCommand ) + hbrun_Exec( cCommand ) IF s_nRow >= MaxRow() Scroll( 2, 0, MaxRow(), MaxCol(), 1 ) @@ -248,7 +264,7 @@ STATIC PROCEDURE HB_DotPrompt( cCommand ) /* ********************************************************************** */ -STATIC PROCEDURE HB_DotUsage() +STATIC PROCEDURE hbrun_Usage() OutStd( 'Harbour "DOt Prompt" Console / runner ' + HBRawVersion() + HB_OSNewLine() +; "Copyright (c) 1999-2010, Przemyslaw Czerpak" + HB_OSNewLine() + ; @@ -260,7 +276,7 @@ STATIC PROCEDURE HB_DotUsage() /* ********************************************************************** */ -STATIC PROCEDURE HB_DotInfo( cCommand ) +STATIC PROCEDURE hbrun_Info( cCommand ) LOCAL r := Row(), c := Col() @@ -291,7 +307,7 @@ STATIC PROCEDURE HB_DotInfo( cCommand ) /* ********************************************************************** */ -STATIC PROCEDURE HB_DotErr( oErr, cCommand ) +STATIC PROCEDURE hbrun_Err( oErr, cCommand ) LOCAL xArg, cMessage @@ -315,7 +331,7 @@ STATIC PROCEDURE HB_DotErr( oErr, cCommand ) /* ********************************************************************** */ -STATIC PROCEDURE HB_DotExec( cCommand ) +STATIC PROCEDURE hbrun_Exec( cCommand ) LOCAL pHRB, cHRB, cFunc, bBlock, cEol cEol := hb_osNewLine() @@ -325,7 +341,7 @@ STATIC PROCEDURE HB_DotExec( cCommand ) " RETURN __MVSETBASE()" + cEol + ; "}" + cEol - BEGIN SEQUENCE WITH {|oErr| HB_DotErr( oErr, cCommand ) } + BEGIN SEQUENCE WITH {|oErr| hbrun_Err( oErr, cCommand ) } cHRB := HB_COMPILEFROMBUF( cFunc, HB_ARGV( 0 ), "-n", "-q2", s_aIncDir ) IF cHRB == NIL @@ -354,3 +370,70 @@ STATIC FUNCTION HBRawVersion() RETURN StrTran( Version(), "Harbour " ) /* ********************************************************************** */ + +#define _HISTORY_DISABLE_LINE "no" +#define _HISTORY_SAVE_LINE_MAX 500 + +STATIC PROCEDURE hbrun_HistoryLoad() + LOCAL cHistory + LOCAL cLine + + IF s_lPreserveHistory + cHistory := StrTran( MemoRead( hbrun_HistoryFileName() ), Chr( 13 ) ) + IF Left( cHistory, Len( _HISTORY_DISABLE_LINE + Chr( 10 ) ) ) == _HISTORY_DISABLE_LINE + Chr( 10 ) + s_lPreserveHistory := .F. + ELSE + FOR EACH cLine IN hb_ATokens( StrTran( cHistory, Chr( 13 ) ), Chr( 10 ) ) + IF ! Empty( cLine ) + AAdd( s_aHistory, PadR( cLine, HB_LINE_LEN ) ) + ENDIF + NEXT + ENDIF + ENDIF + + RETURN + +STATIC PROCEDURE hbrun_HistorySave() + LOCAL cHistory + LOCAL tmp + + IF s_lPreserveHistory + cHistory := "" + FOR tmp := Max( 1, Len( s_aHistory ) - _HISTORY_SAVE_LINE_MAX ) TO Len( s_aHistory ) + IF !( Lower( AllTrim( s_aHistory[ tmp ] ) ) == "quit" ) + cHistory += AllTrim( s_aHistory[ tmp ] ) + hb_osNewLine() + ENDIF + NEXT + hb_MemoWrit( hbrun_HistoryFileName(), cHistory ) + ENDIF + + RETURN + +STATIC FUNCTION hbrun_HistoryFileName() + LOCAL cEnvVar + LOCAL cDir + LOCAL cFileName + +#if defined( __PLATFORM__WINDOWS ) + cEnvVar := "APPDATA" +#else + cEnvVar := "HOME" +#endif + +#if defined( __PLATFORM__DOS ) + cFileName := "hbrunhst.ini" +#else + cFileName := ".hbrun_history" +#endif + + IF ! Empty( GetEnv( cEnvVar ) ) + cDir := GetEnv( cEnvVar ) + hb_osPathSeparator() + ".harbour" + ELSE + cDir := hb_dirBase() + ENDIF + + IF ! hb_dirExists( cDir ) + MakeDir( cDir ) + ENDIF + + RETURN cDir + hb_osPathSeparator() + cFileName