diff --git a/CmdParser.cpp b/CmdParser.cpp index 4c7c9b3..f371a76 100644 --- a/CmdParser.cpp +++ b/CmdParser.cpp @@ -1,13 +1,13 @@ //---------------------------------------------------------------------------- -// EgalTech 2013-2013 +// EgalTech 2014-2014 //---------------------------------------------------------------------------- -// File : CmdParser.cpp Data : 25.11.13 Versione : 1.3a1 +// File : CmdParser.cpp Data : 10.05.15 Versione : 1.5e1 // Contenuto : Implementazione della classe CCmdParser. // // // // Modifiche : 19.01.13 DS Creazione modulo. -// +// 10.05.14 DS Modif. per DirReplace. // //---------------------------------------------------------------------------- @@ -40,6 +40,7 @@ CmdParser::CmdParser( void) m_ExecMgr.Insert( "COUNTER", &CmdParser::ExecuteCounter) ; m_ExecMgr.Insert( "DIR", &CmdParser::ExecuteDir) ; m_ExecMgr.Insert( "FILE", &CmdParser::ExecuteFile) ; + m_ExecMgr.Insert( "DIRREPLACE", &CmdParser::ExecuteDirReplace) ; m_ExecMgr.Insert( "PAUSE", &CmdParser::ExecutePause) ; m_ExecMgr.Insert( "RESET", &CmdParser::ExecuteReset) ; m_ExecMgr.Insert( "RUN", &CmdParser::ExecuteRun) ; @@ -102,7 +103,7 @@ CmdParser::Init( void) //---------------------------------------------------------------------------- bool -CmdParser::Run( const std::string& sCmdFile, bool bIsolated) +CmdParser::Run( const string& sCmdFile, bool bIsolated) { bool bOk ; string sOut ; @@ -207,14 +208,14 @@ CmdParser::ExecLine( const string& sCmdLine, bool bIsolated) //---------------------------------------------------------------------------- bool -CmdParser::AddVariable( const std::string& sName, int nVal) +CmdParser::AddVariable( const string& sName, int nVal) { return ( m_NameMap.insert( NameMap::value_type( sName, nVal)).second) ; } //---------------------------------------------------------------------------- bool -CmdParser::SetVariable( const std::string& sName, int nVal) +CmdParser::SetVariable( const string& sName, int nVal) { NameMap::iterator Iter ; Iter = m_NameMap.find( sName) ; @@ -228,7 +229,7 @@ CmdParser::SetVariable( const std::string& sName, int nVal) //---------------------------------------------------------------------------- bool -CmdParser::GetVariable( const std::string& sName, int& nVal) +CmdParser::GetVariable( const string& sName, int& nVal) { NameMap::const_iterator Iter ; Iter = m_NameMap.find( sName) ; @@ -242,7 +243,7 @@ CmdParser::GetVariable( const std::string& sName, int& nVal) //---------------------------------------------------------------------------- bool -CmdParser::RemoveVariable( const std::string& sName) +CmdParser::RemoveVariable( const string& sName) { return ( m_NameMap.erase( sName) > 0) ; } @@ -264,9 +265,53 @@ CmdParser::ResetAllVariables( void) return true ; } +//---------------------------------------------------------------------------- +void +CmdParser::ResetDirReplace( void) +{ + m_DirReplace.clear() ; +} + +//---------------------------------------------------------------------------- +bool +CmdParser::SetDirReplace( const string& sToken, const string& sReplace) +{ + // se il token è già presente, ne aggiorno la stringa di replace + for ( size_t i = 0 ; i < m_DirReplace.size() ; ++i) { + if ( m_DirReplace[i].first == sToken) { + m_DirReplace[i].second = sReplace ; + return true ; + } + } + // altrimenti lo aggiungo in coda + try { m_DirReplace.push_back( make_pair( sToken, sReplace)) ; } + catch (...) { return false ; } + return true ; +} + //---------------------------------------------------------------------------- int -CmdParser::GetIdParam( const std::string& sParam, bool bNewAllowed) +CmdParser::DirReplace( string& sPath) +{ + int nRep = 0 ; + for ( size_t i = 0 ; i < m_DirReplace.size() ; ++i) + nRep += ReplaceString( sPath, m_DirReplace[i].first, m_DirReplace[i].second) ; + return nRep ; +} + +//---------------------------------------------------------------------------- +int +CmdParser::DirInvReplace( string& sPath) +{ + int nRep = 0 ; + for ( size_t i = 0 ; i < m_DirReplace.size() ; ++i) + nRep += ReplaceString( sPath, m_DirReplace[i].second, m_DirReplace[i].first) ; + return nRep ; +} + +//---------------------------------------------------------------------------- +int +CmdParser::GetIdParam( const string& sParam, bool bNewAllowed) { int nVal ; // se nome di identificatore numerico @@ -291,12 +336,10 @@ CmdParser::GetIdParam( const std::string& sParam, bool bNewAllowed) } //---------------------------------------------------------------------------- -const string +string CmdParser::GetInitSpaces( void) { string sIni ; - - for ( int i = 0 ; i < m_nLev ; ++ i) sIni += " " ; @@ -376,14 +419,14 @@ CmdParser::ExecuteDir( const string& sCmd2, const STRVECTOR& vsParams) { // analisi ed esecuzione dei comandi if ( sCmd2 == "EMPTY") { - // 1 parametro : nome direttorio da svuotare if ( vsParams.size() != 1) return false ; - + // eventuale conversione di token nel nome direttorio + string sDir = vsParams[0] ; + DirReplace( sDir) ; // svuoto il direttorio - EmptyDirectory( vsParams[0]) ; - + EmptyDirectory( sDir) ; return true ; } @@ -440,42 +483,73 @@ CmdParser::ExecuteFile( const string& sCmd2, const STRVECTOR& vsParams) // 1 parametro : file if ( vsParams.size() != 1) return false ; - + // eventuale conversione di token nel nome file + string sFile = vsParams[0] ; + DirReplace( sFile) ; // eseguo la cancellazione - EraseFile( vsParams[0]) ; - + EraseFile( sFile) ; return true ; } // confronto tra file di testo else if ( sCmd2 == "CMP") { - // 4 parametri : file1, file2, inizio commento, file diff if ( vsParams.size() != 4) return false ; - + // eventuale conversione di token nei nomi file + string sFile1 = vsParams[0] ; + DirReplace( sFile1) ; + string sFile2 = vsParams[1] ; + DirReplace( sFile2) ; + string sFileDiff = vsParams[3] ; + DirReplace( sFileDiff) ; // eseguo il confronto - TextFileCompare( vsParams[0], vsParams[1], vsParams[2], vsParams[3]) ; - + TextFileCompare( sFile1, sFile2, vsParams[2], sFileDiff) ; return true ; } // confronto tra file binari else if ( sCmd2 == "BINCMP") { - // 3 parametri : file1, file2, file diff if ( vsParams.size() != 3) return false ; - + // eventuale conversione di token nei nomi file + string sFile1 = vsParams[0] ; + DirReplace( sFile1) ; + string sFile2 = vsParams[1] ; + DirReplace( sFile2) ; + string sFileDiff = vsParams[2] ; + DirReplace( sFileDiff) ; // eseguo il confronto - BinaryFileCompare( vsParams[0], vsParams[1], vsParams[2]) ; - + BinaryFileCompare( sFile1, sFile2, sFileDiff) ; return true ; } return false ; } +//---------------------------------------------------------------------------- +bool +CmdParser::ExecuteDirReplace( const string& sCmd2, const STRVECTOR& vsParams) +{ + if ( sCmd2 == "SET") { + // 2 parametri : sToken, sReplace + if ( vsParams.size() != 2) + return false ; + // eseguo + return SetDirReplace( vsParams[0], vsParams[1]) ; + } + else if ( sCmd2 == "RESET") { + // 0 parametri + if ( vsParams.size() != 0) + return false ; + // eseguo + ResetDirReplace() ; + return true ; + } + return false ; +} + //---------------------------------------------------------------------------- bool CmdParser::ExecutePause( const string& sCmd2, const STRVECTOR& vsParams) @@ -483,7 +557,6 @@ CmdParser::ExecutePause( const string& sCmd2, const STRVECTOR& vsParams) if ( sCmd2.empty()) { const int MIN_TIME = 0 ; const int MAX_TIME = 10000 ; - // 1 parametro : durata della pausa in ms if ( vsParams.size() != 1) return false ; @@ -539,6 +612,9 @@ CmdParser::ExecuteRun( const string& sCmd2, const STRVECTOR& vsParams) // almeno 1 parametro : nome file di script da eseguire if ( vsParams.size() < 1) return false ; + // eventuale conversione di token nel nome file + string sFile = vsParams[0] ; + DirReplace( sFile) ; // se esiste 2° parametro è flag di ignora errori bool bSkipErrors = false ; if ( vsParams.size() >= 2) @@ -548,7 +624,7 @@ CmdParser::ExecuteRun( const string& sCmd2, const STRVECTOR& vsParams) return false ; // esecuzione comando ++ m_nLev ; - bool bOk = Run( vsParams[0]) ; + bool bOk = Run( sFile) ; -- m_nLev ; return ( bOk || bSkipErrors) ; } @@ -580,7 +656,7 @@ CmdParser::ExecuteSet( const string& sCmd2, const STRVECTOR& vsParams) //---------------------------------------------------------------------------- bool -CmdParser::GetNamesParam( const std::string& sParam, STRVECTOR& vsNames) +CmdParser::GetNamesParam( const string& sParam, STRVECTOR& vsNames) { STRVECTOR::iterator Iter ; diff --git a/CmdParser.h b/CmdParser.h index dd55197..c0e1d20 100644 --- a/CmdParser.h +++ b/CmdParser.h @@ -31,6 +31,10 @@ class CmdParser : public ICmdParser virtual bool SetVariable( const std::string& sName, int nVal) ; virtual bool GetVariable( const std::string& sName, int& nVal) ; virtual bool RemoveVariable( const std::string& sName) ; + virtual void ResetDirReplace( void) ; + virtual bool SetDirReplace( const std::string& sToken, const std::string& sReplace) ; + virtual int DirReplace( std::string& sPath) ; + virtual int DirInvReplace( std::string& sPath) ; virtual int GetIdParam( const std::string& sParam, bool bNewAllowed = false) ; virtual bool Run( const std::string& sCmdFile, bool bIsolated = true) ; virtual bool ExecLine( const std::string& sCmdLine, bool bIsolated = false) ; @@ -40,12 +44,13 @@ class CmdParser : public ICmdParser private : bool ResetAllVariables( void) ; - const std::string GetInitSpaces( void) ; + std::string GetInitSpaces( void) ; bool ExecCommand( const std::string& sCmd, const std::string& sParams) ; bool ExecuteCounter( const std::string& sCmd2, const STRVECTOR& vsParams) ; bool ExecuteDir( const std::string& sCmd2, const STRVECTOR& vsParams) ; bool ExecuteExec( const std::string& sCmd2, const STRVECTOR& vsParams) ; bool ExecuteFile( const std::string& sCmd2, const STRVECTOR& vsParams) ; + bool ExecuteDirReplace( const std::string& sCmd2, const STRVECTOR& vsParams) ; bool ExecutePause( const std::string& sCmd2, const STRVECTOR& vsParams) ; bool ExecuteReset( const std::string& sCmd2, const STRVECTOR& vsParams) ; bool ExecuteRun( const std::string& sCmd2, const STRVECTOR& vsParams) ; @@ -55,6 +60,7 @@ class CmdParser : public ICmdParser private : typedef std::list PCmdExecList ; typedef std::unordered_map NameMap ; + typedef std::vector> StrStrVector ; private : enum Exec{ SKIP = 1, DO = 2, STOP = 3} ; @@ -67,4 +73,5 @@ class CmdParser : public ICmdParser Exec m_nExec ; int m_nCurrLine ; PerformanceCounter m_Counter ; + StrStrVector m_DirReplace ; } ; diff --git a/EgtGeneral.rc b/EgtGeneral.rc index 087cc7b..460da5a 100644 Binary files a/EgtGeneral.rc and b/EgtGeneral.rc differ diff --git a/Scan.cpp b/Scan.cpp index 2df87cf..de8424f 100644 --- a/Scan.cpp +++ b/Scan.cpp @@ -38,10 +38,11 @@ Scanner::Init( const std::string& sFile, const char* szRemInit, bool bSkipEmptyL m_sFName = sFile ; // assegno i caratteri di inizio commento - if ( szRemInit != NULL) + if ( szRemInit != nullptr) m_sRemInit = szRemInit ; else - m_sRemInit = "//" ; + m_sRemInit = "" ; + m_bFindRem = ! m_sRemInit.empty() ; // assegno flag per saltare linee vuote m_bSkipEmptyLine = bSkipEmptyLine ; @@ -83,7 +84,8 @@ Scanner::GetLine( string& sLine) TrimUtf8Bom( sLine) ; Trim( sLine) ; m_nLineNbr ++ ; - } while ( ( m_bSkipEmptyLine && sLine.empty()) || sLine.find( m_sRemInit) == 0) ; + } while ( ( m_bSkipEmptyLine && sLine.empty()) || + ( m_bFindRem && sLine.find( m_sRemInit) == 0)) ; m_nDeltaLineUnget = m_nLineNbr - nOldLineNbr ; } return true ;