X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=kernel%2Fsrc%2FbbtkInterpreter.cxx;h=ab0075d2e84030d01bd0ac1bd3c5a16b0adf3d46;hb=b9da3baf83b7791357c78322e3280314ec782f40;hp=2147d0ca35c1b84760ca57380c523ad77b85b89a;hpb=372f03317f05d4a436b0f9c39b98558ec4810b78;p=bbtk.git diff --git a/kernel/src/bbtkInterpreter.cxx b/kernel/src/bbtkInterpreter.cxx index 2147d0c..ab0075d 100644 --- a/kernel/src/bbtkInterpreter.cxx +++ b/kernel/src/bbtkInterpreter.cxx @@ -3,8 +3,8 @@ Program: bbtk Module: $RCSfile: bbtkInterpreter.cxx,v $ $ Language: C++ - Date: $Date: 2008/03/18 12:51:26 $ - Version: $Revision: 1.46 $ + Date: $Date: 2008/03/26 08:51:43 $ + Version: $Revision: 1.56 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -23,7 +23,6 @@ #include "bbtkInterpreter.h" #include "bbtkMessageManager.h" #include "bbtkConfigurationFile.h" -#include "bbtkWxConsole.h" #include "bbtkUtilities.h" #include #include @@ -45,10 +44,9 @@ namespace bbtk */ Interpreter::Interpreter() : -#ifdef _USE_WXWIDGETS_ - mWxConsole(0), -#endif - mCommandLine(false) + mUser(0), + mCommandLine(false), + mThrow(false) { bufferNb =0; bbtk::MessageManager::RegisterMessageType("Echo","Level>0 : Prints the 'echo' commands of the user.\n\tLevel>1 : Prints the command being interpreted",1); @@ -298,92 +296,192 @@ bufferNb =0; //======================================================================= + InterpreterError::InterpreterError( const std::string& message, + bool in_script_file, + const std::string& script_file, + int script_line + ) + : Exception("Interpreter",0,message), + mInScriptFile(in_script_file), + mScriptFile(script_file), + mScriptLine(script_line) + { + } + InterpreterError::InterpreterError( const Exception& excep, + bool in_script_file, + const std::string& script_file, + int script_line + ) + : Exception(excep), + mInScriptFile(in_script_file), + mScriptFile(script_file), + mScriptLine(script_line) + { + } + //======================================================================= + void Interpreter::CatchBbtkException( const bbtk::Exception& e ) + { + if (mThrow) + { + bool in_script = false; + std::string file(""); + int line = 0; + if (mFileName.size()) { + std::ifstream* fs = dynamic_cast(mFile.back()); + if (fs!=0) in_script = true; + file = mFileName.back(); + line = mLine.back(); + } + CloseAllFiles(); + throw InterpreterError(e,in_script,file,line); + } + else + { + std::stringstream mess; + mess << "* ERROR : "<(mFile.back()); + if (fs!=0) in_script = true; + file = mFileName.back(); + line = mLine.back(); + } + CloseAllFiles(); + throw InterpreterError(e.what(),in_script,file,line); + } + else + { + std::stringstream mess; + mess << "* ERROR : "<(mFile.back()); + if (fs!=0) in_script = true; + file = mFileName.back(); + line = mLine.back(); + } + CloseAllFiles(); + throw InterpreterError("Unknown exception caught", + in_script,file,line); + } + else + { + std::stringstream mess; + mess << "* UNDEFINED ERROR (not a bbtk nor a std exception)" + << std::endl; + if (mFileName.size()) { + mess << "* FILE : \""<::iterator it =mFileName.begin(); it!=mFileName.end(); ++it) - { - std::cout << "A=== [" << (*it) << "]" << std::endl; - } -*/ bool insideComment = false; // for multiline comment while (mFile.size()>0) { -/* - for( std::vector::iterator it =mFileName.begin(); it!=mFileName.end(); ++it) - { - std::cout << "B=== [" << (*it) << "]" << std::endl; - } -*/ - - //while ((mFile.size()>0) && !mFile.back()->eof() ) - //{ -// std::cout << "mFile.size() "<< mFile.size() << " mFileName.back() [" << mFileName.back() << "]" << std::endl; - while (!mFile.back()->eof()) { - mLine.back()++; - char buf[500]; - mFile.back()->getline(buf,500); - std::string str(buf); -// std::cout << " in InterpretFile mFile.back()->getline [" << str << "]" << std::endl; - int size=str.length(); - if ( str[ size-1 ]==13 ) + while (!mFile.back()->eof()) { + mLine.back()++; + char buf[500]; + mFile.back()->getline(buf,500); + std::string str(buf); + int size=str.length(); + if ( str[ size-1 ]==13 ) { - str.erase(size-1,1); + str.erase(size-1,1); } - - InterpretLine(str, insideComment); - + + InterpretLine(str, insideComment); + }//while - //if (mFile.size()>0) CloseCurrentFile(); } } - catch (QuitException e) - { - } - catch (bbtk::Exception e) - { - std::cerr << "* ERROR : "<::iterator it =mFileName.begin(); it!=mFileName.end(); ++it) - { - std::cout << "A=== [" << (*it) << "]" << std::endl; - } -*/ bool insideComment = false; // for multiline comment while (mFile.size()>0) { -/* - for( std::vector::iterator it =mFileName.begin(); it!=mFileName.end(); ++it) - { - std::cout << "B=== [" << (*it) << "]" << std::endl; - } -*/ - - //while ((mFile.size()>0) && !mFile.back()->eof() ) - //{ -// std::cout << "mFile.size() "<< mFile.size() << " mFileName.back() [" << mFileName.back() << "]" << std::endl; - while (!mFile.back()->eof()) { - mLine.back()++; - char buf[500]; - mFile.back()->getline(buf,500); - std::string str(buf); -// std::cout << " in InterpretFile mFile.back()->getline [" << str << "]" << std::endl; - int size=str.length(); - if ( str[ size-1 ]==13 ) + while (!mFile.back()->eof()) { + mLine.back()++; + char buf[500]; + mFile.back()->getline(buf,500); + std::string str(buf); + + int size=str.length(); + if ( str[ size-1 ]==13 ) { - str.erase(size-1,1); + str.erase(size-1,1); } - - InterpretLine(str, insideComment); - - }//while - //if (mFile.size()>0) - CloseCurrentFile(); + + InterpretLine(str, insideComment); + + }//while + + CloseCurrentFile(); } } - catch (QuitException e) - { - // std::cout << "**QuitException caught**"<Remove(words[1]); + mExecuter->Destroy(words[1]); break; case cConnect : @@ -591,7 +692,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) break; case cPrint : - Print(words[1]); /// \todo use generate command + mExecuter->Print(words[1]); break; case cExec : @@ -600,7 +701,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) else if (words[1]=="unfreeze") mExecuter->SetNoExecMode(false); else - mExecuter->Update(words[1]); + mExecuter->Execute(words[1]); break; case cInput : @@ -646,12 +747,12 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) case cMessage : if (words.size()<3) { - bbtk::MessageManager::PrintInfo(); + mExecuter->HelpMessages(); } else { - sscanf(words[2].c_str(),"%d",&level); - bbtk::MessageManager::SetMessageLevel(words[1],level); + sscanf(words[2].c_str(),"%d",&level); + mExecuter->SetMessageLevel(words[1],level); } break; @@ -684,18 +785,18 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) break; case cLoad: - GetExecuter()->GetFactory()->LoadPackage(words[1]); + GetExecuter()->LoadPackage(words[1]); break; case cUnload: - GetExecuter()->GetFactory()->UnLoadPackage(words[1]); + GetExecuter()->UnLoadPackage(words[1]); break; case cQuit : delete mExecuter; throw QuitException(); break; - + /* obsolete case cWorkspace : if (words.size() == 2) { @@ -707,7 +808,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) mExecuter->SetWorkspaceName(words[2]); } break; - + */ default: bbtkInternalError("should not reach here !!!"); } @@ -757,27 +858,13 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& //======================================================================= - //======================================================================= - // Replaces substrings "\\n" by a real carriage return "\n" - void SubsBackslashN ( std::string& s ) - { - std::string ss("\\n"); - std::string::size_type pos = 0; - pos = s.find(ss,0); - char* cr = "\n"; - while ( pos != std::string::npos ) - { - s.replace(pos,2,cr,1); - pos = s.find(ss, pos-1); - } - } - //======================================================================= - + //======================================================================= /** * */ + /* void Interpreter::Print( const std::string& str) { if (mExecuter->GetNoExecMode()) return; @@ -840,12 +927,13 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& for (i= chains.begin(); i!=chains.end(); ++i) { // bbtkMessage("Echo",1,*i); - SubsBackslashN(*i); + Utilities::SubsBackslashN(*i); std::cout << *i; } std::cout << std::endl; bbtkDebugDecTab("Interpreter",9); } +*/ //======================================================================= /** @@ -880,133 +968,125 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& bbtkMessage("Interpreter",1, "look for : [" << name << "]" << std::endl); - script_paths = ConfigurationFile::GetInstance().Get_bbs_paths(); + std::string upath; pkgname = Utilities::ExtractScriptName(name,upath); - bbtkMessage("Interpreter",1, + bbtkMessage("Interpreter",3, "extract : pkgname [" << pkgname << "] upath [" << upath << "]" << std::endl); bool fullnameGiven = false; bool foundFile = false; - if(pkgname == "*") // =========================================== load all boxes (e.g. std/boxes/*) - { -// std::cout << "JPR================== * found, load all boxes " << std::endl; - int nbBssFiles; - - std::stringstream* stream = new std::stringstream; - //if (upath.size()!=0) // avoid troubles for "*" - - if (upath[0]=='/' || upath[1] == ':' ) // ==== absolute name, load all .bbs files + // ==== "*" provided : load all scripts in given path + // relative (e.g. std/boxes/*) or absolute + if (pkgname == "*") { -// std::cout << "JPR================== absolute name, load all .bbs files " << std::endl; - int nbFiles = Utilities::Explore(upath, false, Filenames); - nbBssFiles = 0; - for (std::vector::iterator i = Filenames.begin(); i!= Filenames.end(); ++i) - { -// std::cout << "JPR================== iterate [" << *i << "]" << std::endl; - int lgr = (*i).size(); - if (lgr < 5) - continue; // ignore non .bbs file - if ((*i).substr(lgr-4, 4) != ".bbs") - continue; - /* - if (lgr > 10) // 10 -> '-appli.bbs' - { - if ((*i).substr(lgr-10, 10) == "-appli.bbs") - continue; // ignore '-appli.bbs' files - } - */ - - (*stream) << "include " << *i << "\n"; -//EED InterpretFile(*i); - - nbBssFiles++; - } // for vector - if (nbBssFiles==0){ - bbtkMessage("Interpreter",2, - "WARNING : No '.bbs' file found in [" - << upath << "]" << std::endl); - } else { - SwitchToStream(stream); - } - return; - } // if upath - - std::string path; - std::vector::iterator i; - std::string fullDirectoryName; - for (i=script_paths.begin();i!=script_paths.end();i++)// ==== relative name, iterate + load all .bbs files - { - path = *i; - - // we *really* want '.' to be the current working directory - if (path == ".") { - char buf[2048]; // for getcwd - char * currentDir = getcwd(buf, 2048); - std::string cwd(currentDir); - path = currentDir; - } // if path - - fullDirectoryName = Utilities::MakePkgnameFromPath(path, upath, false); - - // without last slash "\" - std::string fullDirectoryNameClean = fullDirectoryName.substr(0,fullDirectoryName.size()-1); - - // Check if library exists - if ( ! Utilities::IsDirectory( fullDirectoryNameClean ) ) - { - // The following is *NOT* a debug time message : - // It's a user intended message. - // Please don't remove it. - bbtkMessage("Interpreter",1," [" <::const_iterator i; + for (i=ConfigurationFile::GetInstance().Get_bbs_paths().begin(); + i!=ConfigurationFile::GetInstance().Get_bbs_paths().end(); + i++) + { + std::string full_path(*i); + // we *really* want '.' to be the current working directory + if (full_path == ".") { + char buf[2048]; // for getcwd + char * currentDir = getcwd(buf, 2048); + std::string cwd(currentDir); + full_path = currentDir; + } // if full_path + + full_path += ConfigurationFile::GetInstance().Get_file_separator(); + full_path += upath; + + if ( Utilities::IsDirectory( full_path ) ) + { + script_paths.push_back(full_path); + } + } + } + // === search paths list complete : now explore it + if (script_paths.empty()) + { + bbtkMessage("Interpreter",1, + "'"<::iterator i = Filenames.begin(); i!= Filenames.end(); ++i) - { -// std::cout << "JPR================== iterate [" << *i << "]" << std::endl; - int lgr = (*i).size(); - if (lgr < 5) - continue; // ignore non .bbs file - if ((*i).substr(lgr-4, 4) != ".bbs") - continue; - /* - if (lgr > 10) // 10 -> '-appli.bbs' - { - if ((*i).substr(lgr-10, 10) == "-appli.bbs") - continue; // ignore '-appli.bbs' files - } - */ - - (*stream) << "include " << *i << "\n"; -//EED InterpretFile(*i); - - nbBssFiles++; - } // for vector - if (nbBssFiles==0){ - bbtkMessage("Interpreter",1, - "WARNING : No '.bbs' file found in [" - << fullDirectoryName << "]" << std::endl); - } else { - SwitchToStream(stream); - } - - //break; // a directory was found; we stop iterating - // LG : No! We want all files included ! - } // for vector - return; - } // if * + std::vector::iterator i; + for (i=script_paths.begin();i!=script_paths.end();i++)// ==== relative name, iterate + load all .bbs files + { + bbtkMessage("Interpreter",1, + "--> Looking in '" << *i << "'" << std::endl); + + + Filenames.clear(); + int nbFiles = Utilities::Explore(*i, false, Filenames); + + nbBssFiles = 0; + for (std::vector::iterator j = Filenames.begin(); + j!= Filenames.end(); ++j) + { + int lgr = (*j).size(); + if (lgr < 5) + continue; // ignore non .bbs file + if ((*j).substr(lgr-4, 4) != ".bbs") + continue; + + (*stream) << "include \"" << *j << "\"\n"; + bbtkMessage("Interpreter",2, + " --> Found '" << *j << "'" << std::endl); + + nbBssFiles++; + } // for vector + + if (nbBssFiles==0) + { + bbtkMessage("Interpreter",1, + " --> No .bbs found"<< std::endl); + } + else + { + bbtkMessage("Interpreter",1, + " --> "<& } // endif l != 0 } else - // =============================================================== iterate on the paths - { + // =============================== iterate on the paths + { + script_paths = ConfigurationFile::GetInstance().Get_bbs_paths(); std::string path; std::vector::iterator i; for (i=script_paths.begin();i!=script_paths.end();++i) - { - path = *i; - // we *really* want '.' to be the current working directory - if (path == ".") { - char buf[2048]; // for getcwd - char * currentDir = getcwd(buf, 2048); - std::string cwd(currentDir); - path = currentDir; - } - - fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true); - - // Check if library exists - if ( ! Utilities::FileExists(fullPathScriptName) ) - { - // The following is *NOT* a debug time message : - // It's a user intended message. - // Please don't remove it. + { + path = *i; + // we *really* want '.' to be the current working directory + if (path == ".") { + char buf[2048]; // for getcwd + char * currentDir = getcwd(buf, 2048); + std::string cwd(currentDir); + path = currentDir; + } + + fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true); + + // Check if library exists + if ( ! Utilities::FileExists(fullPathScriptName) ) + { + // The following is *NOT* a debug time message : + // It's a user intended message. + // Please don't remove it. bbtkMessage("Interpreter",2, - " [" <::iterator j = mFileName.begin(); - // std::cout << " mFileName.begin() succeeded" << std::endl; - // std::cout << " mFileName[0] " << mFileName[0] << std::endl; - //std::cout << " mFileName.begin() " << mFileName.begin() << std::endl; -/* - for( std::vector::iterator i = mFileName.begin(); i!= mFileName.end(); ++i) - { - - std::cout << "Interpreter::SwitchToStream : mFileName [" << *i << "]" << std::endl; - } -*/ - // std::cout << " mLine.back() " << mLine.back() << std::endl; - // std::cout << " mFileName.back() " << mFileName.back() << std::endl; + buffer_name << "buffer_" ; - if (mFileName.size()>0 )// && (mFile.size()>0) ) // NO!!! + if (mFileName.size()>0 ) { - // std::cout << " mFileName.back() " << mFileName.back() << std::endl; - // std::cout << " mLine.back() " << mLine.back() << std::endl; buffer_name << mFileName.back() << "_" << mLine.back(); } -//std::cout << "3 in Interpreter::SwitchToStream buffer_name :[" << buffer_name.str() << "]" << std::endl; mFileName.push_back(buffer_name.str()); mIncludeFileName.push_back(buffer_name.str()); mLine.push_back(0); } + //======================================================================= //======================================================================= @@ -1180,6 +1241,7 @@ void Interpreter::SwitchToStream( std::stringstream* stream ) mFileName.push_back(fullPathScriptName); mIncludeFileName.push_back(includeScriptName); mLine.push_back(0); + return; } @@ -1303,50 +1365,46 @@ void Interpreter::Help(const std::vector& words) try { GetExecuter()->GetFactory()->HelpPackage(words[1]); -#ifdef _USE_WXWIDGETS_ - if ( mWxConsole != 0 ) + if ( mUser != 0 ) { std::string url = ConfigurationFile::GetInstance().Get_doc_path(); url += "/bbdoc/" + words[1] + "/index.html"; if (Utilities::FileExists(url)) { - mWxConsole->ShowHtmlPage(url); + mUser->InterpreterUserViewHtmlPage(url); } } -#endif } catch (bbtk::Exception f) { - try - { - std::string package; - GetExecuter()->GetFactory()->HelpBlackBox(words[1],package); -#ifdef _USE_WXWIDGETS_ - if ( mWxConsole != 0 ) + try + { + std::string package; + GetExecuter()->GetFactory()->HelpBlackBox(words[1],package); + if ( mUser != 0 ) { std::string url = ConfigurationFile::GetInstance().Get_doc_path(); url += "/bbdoc/" + package + "/index.html"; - if (Utilities::FileExists(url)) + if (Utilities::FileExists(url)) { url += "#" + words[1]; - mWxConsole->ShowHtmlPage(url); + mUser->InterpreterUserViewHtmlPage(url); } } -#endif - } - catch (bbtk::Exception g) - { - try - { - GetExecuter()->ShowRelations(words[1],"0","9999"); - } - catch (bbtk::Exception h){ - bbtkError("\""<ShowRelations(words[1],"0","9999"); + } + catch (bbtk::Exception h){ + bbtkError("\""<& words) } catch (QuitException e) { + bbtkMessage("Interpreter",1,"Interpreter : Quit"<& words) std::string page; bool system_display = true; -#ifdef _USE_WXWIDGETS_ - if ( mWxConsole != 0 ) system_display = false; -#endif + if ( ( mUser != 0 ) && ( mUser->InterpreterUserHasOwnHtmlPageViewer() ) ) + system_display = false; if (words.size()==1) { @@ -1761,10 +1819,9 @@ void Interpreter::Graph(const std::vector& words) page = mExecuter->ShowGraph(words[1],words[2],words[3],words[4],words[5],words[6],system_display); } -#ifdef _USE_WXWIDGETS_ - if ( mWxConsole != 0 ) - mWxConsole->ShowHtmlPage(page); -#endif + if ( ( mUser != 0 ) && ( mUser->InterpreterUserHasOwnHtmlPageViewer() ) ) + mUser->InterpreterUserViewHtmlPage(page); + } //=======================================================================