X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=kernel%2Fsrc%2FbbtkInterpreter.cxx;h=a6101a5a2881f678cc33247ad30dfa9165f0fab9;hb=3ee95453a2ba41964c9bc420cb385b024cb2a21a;hp=76d87e3bf65f53ae629bd69c467006baae3aac01;hpb=f90eb2c535faec3e455d3b5da9a5e1adf653de2b;p=bbtk.git diff --git a/kernel/src/bbtkInterpreter.cxx b/kernel/src/bbtkInterpreter.cxx index 76d87e3..a6101a5 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/01/23 07:51:51 $ - Version: $Revision: 1.3 $ + Date: $Date: 2008/01/29 10:12:45 $ + Version: $Revision: 1.8 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -31,6 +31,7 @@ #define BBTK_USE_TERMIOS_BASED_PROMPT #endif +#include namespace bbtk { @@ -98,6 +99,22 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL; info.help = "Executes the black box of name (and connected boxes if needed). If the special keyword 'freeze' is given then freezes any further execution command. 'unfreeze' reverts to normal execution mode."; mCommandDict[info.keyword] = info; + info.keyword = "package"; + info.argmin = 1; + info.argmax = 1; + info.code = cPackage; + info.syntax = "package "; + info.help = "Begins the definition of a package."; + mCommandDict[info.keyword] = info; + + info.keyword = "endpackage"; + info.argmin = 0; + info.argmax = 0; + info.code = cEndPackage; + info.syntax = "endpackage"; + info.help = "Ends the definition of a package."; + mCommandDict[info.keyword] = info; + info.keyword = "define"; info.argmin = 1; info.argmax = 2; @@ -324,7 +341,7 @@ Interpreter* Interpreter::mGlobalInterpreter = NULL; std::cout << "* LINE : "< words; SplitLine(line,words); - + // Empty line if (words.size()<1) { @@ -391,7 +408,7 @@ void Interpreter::InterpretLine( const std::string& line, bool &insideComment ) bbtkMessage("Interpreter",9,"Multiline Comment"<Create(words[1],words[2]); - break; + mExecuter->Create(words[1],words[2]); + break; case cDelete : - // TO DO !! - // mExecuter->Remove(words[1]); - break; + // 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; + 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; + + case cEndPackage : + mExecuter->EndPackage(); + break; case cDefine : - if (mFileName.size()>0) - { - filename = Utilities::get_file_name(mFileName.back()); - } - if (words.size()==2) - { - mExecuter->Define(words[1],"user",filename); - } - else - { - mExecuter->Define(words[1],words[2],filename); - } - break; + if (mFileName.size()>0) + { + filename = Utilities::get_file_name(mFileName.back()); + } + if (words.size()==2) + { + mExecuter->Define(words[1],"",filename); + } + else + { + mExecuter->Define(words[1],words[2],filename); + } + break; case cEndDefine : - mExecuter->EndDefine(); - break; + mExecuter->EndDefine(); + break; case cPrint : - Print(words[1]); /// \todo use mExecuter - break; + Print(words[1]); /// \todo use mExecuter + break; case cExec : - if (words[1]=="freeze") - mExecuter->SetNoExecMode(true); - else if (words[1]=="unfreeze") - mExecuter->SetNoExecMode(false); - else - mExecuter->Update(words[1]); - break; + if (words[1]=="freeze") + mExecuter->SetNoExecMode(true); + else if (words[1]=="unfreeze") + mExecuter->SetNoExecMode(false); + else + mExecuter->Update(words[1]); + break; case cInput : - Utilities::SplitAroundFirstDot(words[2],left,right); - mExecuter->DefineInput(words[1],left,right,words[3]); - break; + 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; + 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; + Utilities::SplitAroundFirstDot(words[1],left,right); + mExecuter->Set(left,right,words[2]); + break; case cAuthor : - mExecuter->Author(words[1]); - break; + mExecuter->Author(words[1]); + break; case cDescription : - mExecuter->Description(words[1]); - break; + mExecuter->Description(words[1]); + break; case cHelp : - Help(words); - break; + Help(words); + break; case cMessage : - if (words.size()<3) - { + if (words.size()<3) + { bbtk::MessageManager::PrintInfo(); - } - else - { + } + else + { sscanf(words[2].c_str(),"%d",&level); bbtk::MessageManager::SetMessageLevel(words[1],level); - } - break; + } + break; case cGraph : - Graph(words); - break; + Graph(words); + break; case cConfig : - if (words.size()>1) // any param for config means verbose = true - verbose = true; - else - verbose = false; - Config(verbose); - break; + if (words.size()>1) // any param for config means verbose = true + verbose = true; + else + verbose = false; + Config(verbose); + break; case cReset : // EED - this->mExecuter->Reset(); - break; + this->mExecuter->Reset(); + break; case cInclude : - if (mCommandLine) - { + if (mCommandLine) + { InterpretFile(words[1], true, verbose); // true : better pass use_config_file - } - else - { + } + else + { SwitchToFile(words[1], true, verbose); // true : better pass use_config_file - } - break; + } + break; case cLoad: - LoadPackage(words[1], true, verbose); // true : better pass use_config_file - break; + LoadPackage(words[1], true, verbose); // true : better pass use_config_file + break; case cUnload: - UnLoadPackage(words[1]); - break; + UnLoadPackage(words[1]); + break; case cQuit : - throw QuitException(); - break; + throw QuitException(); + break; - case cWorkspace : - if (words.size() == 2) - { - if (words[1]=="freeze") mExecuter->SetNoExecMode(true); - else if (words[1]=="unfreeze") mExecuter->SetNoExecMode(false); - } - else - { - mExecuter->SetWorkspaceName(words[2]); - } - break; + case cWorkspace : + if (words.size() == 2) + { + if (words[1]=="freeze") mExecuter->SetNoExecMode(true); + else if (words[1]=="unfreeze") mExecuter->SetNoExecMode(false); + } + else + { + mExecuter->SetWorkspaceName(words[2]); + } + break; default: - bbtkInternalError("should not reach here !!!"); + bbtkInternalError("should not reach here !!!"); } bbtkDecTab("Interpreter",9); @@ -696,44 +721,140 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& // =================================================================================== - void Interpreter::SwitchToFile( const std::string& name, bool use_configuration_file, bool verbose) { + // Note : in the following : + // name : the user supplied name + // - abreviated name e.g. scr scr.bbs + // - relative full name e.g. ./scr.bbs ../../scr.bbs + // - absolute full name e.g. /home/usrname/proj/dir/scr.bbs + // same for Windows, with c:, d: ... + // + // expression like directory/subdir/scrname.bbs is FORBIDDEN (*) + // use ./directory/subdir/scrname.bbs + // + // (*) except when using packagename/boxes/* + bbtkDebugMessageInc("Interpreter",9,"Interpreter::SwitchToFile( \"" < script_paths; - std::string libname; // full path library name - std::string pkgname; // e.g. .bbs - - pkgname = Utilities::ExtractScriptName(name); + std::string fullPathScriptName; // full path script name + std::string pkgname; // e.g. .bbs if (use_configuration_file) { + // The following is *NOT* a debug time message : + // It's a user intended message. + // Please don't remove it. if (verbose) std::cout << "look for : [" << name << "] (use_configuration_file == TRUE)" << std::endl; script_paths = ConfigurationFile::GetInstance().Get_bbs_paths(); } - + std::string upath; + pkgname = Utilities::ExtractScriptName(name,upath); + bool fullnameGiven = false; bool foundFile = false; + + if(pkgname == "*") // =========================================== load all boxes (e.g. std/boxes/*) + { + std::string path; + std::vector::iterator i; + std::string fullDirectoryName; + 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; + } + + fullDirectoryName = Utilities::MakePkgnameFromPath(path, upath, false); +//std::cout <<"fullpath [" << fullDirectoryName << "]" < Filenames; + int nbFiles = Utilities::Explore(fullDirectoryName, false, Filenames); +// std::cout << "=================nbFiles " << nbFiles << std::endl; + int 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); + nbBssFiles++; + } + if (nbBssFiles==0) + if (verbose) + std::cout << "WARNING : No '.bbs' file found in [" << fullDirectoryName << "]" << std::endl; + + break; // a directory was found; we stop iterating + } + return; + } + std::string::size_type slash_position = name.find_last_of("/\\"); - + + // if name contains a slash (anywhere), user is assumed to have passed a relative/absolute name + // (not only a plain script name) + // we trust him, and try to explade the directory name + // WARNING : starting from current local directory : ./whatYouWant (./ mandatory!) + if (slash_position != std::string::npos) - { - fullnameGiven = true; - libname = Utilities::ExpandLibName(name, verbose); - if (libname != "") { - if ( Utilities::FileExists(libname)) + { // ===========================================================check user supplied location + fullnameGiven = true; + + fullPathScriptName = Utilities::ExpandLibName(name, verbose); + + // allow user to always forget ".bbs" + int l = fullPathScriptName.size(); + if (l!=0) { + + if (l>4) + { + if (fullPathScriptName.substr(l-4, 4) != ".bbs") + { + fullPathScriptName = fullPathScriptName + ".bbs"; + } + } + else + { + fullPathScriptName = fullPathScriptName + ".bbs"; + } + + //if (fullPathScriptName != "") { + if ( Utilities::FileExists(fullPathScriptName)) { foundFile = true; } - } + //} + } // endif l != 0 } - else // ----------------------- iterate on the paths + else // =============================================================== iterate on the paths { - std::string path; + std::string path; std::vector::iterator i; for (i=script_paths.begin();i!=script_paths.end();++i) { @@ -743,18 +864,21 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& if (path == ".") { char buf[2048]; // for getcwd char * currentDir = getcwd(buf, 2048); - std::string cwd(currentDir); + std::string cwd(currentDir); path = currentDir; } - libname = Utilities::MakePkgnameFromPath(path, pkgname); - - // Check if library exists - if ( ! Utilities::FileExists(libname) ) + // fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true); //pkgname); + fullPathScriptName = Utilities::MakePkgnameFromPath(path, pkgname, 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. if (verbose) - std::cout <<" [" <& } //------------------ // end for ( package_paths.begin();i!=package_paths.end() ) } - std::ifstream* s; - if (!foundFile) { if (fullnameGiven) - if(libname == "") - bbtkError("Path \""<open(libname.c_str()); + s->open(fullPathScriptName.c_str()); if (!s->good()) { - bbtkError("Could not open file \""<[" << libname << "] found" << std::endl; + std::cout << " -->[" << fullPathScriptName << "] found" << std::endl; mFile.push_back(s); - mFileName.push_back(libname); + mFileName.push_back(fullPathScriptName); mLine.push_back(0); - } - - - //======================================================================= - + return; + } //======================================================================= /** @@ -1127,19 +1257,18 @@ void Interpreter::Help(const std::vector& words) // empty lines are not stored in from history if (strlen(line)) { - // if history too long : delete oldest command - if (mHistory.size()>MAX_HISTORY_SIZE) - { - delete mHistory.front(); - mHistory.pop_front(); - } - mHistory.push_back(line); + // if history too long : delete oldest command + if (mHistory.size()>MAX_HISTORY_SIZE) + { + delete mHistory.front(); + mHistory.pop_front(); + } + mHistory.push_back(line); } - break; } - // Backspace - else if ( (ind>0) && + // Backspace + else if ( (ind>0) && ((c == BBTK_BACKSPACE_KBCODE) || (c == BBTK_DEL_KBCODE)) ) { @@ -1232,13 +1361,13 @@ void Interpreter::Help(const std::vector& words) PrintChar(line[ind]); ind++; } - + // Arrow left else if (ind>0 && c==BBTK_LEFT_ARROW_KBCODE) { PrintChar('\b'); ind--; - + } } @@ -1307,7 +1436,7 @@ void Interpreter::Help(const std::vector& words) bool insideComment = false; // for multiline comment do { - try + try { std::string line; GetLineFromPrompt(line); @@ -1323,7 +1452,7 @@ void Interpreter::Help(const std::vector& words) } catch (std::exception& e) { - std::cerr << "* ERROR : "<