X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=kernel%2Fsrc%2FbbtkInterpreter.cxx;h=951c40db00b1831324f4edfaaedc523db8a6afde;hb=63005ec659612d567c00bfbb9ecbd62566a3217d;hp=dfea3e87dbc8487d9aeb4777f83d1a99bdfa0af5;hpb=2769d3123cddecf9d220bd5458d9e2855f298006;p=bbtk.git diff --git a/kernel/src/bbtkInterpreter.cxx b/kernel/src/bbtkInterpreter.cxx index dfea3e8..951c40d 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/02/06 09:27:52 $ - Version: $Revision: 1.26 $ + Date: $Date: 2008/02/21 07:30:20 $ + Version: $Revision: 1.36 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -17,15 +17,16 @@ =========================================================================*/ /** * \file - * \brief class Interpreter : + * \brief class Interpreter : */ -#include "bbtkInterpreter.h" +#include "bbtkInterpreter.h" #include "bbtkMessageManager.h" #include "bbtkConfigurationFile.h" #include "bbtkWxConsole.h" #include "bbtkUtilities.h" #include +#include #ifdef CMAKE_HAVE_TERMIOS_H #include #define BBTK_USE_TERMIOS_BASED_PROMPT @@ -40,7 +41,7 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL; //======================================================================= /** - * + * */ Interpreter::Interpreter() : @@ -52,9 +53,12 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL; mGlobalInterpreter = this; - // mFactory = new bbtk::Factory(); mExecuter = new bbtk::Executer(); - //mExecuter->SetFactory(mFactory); + + // For the time being, comment out previous line, and + // uncomment next line to check Transcriptor + + // mExecuter = new bbtk::Transcriptor("GeneratedProgram.txt"); // Builds the commands dict CommandInfoType info; @@ -225,7 +229,7 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL; info.argmax = 2; info.code = cInclude; info.syntax = "include [source]"; - info.help = "Includes the file .\n Advanced (used to get the right 'Include' field in doc of packages appli) : If the keyword 'source' is provided then informs bbi that the included file is the source of the current box definition."; + info.help = "Includes the file .\n 'source' : If the keyword 'source' is provided then informs bbi that the included file is the source of the current box definition (Advanced; used to get the right 'Include' field in html doc of packages 'appli' scripts)."; mCommandDict[info.category] = info; info.category = "quit"; @@ -297,7 +301,7 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL; * */ void Interpreter::InterpretFile( const std::string& filename, - bool use_configuration_file) + bool use_configuration_file) { bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretFile(\""<Create(words[1],words[2]); break; - + case cDelete : // TO DO !! // mExecuter->Remove(words[1]); break; - + case cConnect : Utilities::SplitAroundFirstDot(words[1],left,right); Utilities::SplitAroundFirstDot(words[2],left2,right2); mExecuter->Connect(left,right,left2,right2); break; - + case cPackage : mExecuter->BeginPackage(words[1]); break; @@ -459,7 +463,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) case cEndPackage : mExecuter->EndPackage(); break; - + case cDefine : if (mFileName.size()>0) { @@ -469,16 +473,16 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) { mExecuter->Define(words[1],"",filename); } - else + else { mExecuter->Define(words[1],words[2],filename); } break; - + case cEndDefine : mExecuter->EndDefine(); break; - + case cPrint : Print(words[1]); /// \todo use mExecuter break; @@ -488,79 +492,80 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) mExecuter->SetNoExecMode(true); else if (words[1]=="unfreeze") mExecuter->SetNoExecMode(false); - else + else mExecuter->Update(words[1]); break; - + case cInput : Utilities::SplitAroundFirstDot(words[2],left,right); mExecuter->DefineInput(words[1],left,right,words[3]); break; - + case cOutput : Utilities::SplitAroundFirstDot(words[2],left,right); mExecuter->DefineOutput(words[1],left,right,words[3]); break; - + case cSet : Utilities::SplitAroundFirstDot(words[1],left,right); mExecuter->Set(left,right,words[2]); break; - + case cAuthor : mExecuter->Author(words[1]); break; - case cCategory : - mExecuter->Category(words[1]); - break; - - case cIndex : - if (words.size()==1) - Index("tmp_index.html"); - else if (words.size()==2) - Index(words[1]); - else if (words.size()==3) - Index(words[1],words[2]); - break; - case cDescription : - mExecuter->Description(words[1]); + case cCategory : + mExecuter->Category(words[1]); break; - + + case cIndex : + if (words.size()==1) + Index("tmp_index.html"); + else if (words.size()==2) + Index(words[1]); + else if (words.size()==3) + Index(words[1],words[2]); + break; + + case cDescription : + mExecuter->Description(words[1]); + break; + case cHelp : Help(words); break; - + case cMessage : - if (words.size()<3) + if (words.size()<3) { - bbtk::MessageManager::PrintInfo(); + bbtk::MessageManager::PrintInfo(); } - else + else { sscanf(words[2].c_str(),"%d",&level); bbtk::MessageManager::SetMessageLevel(words[1],level); } break; - - case cGraph : + + case cGraph : Graph(words); break; - + case cConfig : - Config(); + Config(); break; - + case cReset : // EED this->mExecuter->Reset(); break; - + case cInclude : - if (mCommandLine) + if (mCommandLine) { InterpretFile(words[1], true ); // true : better pass use_config_file } - else + else { SwitchToFile(words[1], true ); // true : better pass use_config_file } @@ -570,26 +575,27 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) this->mExecuter->SetCurrentFileName(words[1]); } break; - + case cLoad: LoadPackage(words[1], true ); // true : better pass use_config_file break; - + case cUnload: UnLoadPackage(words[1]); break; - + case cQuit : + delete mExecuter; throw QuitException(); break; - - case cWorkspace : + + case cWorkspace : if (words.size() == 2) { if (words[1]=="freeze") mExecuter->SetNoExecMode(true); else if (words[1]=="unfreeze") mExecuter->SetNoExecMode(false); } - else + else { mExecuter->SetWorkspaceName(words[2]); } @@ -598,7 +604,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) default: bbtkInternalError("should not reach here !!!"); } - + bbtkDecTab("Interpreter",9); } //======================================================================= @@ -609,12 +615,12 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) //======================================================================= /** - * + * */ void Interpreter::SplitLine ( const std::string& str, std::vector& tokens) { bbtkDebugMessageInc("Interpreter",9,"Interpreter::SplitLine(\""< quote; Utilities::SplitString(str,delimiters,quote); @@ -639,7 +645,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& } bbtkDebugMessageCont("Interpreter",9,std::endl); - bbtkDebugDecTab("Interpreter",9); + bbtkDebugDecTab("Interpreter",9); } //======================================================================= @@ -656,14 +662,14 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& { s.replace(pos,2,cr,1); pos = s.find(ss, pos-1); - } + } } //======================================================================= //======================================================================= /** - * + * */ void Interpreter::Print( const std::string& str) { @@ -678,10 +684,10 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& std::string::size_type lastPos = str.find_first_not_of(delimiters, 0); bool is_text = true; if (lastPos>0) is_text = false; - + // Find first delimiter. std::string::size_type pos = str.find_first_of(delimiters, lastPos); - + while (std::string::npos != pos || std::string::npos != lastPos) { if (is_text) @@ -712,12 +718,12 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& std::cout << *i; } std::cout << std::endl; - bbtkDebugDecTab("Interpreter",9); + bbtkDebugDecTab("Interpreter",9); } //======================================================================= /** - * + * */ // =================================================================================== @@ -734,7 +740,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& // // use ./directory/subdir/scrname.bbs // - + bbtkDebugMessageInc("Interpreter",9,"Interpreter::SwitchToFile( \"" <& std::string fullPathScriptName; // full path script name std::string pkgname; // e.g. .bbs std::vector Filenames; - + if (use_configuration_file) { // The following is *NOT* a debug time message : // It's a user intended message. // Please don't remove it. bbtkMessage("Interpreter",1, - "look for : [" << name + "look for : [" << name << "] (use_configuration_file == TRUE)" << std::endl); script_paths = ConfigurationFile::GetInstance().Get_bbs_paths(); } @@ -778,15 +784,13 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& bbtkMessage("Interpreter",2, "WARNING : No '.bbs' file found in [" << upath << "]" << std::endl); - return; } - 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 + for (i=script_paths.begin();i!=script_paths.end();i++)// ==== relative name, iterate + load all .bbs files { path = *i; @@ -800,8 +804,12 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& fullDirectoryName = Utilities::MakePkgnameFromPath(path, upath, false); - // Check if library exists - if ( ! Utilities::IsDirectory(fullDirectoryName) ) + //EED 18 Fev 2008 + // 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. @@ -818,7 +826,6 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& nbBssFiles = 0; for (std::vector::iterator i = Filenames.begin(); i!= Filenames.end(); ++i) { - if ((*i).substr((*i).size()-4, 4) != ".bbs") continue; // ignore non .bbs files LoadScript(*i,name); @@ -828,7 +835,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& bbtkMessage("Interpreter",1, "WARNING : No '.bbs' file found in [" << fullDirectoryName << "]" << std::endl); - + //break; // a directory was found; we stop iterating // LG : No! We want all files included ! } @@ -848,7 +855,6 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& // ===========================================================check user supplied location fullnameGiven = true; - fullPathScriptName = Utilities::ExpandLibName(name, false); // allow user to always forget ".bbs" @@ -910,7 +916,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& } bbtkMessage("Interpreter",2, " [" <& bbtkError("Script ["<& return; } - std::ifstream* s; + std::ifstream* s; s = new std::ifstream; s->open(fullPathScriptName.c_str()); if (!s->good()) { bbtkError("Could not open file ["<[" << fullPathScriptName << "] found" << std::endl); @@ -964,7 +970,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& mFileName.push_back(fullPathScriptName); mIncludeFileName.push_back(includeScriptName); mLine.push_back(0); - return; + return; } //======================================================================= @@ -975,8 +981,8 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& { bbtkDebugMessage("Interpreter",9,"Interpreter::CloseCurrentFile()" < no file left open"<& mFile.pop_back(); bbtkDebugMessage("Interpreter",9, " Closing file '"<& { bbtkDebugMessage("Interpreter",9,"Interpreter::CloseAllFiles()" <close(); @@ -1034,7 +1040,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& CommandInfoType& info ) { bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretCommand(...)"<& void Interpreter::Help(const std::vector& words) { unsigned int nbarg = words.size()-1; - + if (nbarg==0) { HelpCommands(); @@ -1082,26 +1088,52 @@ void Interpreter::Help(const std::vector& words) try { HelpPackage(words[1]); +#ifdef _USE_WXWIDGETS_ + if ( WxConsole::GetInstance() != 0 ) + { + std::string url = + ConfigurationFile::GetInstance().Get_doc_path(); + url += "/bbdoc/" + words[1] + "/index.html"; + if (Utilities::FileExists(url)) + { + WxConsole::GetInstance()->ShowHtmlPage(url); + } + } +#endif } catch (bbtk::Exception f) { try { - HelpBlackBox(words[1]); - } - catch (bbtk::Exception g) - { - try - { - this->mExecuter->ShowRelations(words[1],"0","9999"); - } - catch (bbtk::Exception h){ - bbtkError("\""<ShowHtmlPage(url); + } + } +#endif + } + catch (bbtk::Exception g) + { + try + { + this->mExecuter->ShowRelations(words[1],"0","9999"); + } + catch (bbtk::Exception h){ + bbtkError("\""<& words) /// Displays the Configuration void Interpreter::Config() const { - bbtkDebugMessageInc("Kernel",9,"Factory::Config"<bbs_paths = cf.Get_bbs_paths(); - const std::vectorpackage_paths = cf.Get_package_paths(); - - bbtkMessage("Help",1, "=============" << std::endl); - bbtkMessage("Help",1, "Configuration" << std::endl); - bbtkMessage("Help",1, "=============" << std::endl); - bbtkMessage("Help",1, "bbtk_config.xml : [" << config_xml_full_path << "]" << std::endl); - bbtkMessage("Help",1, "Documentation Url : [" << url << "]" << std::endl); - bbtkMessage("Help",1, "Data Path : [" << data_path << "]" << std::endl); - bbtkMessage("Help",1, "Default Doc_tmp : [" << default_doc_tmp << "]" << std::endl); - bbtkMessage("Help",1, "File Separator : [" << file_separator << "]" << std::endl); - - std::vector::const_iterator i; - - bbtkMessage("Help",1, "BBS Paths " << std::endl); - for (i = bbs_paths.begin(); i!=bbs_paths.end(); ++i ) - { - bbtkMessage("Help",1,"--- ["<<*i<<"]"<& words) std::cout << " " << i->first << std::endl; // std::cout << " usage : " << i->second.syntax << std::endl; // std::cout << " " << i->second.help << std::endl; - + } } //======================================================================= @@ -1210,7 +1207,7 @@ void Interpreter::Help(const std::vector& words) // ++i) { std::cout << " usage : " << c->second.syntax << std::endl; std::cout << " " << c->second.help << std::endl; - + } //======================================================================= @@ -1234,7 +1231,7 @@ void Interpreter::Help(const std::vector& words) //======================================================================= - + //======================================================================= #ifdef BBTK_USE_TERMIOS_BASED_PROMPT @@ -1257,19 +1254,18 @@ void Interpreter::Help(const std::vector& words) { int c; int ind=0; - + int MAX_LINE_SIZE = 160; int MAX_HISTORY_SIZE = 100; - + char* newline = new char[MAX_LINE_SIZE]; memset(newline,0,MAX_LINE_SIZE); char* histline = new char[MAX_LINE_SIZE]; memset(histline,0,MAX_LINE_SIZE); - + char* line = newline; int hist = mHistory.size(); - - + write(1,"> ",2); while(1) { @@ -1458,7 +1454,7 @@ void Interpreter::Help(const std::vector& words) { bbtkDebugMessageInc("Interpreter",9, "Interpreter::CommandLineInterpreter()"<& words) } } while (again); - + #ifdef BBTK_USE_TERMIOS_BASED_PROMPT tcsetattr(0,TCSANOW,&oter); #endif - + std::cout << "Good bye !" << std::endl; - + bbtkDebugDecTab("Interpreter",9); }