X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=kernel%2Fsrc%2FbbtkInterpreter.cxx;h=a31fe0f20ceb0b589eae32be38e01864d09a1e5f;hb=b86f1fefc9fb173793a1b6d91cceefc28f048faf;hp=67370a9100f084697e921e7f39bc4b05a17db25e;hpb=1cad1aa48a5353dc6844018dc8b756f876e17394;p=bbtk.git diff --git a/kernel/src/bbtkInterpreter.cxx b/kernel/src/bbtkInterpreter.cxx index 67370a9..a31fe0f 100644 --- a/kernel/src/bbtkInterpreter.cxx +++ b/kernel/src/bbtkInterpreter.cxx @@ -1,29 +1,53 @@ +/* + # --------------------------------------------------------------------- + # + # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image + # pour la SantÈ) + # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton + # Previous Authors : Laurent Guigues, Jean-Pierre Roux + # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil + # + # This software is governed by the CeCILL-B license under French law and + # abiding by the rules of distribution of free software. You can use, + # modify and/ or redistribute the software under the terms of the CeCILL-B + # license as circulated by CEA, CNRS and INRIA at the following URL + # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html + # or in the file LICENSE.txt. + # + # As a counterpart to the access to the source code and rights to copy, + # modify and redistribute granted by the license, users are provided only + # with a limited warranty and the software's author, the holder of the + # economic rights, and the successive licensors have only limited + # liability. + # + # The fact that you are presently reading this means that you have had + # knowledge of the CeCILL-B license and that you accept its terms. + # ------------------------------------------------------------------------ */ + + /*========================================================================= - Program: bbtk - Module: $RCSfile: bbtkInterpreter.cxx,v $ $ + Module: $RCSfile: bbtkInterpreter.cxx,v $ Language: C++ - Date: $Date: 2008/03/25 06:22:53 $ - Version: $Revision: 1.53 $ - - Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de - l'Image). All rights reserved. See Doc/License.txt or - http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details. - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the above copyright notices for more information. - + Date: $Date: 2012/11/16 08:49:01 $ + Version: $Revision: 1.95 $ =========================================================================*/ + + + /** * \file * \brief class Interpreter : */ #include "bbtkInterpreter.h" +#include "bbtkExecuter.h" +#include "bbtkTranscriptor.h" #include "bbtkMessageManager.h" #include "bbtkConfigurationFile.h" #include "bbtkUtilities.h" +#include "bbtkAtomicBlackBox.h" +#include "bbtkWxBlackBox.h" #include #include #ifdef CMAKE_HAVE_TERMIOS_H @@ -36,247 +60,65 @@ namespace bbtk { - //Interpreter* Interpreter::mGlobalInterpreter = NULL; + //======================================================================= + Interpreter::Pointer Interpreter::New(const std::string& cpp_file) + { + bbtkDebugMessage("kernel",9,"Interpreter::New('"<0 : Prints the 'echo' commands of the user.\n\tLevel>1 : Prints the command being interpreted",1); - bbtk::MessageManager::RegisterMessageType("Interpreter","Messages of the interpreter",0); - bbtkDebugMessageInc("Interpreter",9,"Interpreter::Interpreter()" <SetInterpreter(this); - - // For the time being, comment out previous line, and - // uncomment next line to check Transcriptor + bbtkDebugMessage("kernel",9,"Interpreter::New(VirtualExec)"< Interpreter("< Interpreter(VirtualExec)"<(bbtk::Transcriptor::New(cpp_file)); + } + else + { + bbtk::Executer::Pointer exe = bbtk::Executer::New(); + mRealExecuter = exe; + mVirtualExecuter = boost::static_pointer_cast(exe); + } + + + + // Lock this pointer or will auto-destruct !! + if (!e) mVirtualExecuter->SetInterpreter(MakePointer(this,true)); + + + bbtk::InterpreterVirtual::Init(); } //======================================================================= @@ -288,26 +130,28 @@ bufferNb =0; */ Interpreter::~Interpreter() { - bbtkDebugMessageInc("Interpreter",9,"Interpreter::~Interpreter()" < ~Interpreter()" <GetNoErrorMode()) + { + bbtkWarning("ERROR :"<GetNoErrorMode()) { - bool in_script = false; - std::string file(""); + 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(); } - 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(); - } - throw InterpreterError(e.what(),in_script,file,line); - } - else - { - std::stringstream mess; - mess << "* ERROR : "<GetNoErrorMode()) + { + std::string file("?"); + int line = 0; + if (mFileName.size()) + { + file = mFileName.back(); + line = mLine.back(); + } + bbtkWarning("ERROR '"<(mFile.back()); - if (fs!=0) in_script = true; - file = mFileName.back(); - line = mLine.back(); - } - 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 : \""<GetNoErrorMode()) + { + std::string file("?"); + int line = 0; + if (mFileName.size()) + { + file = mFileName.back(); + line = mLine.back(); + } + bbtkWarning("UNDEFINED ERROR " <<"("< Interpreter::InterpretFile(\""<0) - { - 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); - } - - InterpretLine(str, insideComment); - - }//while - CloseCurrentFile(); - } - } + mStatus = Interpreter_OK; + SwitchToFile(filename,source); + mInsideComment = false; + InterpretCurrentStreams(); + } CATCH_MACRO; - CloseAllFiles(); - bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretFile(\""< Interpreter::InterpretBuffer()"<0) + mInsideComment = false; + InterpretCurrentStreams(); + } + CATCH_MACRO; + + // CloseAllFiles(); + bbtkDebugMessage("interpreter",4,"<== Interpreter::InterpretBuffer()"< Interpreter::InterpretCurrentStreams()"<0) { while (!mFile.back()->eof()) { mLine.back()++; char buf[500]; mFile.back()->getline(buf,500); std::string str(buf); - + //size 0 JCP 21-09-2009 int size=str.length(); - if ( str[ size-1 ]==13 ) + if(size != 0){ + if ( str[ size-1 ]==13 ) { str.erase(size-1,1); } + try + { + DoInterpretLine(str); + } + CATCH_MACRO; + } - InterpretLine(str, insideComment); - - }//while - + } CloseCurrentFile(); } - } - CATCH_MACRO; - - CloseAllFiles(); - bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretBuffer()"< Interpreter::InterpretLine('"<Create(boxType,boxName); + } + + void Interpreter::commandDelete(const std::string &boxName) //virtual + { + mVirtualExecuter->Destroy(boxName); + } + + void Interpreter::commandConnection(const std::string &nodeFrom,const std::string &outputLabel,const std::string &nodeTo,const std::string &inputLabel) //virtual + { + mVirtualExecuter->Connect(nodeFrom,outputLabel,nodeTo,inputLabel); + } + + void Interpreter::commandPackage(const std::string &packageName) //virtual + { + mVirtualExecuter->BeginPackage(packageName); + } + + void Interpreter::commandEndPackage() //virtual + { + mVirtualExecuter->EndPackage(); + } + + void Interpreter::commandDefine(const std::string &name,const std::string &pack,const std::string &scriptfilename) //virtual + { + mVirtualExecuter->Define(name,pack,scriptfilename); + } + + void Interpreter::commandEndDefine() //virtual + { + mVirtualExecuter->EndDefine(); + } + + void Interpreter::commandKind(const std::string &kind) //virtual + { + mVirtualExecuter->Kind(kind); + } + + void Interpreter::commandPrint(const std::string &value) //virtual + { + mVirtualExecuter->Print(value); + } + + + void Interpreter::commandExec(const std::string &word) //virtual + { + if (word=="freeze") + { + mVirtualExecuter->SetNoExecMode(true); + mThrow = false; + } + else if (word=="freeze_no_error") + { + mVirtualExecuter->SetNoExecMode(true); + mVirtualExecuter->SetNoErrorMode(true); + mThrow = false; + } + else if (word=="unfreeze") + { + mVirtualExecuter->SetNoExecMode(false); + mVirtualExecuter->SetNoErrorMode(false); + } + else + { + mVirtualExecuter->Execute(word); + } // if + } + + + void Interpreter::commandInput(const std::string &name,const std::string &box,const std::string &input,const std::string &help) //virtual + { + mVirtualExecuter->DefineInput(name,box,input,help); + } + + void Interpreter::commandOutput(const std::string &name,const std::string &box,const std::string &output,const std::string &help) //virtual + { + mVirtualExecuter->DefineOutput(name,box,output,help); + } + + void Interpreter::commandSet(const std::string &box,const std::string &input,const std::string &value) //virtual + { + mVirtualExecuter->Set(box,input,value); + } + + void Interpreter::commandAuthor(const std::string &author) //virtual + { + mVirtualExecuter->Author(author); + } + + void Interpreter::commandCategory(const std::string &categorytype) //virtual + { + mVirtualExecuter->Category(categorytype); + } + + void Interpreter::commandDescription(const std::string &description) //virtual + { + mVirtualExecuter->Description(description); + } + + + void Interpreter::commandClear() //virtual + { + mVirtualExecuter->Clear(); + } + + void Interpreter::commandInclude(const std::string &word, bool ok) //virtual + { + // if 'source' was given (words.size()==3) then tell to set the + // source file name of the current complex box with the full file name included + if (mCommandLine) + { + InterpretFile(word, ok ); + } + else + { + SwitchToFile(word , ok ); + } + } + + + void Interpreter::commandLoad(const std::string &packageName) //virtual + { + GetExecuter()->LoadPackage(packageName); + } + + void Interpreter::commandUnload(const std::string &packageName) //virtual + { + GetExecuter()->UnLoadPackage(packageName); + } + + void Interpreter::commandBreak() //virtual + { + /* + std::cout << "BreakException(" + <HelpMessages(); + } + + void Interpreter::commandMessage(const std::string &kind,const std::string &levelstr) //virtual + { + int level=0; + sscanf(levelstr.c_str(),"%d",&level); + mVirtualExecuter->SetMessageLevel(kind,level); + } + + +/*EED Borrame + //======================================================================= + void Interpreter::DoInterpretLine( const std::string& line ) //virtual + { + bbtkDebugMessage("interpreter",6,"==> Interpreter::DoInterpretLine(\"" + < words; SplitLine(line,words); // Empty line if (words.size()<1) { - bbtkDebugDecTab("Interpreter",9); + bbtkDebugDecTab("interpreter",9); return; } // Single line comment : # or // if ( words[0][0]=='#' || (words[0][0]=='/' && words[0][1]=='/') ) { - bbtkDebugDecTab("Interpreter",9); - bbtkMessage("Interpreter",9,"Comment"<SetMessageLevel(words[1],level); + } + return; + } + else + { + bbtkMessage("echo",2,line<(mFile.back()); + if (fs!=0) in_script = true; + file = mFileName.back(); + line = mLine.back(); + } + if (command.code==cBreak) + { +// std::cout << "BreakException(" +// <Create(words[1],words[2]); "<Define(words[1],"",filename); } else { - mExecuter->Define(words[1],words[2],filename); + commandDefine(words[1],words[2],filename); +//EED Borrame mVirtualExecuter->Define(words[1],words[2],filename); } break; case cEndDefine : - mExecuter->EndDefine(); + commandEndDefine(); +//EED Borrame mVirtualExecuter->EndDefine(); + break; + + case cKind : + commandKind(words[1]); +//EED Borrame mVirtualExecuter->Kind(words[1]); break; case cPrint : - Print(words[1]); /// \todo use generate command + commandPrint(words[1]); +//EED Borrame mVirtualExecuter->Print(words[1]); break; - + case cExec : - if (words[1]=="freeze") - mExecuter->SetNoExecMode(true); - else if (words[1]=="unfreeze") - mExecuter->SetNoExecMode(false); - else - mExecuter->Update(words[1]); + commandExec(words[1]); +//EED Borrame if (words[1]=="freeze") +//EED Borrame { +//EED Borrame mVirtualExecuter->SetNoExecMode(true); +//EED Borrame mThrow = false; +//EED Borrame } +//EED Borrame else if (words[1]=="freeze_no_error") +//EED Borrame { +//EED Borrame mVirtualExecuter->SetNoExecMode(true); +//EED Borrame mVirtualExecuter->SetNoErrorMode(true); +//EED Borrame mThrow = false; +//EED Borrame } +//EED Borrame else if (words[1]=="unfreeze") +//EED Borrame { +//EED Borrame mVirtualExecuter->SetNoExecMode(false); +//EED Borrame mVirtualExecuter->SetNoErrorMode(false); +//EED Borrame } +//EED Borrame else +//EED Borrame { +//EED Borrame mVirtualExecuter->Execute(words[1]); +//EED Borrame } + break; case cInput : Utilities::SplitAroundFirstDot(words[2],left,right); - mExecuter->DefineInput(words[1],left,right,words[3]); + commandInput(words[1],left,right,words[3]); +//EED Borrame mVirtualExecuter->DefineInput(words[1],left,right,words[3]); break; case cOutput : Utilities::SplitAroundFirstDot(words[2],left,right); - mExecuter->DefineOutput(words[1],left,right,words[3]); + commandOutput(words[1],left,right,words[3]); +//EED Borrame mVirtualExecuter->DefineOutput(words[1],left,right,words[3]); break; case cSet : Utilities::SplitAroundFirstDot(words[1],left,right); - mExecuter->Set(left,right,words[2]); + commandSet(left,right,words[2]); +//EED Borrame mVirtualExecuter->Set(left,right,words[2]); break; case cAuthor : - mExecuter->Author(words[1]); + commandAuthor(words[1]); +//EED Borrame mVirtualExecuter->Author(words[1]); + break; + + case cNewGUI : + commandNewGUI(words[1],words[2]); break; case cCategory : - mExecuter->Category(words[1]); + commandCategory(words[1]); +//EED Borrame mVirtualExecuter->Category(words[1]); break; case cIndex : if (words.size()==1) - Index("tmp_index.html"); + commandIndex("tmp_index.html"); else if (words.size()==2) - Index(words[1]); + commandIndex(words[1]); else if (words.size()==3) - Index(words[1],words[2]); + commandIndex(words[1],words[2]); break; case cDescription : - mExecuter->Description(words[1]); + commandDescription(words[1]); +//EED Borrame mVirtualExecuter->Description(words[1]); break; case cHelp : - Help(words); + commandHelp(words); break; - case cMessage : - if (words.size()<3) - { - bbtk::MessageManager::PrintInfo(); - } - else - { - sscanf(words[2].c_str(),"%d",&level); - bbtk::MessageManager::SetMessageLevel(words[1],level); - } - break; case cGraph : - Graph(words); + commandGraph(words); break; case cConfig : - Config(); + commandConfig(); break; case cReset : - this->mExecuter->Reset(); + commandReset(); + break; + + case cClear : + commandClear(); +//EED Borrame mVirtualExecuter->Clear(); break; case cInclude : - if (mCommandLine) - { - InterpretFile(words[1]); - } - else - { - SwitchToFile(words[1]); - } - // if 'source' was given - if (words.size()==3) - { - GetExecuter()->SetCurrentFileName(words[1]); - } - break; + commandInclude( words[1] , (words.size()==3) ); +//EED Borrame // if 'source' was given (words.size()==3) then tell to set the +//EED Borrame // source file name of the current complex box with the full file name included +//EED Borrame if (mCommandLine) +//EED Borrame { +//EED Borrame InterpretFile(words[1],(words.size()==3)); +//EED Borrame } else{ +//EED Borrame SwitchToFile(words[1],(words.size()==3) ); +//EED Borrame } + break; case cLoad: - GetExecuter()->GetFactory()->LoadPackage(words[1]); + commandLoad( words[1] ); +//EED Borrame GetExecuter()->LoadPackage(words[1]); break; case cUnload: - GetExecuter()->GetFactory()->UnLoadPackage(words[1]); + commandUnload( words[1] ); +//EED Borrame GetExecuter()->UnLoadPackage(words[1]); break; - case cQuit : - delete mExecuter; - throw QuitException(); + case cDebug : + if (words.size()==2) commandDebug(words[1]); + else commandDebug(""); 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: + + // obsolete + // case cWorkspace : + // if (words.size() == 2) + // { + // if (words[1]=="freeze") mVirtualExecuter->SetNoExecMode(true); + // else if (words[1]=="unfreeze") mVirtualExecuter->SetNoExecMode(false); + // } + // else + // { + // mVirtualExecuter->SetWorkspaceName(words[2]); + // } + // break; + + default: bbtkInternalError("should not reach here !!!"); } - bbtkDecTab("Interpreter",9); -} + bbtkDebugMessage("interpreter",6,"<== Interpreter::DoInterpretLine(\"" + <& tokens) + void Interpreter::SplitLine ( const std::string& str, std::vector& tokens) { - bbtkDebugMessageInc("Interpreter",9,"Interpreter::SplitLine(\""< Interpreter::SplitLine(\""< quote; @@ -839,7 +891,7 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& ++i; if (i!=quote.end()) { - // bbtkDebugMessage("Interpreter",0,"\""<<*i<<"\""<& for (i=tokens.begin(); i!=tokens.end(); ++i) { - bbtkDebugMessage("Interpreter",9,"["<<*i<<"] "); + bbtkDebugMessage("interpreter",9,"--["<<*i<<"]"<mVirtualExecuter->Reset(); } //======================================================================= - //======================================================================= /** * */ + /* void Interpreter::Print( const std::string& str) { - if (mExecuter->GetNoExecMode()) return; + if (mVirtualExecuter->GetNoExecMode()) return; - bbtkDebugMessageInc("Interpreter",9,"Interpreter::Print(\""<& std::string tok,box,output; tok = str.substr(lastPos, pos - lastPos); Utilities::SplitAroundFirstDot(tok,box,output); - chains.push_back( mExecuter->Get(box,output) ); + chains.push_back( mVirtualExecuter->Get(box,output) ); // InterpretLine("connect %tok% _C_.In%num%") @@ -938,22 +984,22 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& std::vector::iterator i; 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); + bbtkDebugDecTab("interpreter",9); } +*/ //======================================================================= /** * */ - -// =================================================================================== - - void Interpreter::SwitchToFile( const std::string& name ) +/*EED Borrame + // ========================================================================= + void Interpreter::SwitchToFile( const std::string& name , bool source ) { // Note : in the following : // name : the user supplied name @@ -965,8 +1011,8 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& // use ./directory/subdir/scrname.bbs // - bbtkDebugMessageInc("Interpreter",9,"Interpreter::SwitchToFile( \"" - < Interpreter::SwitchToFile( \"" + < script_paths; std::string fullPathScriptName; // full path script name @@ -976,117 +1022,134 @@ void Interpreter::SplitLine ( const std::string& str, std::vector& // The following is *NOT* a debug time message : // It's a user intended message. // Please don't remove it. - bbtkMessage("Interpreter",1, + 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, - "extract : pkgname [" << pkgname - << "] upath [" << upath << "]" << std::endl); + bbtkMessage("interpreter",3, + "package name:[" << pkgname + << "] path:[" << upath << "]" << std::endl); bool fullnameGiven = false; bool foundFile = false; - if(pkgname == "*") // =========================================== load all boxes (e.g. std/boxes/*) - { - 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 - { - int nbFiles = Utilities::Explore(upath, false, Filenames); - nbBssFiles = 0; - for (std::vector::iterator i = Filenames.begin(); i!= Filenames.end(); ++i) - { - int lgr = (*i).size(); - if (lgr < 5) - continue; // ignore non .bbs file - if ((*i).substr(lgr-4, 4) != ".bbs") - continue; - -printf("EED Interpreter::SwitchToFile flag01 %s \n", (*i).c_str() ); - (*stream) << "include \"" << *i << "\"\n"; - - 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 + // ==== "*" provided : load all scripts in given path + // relative (e.g. std/boxes/ *) or absolute <<<<<<<< / * + if (pkgname == "*") { - 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," [" <::iterator i = Filenames.begin(); i!= Filenames.end(); ++i) - { - int lgr = (*i).size(); - if (lgr < 5) - continue; // ignore non .bbs file - if ((*i).substr(lgr-4, 4) != ".bbs") - continue; - -printf("EED Interpreter::SwitchToFile flag02 %s \n", (*i).c_str() ); - (*stream) << "include \"" << *i << "\"\n"; - - 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::stringstream* stream = new std::stringstream; + //if (upath.size()!=0) // avoid troubles for "*" + + // ==== no path provided : look in root bbs path + if (upath.size()==0) + { + // bbtkMessage("interpreter",1, + // LG : add all bbs path + // script_paths.push_back( ConfigurationFile::GetInstance().Get_root_bbs_path() ); + std::vector::const_iterator i; + for (i=ConfigurationFile::GetInstance().Get_bbs_paths().begin(); + i!=ConfigurationFile::GetInstance().Get_bbs_paths().end(); + i++) + { + script_paths.push_back(*i); + } + } + // ==== absolute path provided + else if (upath[0]=='/' || upath[1] == ':' ) + { + if ( Utilities::IsDirectory( upath ) ) + { + script_paths.push_back(upath); + } + else + { + bbtkError("'"<::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); + } + } + if (script_paths.empty()) + { + bbtkError("no '"<::iterator i; + for (i=script_paths.begin();i!=script_paths.end();i++) + { + bbtkMessage("interpreter",1, + "--> Looking in '" << *i << "'" << std::endl); + + Filenames.clear(); + //int nbFiles = + Utilities::Explore(*i, false, Filenames); + + for (std::vector::iterator j = Filenames.begin(); + j!= Filenames.end(); ++j) + { + int lgr = (*j).size(); + if (lgr < 5) continue; + // ignore non .bbp file + if ( (*j).substr(lgr-4, 4) != ".bbp") continue; + + (*stream) << "include \"" << *j << "\"\n"; + bbtkMessage("interpreter",2," --> Found '" << *j << "'" << std::endl); + + nbBssFiles++; + } // for (std::vector... + } // for (i=script_... + // === Result ... + if (nbBssFiles==0) + { + bbtkMessage("interpreter",1, + " --> No .bbp found"<< std::endl); + } + else + { + bbtkMessage("interpreter",1, + " --> "<4) - { - if (fullPathScriptName.substr(l-4, 4) != ".bbs") + if (l!=0) + { + if ((fullPathScriptName.substr(l-4, 4) != ".bbs")&& + (fullPathScriptName.substr(l-4, 4) != ".bbp")) { - fullPathScriptName = fullPathScriptName + ".bbs"; - } - } - else - { - fullPathScriptName = fullPathScriptName + ".bbs"; - } - - if ( Utilities::FileExists(fullPathScriptName)) - { - foundFile = true; - } - } // endif l != 0 + std::string tfullPathScriptName = fullPathScriptName + ".bbs"; + if ( Utilities::FileExists(tfullPathScriptName) ) + { + fullPathScriptName = tfullPathScriptName; + foundFile = true; + } + else + { + tfullPathScriptName = fullPathScriptName + ".bbp"; + if ( Utilities::FileExists(tfullPathScriptName) ) + { + fullPathScriptName = tfullPathScriptName; + foundFile = true; + } + } + } + else + { + if ( Utilities::FileExists(fullPathScriptName) ) + { + foundFile = true; + } + } + } // 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. - bbtkMessage("Interpreter",2, - " [" <=4 + if(tfullPathScriptName.size()>=4){ + if (tfullPathScriptName.substr(tfullPathScriptName.size()-4, 3)==".bb") + { + fullPathScriptName = tfullPathScriptName; + 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, + " [" <SetCurrentFileName(fullPathScriptName); + } + //======================================================================= + + + void Interpreter::SetTypeOfScript_Application() + { + GetExecuter()->SetTypeOfScript_Application(); + } + + +/*EED Borrame + //======================================================================= void Interpreter::SwitchToStream( std::stringstream* stream ) { - mFile.push_back(stream); + bbtkDebugMessage("interpreter",4,"==> Interpreter::SwitchToStream()" + < Interpreter::LoadScript(" + <[" << fullPathScriptName + bbtkMessage("interpreter",1," -->[" << fullPathScriptName << "] found" << std::endl); mFile.push_back(s); mFileName.push_back(fullPathScriptName); + mFileNameHistory.push_back(fullPathScriptName); mIncludeFileName.push_back(includeScriptName); mLine.push_back(0); return; } + //======================================================================= +*/ +/*EED Borrame //======================================================================= - /** - * - */ void Interpreter::CloseCurrentFile() { - bbtkDebugMessage("Interpreter",9,"Interpreter::CloseCurrentFile()" + bbtkDebugMessage("interpreter",9,"==> Interpreter::CloseCurrentFile()" < no file left open"< no file left open"<(mFile.back()); if (file!=0) file->close(); @@ -1266,54 +1389,37 @@ void Interpreter::SwitchToStream( std::stringstream* stream ) mIncludeFileName.pop_back(); mLine.pop_back(); - bbtkDebugMessage("Interpreter",9," Remains " + bbtkDebugMessage("interpreter",9," Remains " < Interpreter::CloseAllFiles()" <close(); - delete mFile.back(); - mFile.pop_back(); - bbtkDebugMessage("Interpreter",9, - " Closing file '"<& words, CommandInfoType& info ) { - bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretCommand(...)"< Interpreter::InterpretCommand(...)"<second.argmin ) || - ( words.size()-1 > c->second.argmax ) ) + if ( ( ((int)words.size())-1 < c->second.argmin ) || + ( ((int)words.size())-1 > c->second.argmax ) ) { - HelpCommand(words[0]); + commandHelp(words[0]); bbtkError(words[0]<<" : wrong number of arguments"); } - +//std::cout<<"Interpreter::InterpretCommand( const std::vector& words,"<second; - bbtkDecTab("Interpreter",9); + + bbtkDebugMessage("interpreter",9,"<== Interpreter::InterpretCommand(...)"<& words) +void Interpreter::commandHelp(const std::vector& words) { unsigned int nbarg = words.size()-1; @@ -1348,18 +1457,18 @@ void Interpreter::Help(const std::vector& words) { if (words[1]=="packages") { - GetExecuter()->GetFactory()->PrintPackages(true); + GetExecuter()->GetFactory()->PrintHelpListPackages(true); return; } try { - HelpCommand(words[1]); + commandHelp(words[1]); } catch (bbtk::Exception e) { try { - GetExecuter()->GetFactory()->HelpPackage(words[1]); + GetExecuter()->GetFactory()->PrintHelpPackage(words[1]); if ( mUser != 0 ) { std::string url = @@ -1376,7 +1485,8 @@ void Interpreter::Help(const std::vector& words) try { std::string package; - GetExecuter()->GetFactory()->HelpBlackBox(words[1],package); + GetExecuter()->GetFactory()->PrintHelpDescriptor(words[1], + package); if ( mUser != 0 ) { std::string url = @@ -1393,7 +1503,7 @@ void Interpreter::Help(const std::vector& words) { try { - GetExecuter()->ShowRelations(words[1],"0","9999"); + GetExecuter()->PrintHelpBlackBox(words[1],"0","9999"); } catch (bbtk::Exception h){ bbtkError("\""<& words) { if ( words[1]=="packages" ) { - GetExecuter()->GetFactory()->PrintPackages(true,true); + GetExecuter()->GetFactory()->PrintHelpListPackages(true,true); return; } try { - GetExecuter()->GetFactory()->HelpPackage(words[1],true); + GetExecuter()->GetFactory()->PrintHelpPackage(words[1],true); } catch (bbtk::Exception f) { @@ -1422,7 +1532,7 @@ void Interpreter::Help(const std::vector& words) } else { - HelpCommand(words[0]); + commandHelp(words[0]); bbtkError(words[0]<<" : syntax error"); } } @@ -1435,7 +1545,7 @@ void Interpreter::Help(const std::vector& words) //=================================================================== /// Displays the Configuration - void Interpreter::Config() const + void Interpreter::commandConfig() const { ConfigurationFile::GetInstance().GetHelp(1); } @@ -1459,15 +1569,20 @@ void Interpreter::Help(const std::vector& words) //======================================================================= + //======================================================================= /// Displays help on a particular commands - void Interpreter::HelpCommand(const std::string& s) + void Interpreter::commandHelp(const std::string& s) { CommandDictType::iterator c; c = mCommandDict.find(s); if ( c == mCommandDict.end() ) { - bbtkError(s<<" : Unknown command"); - } + +//EED 2016-12-22 +// bbtkError(s<<" : Unknown command"); + std::string tmpSS=s+" : Unknown command"; + bbtkError(tmpSS); + } // std::cout << " " << s << " : "<< std::endl; // CommandParamDictType::iterator i; // for ( i = c->second.begin(); @@ -1479,7 +1594,7 @@ void Interpreter::Help(const std::vector& words) } //======================================================================= - +/*EED Borrame //======================================================================= /// Fills the vector commands with the commands which /// have the first n chars of buf for prefix @@ -1497,9 +1612,10 @@ void Interpreter::Help(const std::vector& words) } } //======================================================================= +*/ + - - +/*EED Borrame //======================================================================= #ifdef BBTK_USE_TERMIOS_BASED_PROMPT @@ -1521,10 +1637,10 @@ void Interpreter::Help(const std::vector& words) void Interpreter::GetLineFromPrompt(std::string& s) { int c; - int ind=0; + unsigned int ind=0; - int MAX_LINE_SIZE = 160; - int MAX_HISTORY_SIZE = 100; + unsigned int MAX_LINE_SIZE = 160; + unsigned int MAX_HISTORY_SIZE = 100; char* newline = new char[MAX_LINE_SIZE]; memset(newline,0,MAX_LINE_SIZE); @@ -1532,7 +1648,7 @@ void Interpreter::Help(const std::vector& words) memset(histline,0,MAX_LINE_SIZE); char* line = newline; - int hist = mHistory.size(); + unsigned int hist = mHistory.size(); write(1,"> ",2); while(1) @@ -1540,7 +1656,7 @@ void Interpreter::Help(const std::vector& words) c=0; read ( STDIN_FILENO, &c, 4) ; - bbtkDebugMessage("Debug",9,"[0x"<& words) //======================================================================= #endif +*/ - - + + + + + +/*EED Borrame //======================================================================= void Interpreter::CommandLineInterpreter() { - bbtkDebugMessageInc("Interpreter",9, + bbtkDebugMessageInc("interpreter",9, "Interpreter::CommandLineInterpreter()"<& words) mCommandLine = true; bool again = true; - bool insideComment = false; // for multiline comment + // bool insideComment = false; // for multiline comment + mInsideComment = false; do { try { std::string line; GetLineFromPrompt(line); - InterpretLine(line, insideComment); + DoInterpretLine(line); //, insideComment); } - catch (QuitException e) - { - bbtkMessage("Interpreter",1,"Interpreter : Quit"<& words) std::cout << "Good bye !" << std::endl; - bbtkDebugDecTab("Interpreter",9); + bbtkDebugDecTab("interpreter",9); } - +*/ + //======================================================================= -void Interpreter::Graph(const std::vector& words) +void Interpreter::commandGraph(const std::vector& words) { std::string page; bool system_display = true; @@ -1787,31 +1910,31 @@ void Interpreter::Graph(const std::vector& words) if (words.size()==1) { - page = mExecuter->ShowGraph(".","0","0","","","",system_display); + page = mVirtualExecuter->ShowGraph(".","0","0","","","",system_display); } else if (words.size()==2) { - page = mExecuter->ShowGraph(words[1],"0","0","","","",system_display); + page = mVirtualExecuter->ShowGraph(words[1],"0","0","","","",system_display); } else if (words.size()==3) { - page = mExecuter->ShowGraph(words[1],words[2],"0","","","",system_display); + page = mVirtualExecuter->ShowGraph(words[1],words[2],"0","","","",system_display); } else if (words.size()==4) { - page = mExecuter->ShowGraph(words[1],words[2],words[3],"","","",system_display); + page = mVirtualExecuter->ShowGraph(words[1],words[2],words[3],"","","",system_display); } else if (words.size()==5) { - page = mExecuter->ShowGraph(words[1],words[2],words[3],words[4],"","",system_display); + page = mVirtualExecuter->ShowGraph(words[1],words[2],words[3],words[4],"","",system_display); } else if (words.size()==6) { - page = mExecuter->ShowGraph(words[1],words[2],words[3],words[4],words[5],"",system_display); + page = mVirtualExecuter->ShowGraph(words[1],words[2],words[3],words[4],words[5],"",system_display); } else if (words.size()==7) { - page = mExecuter->ShowGraph(words[1],words[2],words[3],words[4],words[5],words[6],system_display); + page = mVirtualExecuter->ShowGraph(words[1],words[2],words[3],words[4],words[5],words[6],system_display); } if ( ( mUser != 0 ) && ( mUser->InterpreterUserHasOwnHtmlPageViewer() ) ) @@ -1822,7 +1945,7 @@ void Interpreter::Graph(const std::vector& words) //======================================================================= -void Interpreter::Index(const std::string& filename, +void Interpreter::commandIndex(const std::string& filename, const std::string& type) { Factory::IndexEntryType t; @@ -1835,6 +1958,270 @@ void Interpreter::Index(const std::string& filename, } //======================================================================= + +//======================================================================= +void Interpreter::commandNewGUI(const std::string& boxname, + const std::string& instanceName) +{ + if (mRealExecuter.expired()) + { + bbtkError("command 'newgui' cannot be compiled yet"); + } + + std::string typeName = instanceName+"Type"; + std::stringstream* s = new std::stringstream; + // create the complex box + (*s) << "define "< in; + + Factory::Pointer F = mVirtualExecuter->GetFactory(); + /* + Package::Pointer user = F->GetPackage("user"); + */ + ComplexBlackBoxDescriptor::Pointer workspace = + mRealExecuter.lock()->GetCurrentDescriptor(); + + if (workspace==0) + { + delete s; + bbtkError("interpreter::CreateGUI : could not access the executer currently defined complex box"); + } + + + /* + (ComplexBlackBoxDescriptor::Pointer)(user->GetBlackBoxMap().find("workspace")->second.get()); + */ + + BlackBox::Pointer box = workspace->GetPrototype()->bbGetBlackBox(boxname); + // BlackBox::InputConnectorMapType incm = box->bbGetInputConnectorMap(); + // int nb = 0; + BlackBox::InputConnectorMapType::iterator i; + for (i=box->bbGetInputConnectorMap().begin(); + i!=box->bbGetInputConnectorMap().end(); + ++i) + { + // If the input is connected : continue + if (i->second->IsConnected()) continue; + // Get the input descriptor + const BlackBoxInputDescriptor* d = box->bbGetDescriptor()->GetInputDescriptor(i->first); + // If it is a "system" input : skip it +#ifdef USE_WXWIDGETS + if ( ( d->GetCreatorTypeInfo() == typeid(AtomicBlackBoxDescriptor)) || + ( d->GetCreatorTypeInfo() == typeid(WxBlackBoxDescriptor)) ) + continue; +#else +// JFGA 12/12/2014 Adding WT options for compile with it. + +/*#if USE_WT + + if ( ( d->GetCreatorTypeInfo() == typeid(AtomicBlackBoxDescriptor)) || + ( d->GetCreatorTypeInfo() == typeid(WtBlackBoxDescriptor)) ) + continue; + + +#else +*/ + if ( ( d->GetCreatorTypeInfo() == typeid(AtomicBlackBoxDescriptor)) ) + continue; +//#endif + +#endif + bool widok = true; + std::string widget,adaptor; + // try to find a widget adaptor + if (F->FindWidgetAdaptor(DataInfo(d->GetTypeInfo(),""), + d->GetDataInfo(), + adaptor)) + { + // command to create the adaptor + (*s) << " new "<first<first<<".Label "<first<first<<".In \" " + <bbGetInputAsString(i->first)<<"\"" + << std::endl; + // store the input name + in.push_back(i->first); + (*s) << " connect "<first<<".Widget layout.Widget"<first<<"'"<first<<".BoxChange change.In"<FindWidgetAdaptor2(DataInfo(d->GetTypeInfo(),""), + d->GetDataInfo(), + widget,adaptor) ) + { + // command to create the widget + (*s) << " new "<first<<"Widget"<first<first<<"Widget.Out " + <first<<".In"<first<<"Widget.Label "<first<first<<"Widget.In \" " + <bbGetInputAsString(i->first)<<"\""<< std::endl; + // store the input name + in.push_back(i->first); + (*s) << " connect "<first<<"Widget.Widget layout.Widget"<first<<"'"<first<<"Widget.BoxChange change.In"<FindAdaptor(DataInfo(typeid(std::string),""), + d->GetDataInfo(), + adaptor)) + { + // command to create the adaptor + (*s) << " new InputText "<first<first<<".Title "<first<first<<".In \" " + <bbGetInputAsString(i->first)<<"\""<< std::endl; + // store the input name + in.push_back(i->first); + (*s) << " connect "<first<<".Widget layout.Widget"<first<<"'"<first<<".BoxChange change.In"<first<<" " + <first<<".Out "<first<::iterator j; + for (j=in.begin();j!=in.end();++j) + { + // connect + (*s) << "connect "<GetFactory()->Check(); + // MessageManager::SetMessageLevel("debug",o); + } + } + else + { + Object:: PrintObjectListInfo(name); + } + } + //========================================================================== + + /* + //========================================================================== + // Adds a callback when 'break' command issued + void Interpreter::AddBreakObserver( BreakCallbackType c ) + { + mBreakSignal.connect(c); + } + //========================================================================== + */ + + //========================================================================== + std::string Interpreter::GetObjectName() const + { + return std::string("Interpreter"); + } + //========================================================================== + + //========================================================================== + std::string Interpreter::GetObjectInfo() const + { + std::stringstream i; + return i.str(); + } + //========================================================================== + + //========================================================================== +size_t Interpreter::GetObjectSize() const +{ + size_t s = Superclass::GetObjectSize(); + s += Interpreter::GetObjectInternalSize(); + return s; + } + //========================================================================== + //========================================================================== +size_t Interpreter::GetObjectInternalSize() const +{ + size_t s = sizeof(Interpreter); + return s; + } + //========================================================================== + //========================================================================== + size_t Interpreter::GetObjectRecursiveSize() const + { + size_t s = Superclass::GetObjectRecursiveSize(); + s += Interpreter::GetObjectInternalSize(); + s += mVirtualExecuter->GetObjectRecursiveSize(); + return s; + } + //========================================================================== }//namespace