X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=kernel%2Fsrc%2FbbtkInterpreter.cxx;h=d563f1989422be408919d81226e9280d42c23d6c;hb=487dbfe275c2c6fa7454a000503082bfca54396b;hp=a6e4869da13ba3aa37898565273e3e165fe20cdc;hpb=9edc48dd1cb5a2fe6a09d147eed459cb6e9f0fca;p=bbtk.git diff --git a/kernel/src/bbtkInterpreter.cxx b/kernel/src/bbtkInterpreter.cxx index a6e4869..d563f19 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/14 10:47:51 $ - Version: $Revision: 1.30 $ + Date: $Date: 2008/03/03 11:43:52 $ + Version: $Revision: 1.38 $ 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,10 +53,12 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL; mGlobalInterpreter = this; - // mFactory = new bbtk::Factory(); mExecuter = new bbtk::Executer(); + + // For the time being, comment out previous line, and + // uncomment next line to check Transcriptor + //mExecuter = new bbtk::Transcriptor("GeneratedProgram.txt"); - //mExecuter->SetFactory(mFactory); // Builds the commands dict CommandInfoType info; @@ -284,6 +287,8 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL; */ Interpreter::~Interpreter() { + +std::cout << "=========================================~Interpreter()" << std::endl; bbtkDebugMessageInc("Interpreter",9,"Interpreter::~Interpreter()" <0) { @@ -441,18 +445,18 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) case cNew : mExecuter->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; @@ -460,7 +464,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) case cEndPackage : mExecuter->EndPackage(); break; - + case cDefine : if (mFileName.size()>0) { @@ -470,18 +474,18 @@ 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 + Print(words[1]); /// \todo use generate command break; case cExec : @@ -489,81 +493,82 @@ 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 + InterpretFile(words[1]); } - else + else { - SwitchToFile(words[1], true ); // true : better pass use_config_file + SwitchToFile(words[1]); } // if 'source' was given if (words.size()==3) @@ -571,26 +576,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 + LoadPackage(words[1]); 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]); } @@ -599,7 +605,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) default: bbtkInternalError("should not reach here !!!"); } - + bbtkDecTab("Interpreter",9); } //======================================================================= @@ -610,12 +616,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); @@ -640,7 +646,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& } bbtkDebugMessageCont("Interpreter",9,std::endl); - bbtkDebugDecTab("Interpreter",9); + bbtkDebugDecTab("Interpreter",9); } //======================================================================= @@ -657,20 +663,28 @@ 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) { if (mExecuter->GetNoExecMode()) return; - bbtkDebugMessageInc("Interpreter",9,"Interpreter::SplitLine(\""< trouver un nom unique : # commande + // InterpretLine("new Print _P_") + // InterpretLine("connect _C_.Out _P_.In") + // int num = 1 + std::vector chains; std::string delimiters("$"); @@ -679,24 +693,31 @@ 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) { // Found a text token, add it to the vector. chains.push_back(str.substr(lastPos, pos - lastPos)); + // std::string token = str.substr(lastPos, pos - lastPos) + // InterpretLine("set _C_.In%num% %token%") + } else { + // is an output (between $$) : decode std::string tok,box,output; tok = str.substr(lastPos, pos - lastPos); Utilities::SplitAroundFirstDot(tok,box,output); chains.push_back( mExecuter->Get(box,output) ); + +// InterpretLine("connect %tok% _C_.In%num%") + } // Skip delimiters. Note the "not_of" lastPos = str.find_first_not_of(delimiters, pos); @@ -704,7 +725,11 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& pos = str.find_first_of(delimiters, lastPos); // is_text = !is_text; +// num ++; } +// InterpretLine("exec _P_") +// if (IS_IN_WORKSPACE) InterpretLine("delete _C_; delete _P_"); + std::vector::iterator i; for (i= chains.begin(); i!=chains.end(); ++i) { @@ -713,18 +738,17 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& std::cout << *i; } std::cout << std::endl; - bbtkDebugDecTab("Interpreter",9); + bbtkDebugDecTab("Interpreter",9); } //======================================================================= /** - * + * */ // =================================================================================== - void Interpreter::SwitchToFile( const std::string& name, - bool use_configuration_file ) + void Interpreter::SwitchToFile( const std::string& name ) { // Note : in the following : // name : the user supplied name @@ -735,7 +759,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 - << "] (use_configuration_file == TRUE)" << std::endl); - script_paths = ConfigurationFile::GetInstance().Get_bbs_paths(); - } + + // 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 + << "]" << std::endl); + script_paths = ConfigurationFile::GetInstance().Get_bbs_paths(); + std::string upath; pkgname = Utilities::ExtractScriptName(name,upath); @@ -779,15 +801,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; @@ -801,8 +821,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. @@ -819,7 +843,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); @@ -829,7 +852,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 ! } @@ -849,7 +872,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" @@ -911,7 +933,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); @@ -965,7 +987,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& mFileName.push_back(fullPathScriptName); mIncludeFileName.push_back(includeScriptName); mLine.push_back(0); - return; + return; } //======================================================================= @@ -976,8 +998,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(); @@ -1035,7 +1057,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(); @@ -1108,13 +1130,13 @@ void Interpreter::Help(const std::vector& words) std::string url = ConfigurationFile::GetInstance().Get_doc_path(); url += "/bbdoc/" + package + "/index.html"; - if (Utilities::FileExists(url)) + if (Utilities::FileExists(url)) { url += "#" + words[1]; WxConsole::GetInstance()->ShowHtmlPage(url); } } -#endif +#endif } catch (bbtk::Exception g) { @@ -1180,7 +1202,7 @@ void Interpreter::Help(const std::vector& words) std::cout << " " << i->first << std::endl; // std::cout << " usage : " << i->second.syntax << std::endl; // std::cout << " " << i->second.help << std::endl; - + } } //======================================================================= @@ -1202,7 +1224,7 @@ void Interpreter::Help(const std::vector& words) // ++i) { std::cout << " usage : " << c->second.syntax << std::endl; std::cout << " " << c->second.help << std::endl; - + } //======================================================================= @@ -1226,7 +1248,7 @@ void Interpreter::Help(const std::vector& words) //======================================================================= - + //======================================================================= #ifdef BBTK_USE_TERMIOS_BASED_PROMPT @@ -1249,19 +1271,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) { @@ -1450,7 +1471,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); }