-/*=========================================================================
-
+/*=========================================================================
Program: bbtk
- Module: $RCSfile: bbtkInterpreter.cxx,v $ $
+ Module: $RCSfile: bbtkInterpreter.cxx,v $
Language: C++
- Date: $Date: 2008/07/01 07:58:28 $
- Version: $Revision: 1.67 $
-
- 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: 2008/10/17 08:18:13 $
+ Version: $Revision: 1.77 $
=========================================================================*/
+
+/* ---------------------------------------------------------------------
+
+* Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
+* Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
+*
+* 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.
+* ------------------------------------------------------------------------ */
+
/**
* \file
* \brief class Interpreter :
info.argmin = 1;
info.argmax = 2;
info.code = cExec;
- info.syntax = "exec <box | 'freeze' | 'unfreeze' >";
- info.help = "Executes the black box of name <box> (and connected boxes if needed). If the special keyword 'freeze' is given then freezes any further execution command. 'unfreeze' reverts to normal execution mode.";
+ info.syntax = "exec <box | 'freeze' | 'unfreeze' | 'freeze_no_error' >";
+ info.help = "Executes the black box of name <box> (and connected boxes if needed). If the special keyword 'freeze' is given then freezes any further execution command. 'unfreeze' reverts to normal execution mode. 'freeze_no_error' is like freeze but also skips any error.";
mCommandDict[info.keyword] = info;
info.keyword = "package";
info.argmax = 2;
info.code = cDefine;
info.syntax = "define <type> [<package>]";
- info.help = "Begins the definition of a new type of complex black box called <type>. If <package> if provided will create it in the given package.";
+ info.help = "Begins the definition of a new type of complex black box called <type>. If <package> is provided will create it in the given package.";
mCommandDict[info.keyword] = info;
info.keyword = "endefine";
info.argmax = 2;
info.code = cMessage;
info.syntax = "message <kind> <level>";
- info.help = "Sets the level of the kind of messages <kind> to <level>.\n If kind='All' then sets the level for all kinds. If no kind nor level is passed then prints info on available kinds of messages and their current level."; mCommandDict[info.keyword] = info;
+ info.help = "Sets the level of the kind of messages <kind> to <level>.\n If kind='All' then sets the level for all kinds. If no kind nor level is passed then prints info on available kinds of messages and their current level.";
+ mCommandDict[info.keyword] = info;
info.keyword = "include";
info.argmin = 1;
info.argmax = 2;
info.code = cWorkspace;
info.syntax = "workspace < ( freeze | unfreeze ) | ( rename <newname> ) >";
- info.help = "Configures the workspace.\n 'freeze' allow to block execution commands while keeping definition commands active. 'unfreeze' turns back the worspace in 'normal' mode.\n 'rename' allow to set a new name to the workspace.";
+ info.help = "Configures the workspace.\n 'freeze' allows to block execution commands while keeping definition commands active. 'unfreeze' turns back the worspace in 'normal' mode.\n 'rename' allow to set a new name to the workspace.";
mCommandDict[info.keyword] = info;
*/
else
{
std::stringstream mess;
- mess << "* ERROR : "<<e.GetMessage()<<std::endl;
+ mess << "* ERROR : "<<e.GetErrorMessage()<<std::endl;
if (mFileName.size()) {
mess << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
mess << "* LINE : "<<mLine.back()<<std::endl;
/**
*
*/
- Interpreter::ExitStatus Interpreter::InterpretFile( const std::string& filename )
+ Interpreter::ExitStatus Interpreter::InterpretFile( const std::string& filename, bool source )
{
bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretFile(\""<<filename<<"\")"<<std::endl);
try
{
- SwitchToFile(filename);
+ SwitchToFile(filename,source);
bool insideComment = false; // for multiline comment
while (mFile.size()>0)
{
str.erase(size-1,1);
}
+ try
+ {
+ InterpretLine(str, insideComment);
+ }
+ CATCH_MACRO;
- InterpretLine(str, insideComment);
-
- }//while
+ }//while !eof
CloseCurrentFile();
- }
- }
+ }//while >0
+ } // try
CATCH_MACRO;
CloseAllFiles();
{
str.erase(size-1,1);
}
-
- InterpretLine(str, insideComment);
-
+ try
+ {
+ InterpretLine(str, insideComment);
+ }
+ CATCH_MACRO;
}//while
-
CloseCurrentFile();
}
}
case cDefine :
if (mFileName.size()>0)
{
- filename = mIncludeFileName.back(); //Utilities::get_file_name(mFileName.back());
+ filename = mFileName.back(); //mIncludeFileName.back(); //Utilities::get_file_name(mFileName.back());
}
if (words.size()==2)
{
case cExec :
if (words[1]=="freeze")
- mVirtualExecuter->SetNoExecMode(true);
- else if (words[1]=="unfreeze")
- mVirtualExecuter->SetNoExecMode(false);
- else
- mVirtualExecuter->Execute(words[1]);
+ {
+ mVirtualExecuter->SetNoExecMode(true);
+ mThrow = false;
+ }
+ else if (words[1]=="freeze_no_error ")
+ {
+ mVirtualExecuter->SetNoExecMode(true);
+ mVirtualExecuter->SetNoErrorMode(true);
+ mThrow = false;
+ }
+ else if (words[1]=="unfreeze")
+ {
+ mVirtualExecuter->SetNoExecMode(false);
+ mVirtualExecuter->SetNoErrorMode(false);
+ }
+ else
+ {
+ mVirtualExecuter->Execute(words[1]);
+ }
break;
case cInput :
break;
case cInclude :
- if (mCommandLine)
+ // 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(words[1]);
+ InterpretFile(words[1],(words.size()==3));
}
else
{
- SwitchToFile(words[1]);
+ SwitchToFile(words[1],(words.size()==3) );
}
- // if 'source' was given
- if (words.size()==3)
- {
- GetExecuter()->SetCurrentFileName(words[1]);
- }
- break;
+ break;
case cLoad:
GetExecuter()->LoadPackage(words[1]);
*/
// =========================================================================
- void Interpreter::SwitchToFile( const std::string& name )
+ void Interpreter::SwitchToFile( const std::string& name , bool source )
{
// Note : in the following :
// name : the user supplied name
pkgname = Utilities::ExtractScriptName(name,upath);
bbtkMessage("Interpreter",3,
- "extract : pkgname [" << pkgname
- << "] upath [" << upath << "]" << std::endl);
+ "package name:[" << pkgname
+ << "] path:[" << upath << "]" << std::endl);
bool fullnameGiven = false;
bool foundFile = false;
// relative (e.g. std/boxes/*) or absolute
if (pkgname == "*")
{
- int nbBssFiles;
-
+
std::stringstream* stream = new std::stringstream;
//if (upath.size()!=0) // avoid troubles for "*"
if (upath.size()==0)
{
// bbtkMessage("Interpreter",1,
- script_paths.push_back( ConfigurationFile::GetInstance().Get_root_bbs_path() );
+ // LG : add all bbs path
+ // script_paths.push_back( ConfigurationFile::GetInstance().Get_root_bbs_path() );
+ std::vector<std::string>::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] == ':' )
// the relative path provided
else
{
- std::vector<std::string>::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 '"<<upath<<"' subdir found in search paths"
- << std::endl);
- }
-
+ std::vector<std::string>::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 '"<<upath<<"' subdir found in search paths"
+ << std::endl);
+ }
}
+
+
// === search paths list complete : now explore it
-
-
+ int nbBssFiles = 0;
+ // ==== relative name, iterate + load all .bbs/.bbp files
std::vector<std::string>::iterator i;
- 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++)
{
bbtkMessage("Interpreter",1,
"--> Looking in '" << *i << "'" << std::endl);
-
Filenames.clear();
- int nbFiles = Utilities::Explore(*i, false, Filenames);
+ //int nbFiles =
+ Utilities::Explore(*i, false, Filenames);
- nbBssFiles = 0;
for (std::vector<std::string>::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;
+ 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);
+ 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,
- " --> "<<nbBssFiles<<" .bbs found"<< std::endl);
- SwitchToStream(stream);
- }
-
- //break; // a directory was found; we stop iterating
- // LG : No! We want all files included !
- } // for vector
+ } // for (std::vector...
+ } // for (i=script_...
+
+ // === Result ...
+ if (nbBssFiles==0)
+ {
+ bbtkMessage("Interpreter",1,
+ " --> No .bbp found"<< std::endl);
+ }
+ else
+ {
+ bbtkMessage("Interpreter",1,
+ " --> "<<nbBssFiles<<" .bbp found"<< std::endl);
+ SwitchToStream(stream);
+ }
return;
}
//=============== end pkgname=="*" ===========
-
-
+
+
// if name starts with a / or a . or contains : user is assumed to have passed a relative/absolute name
// (not only a plain script name)
// we trust him, and try to expland the directory name
// allow user to always forget ".bbs"
int l = fullPathScriptName.size();
- if (l!=0) {
-
- if (l>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<std::string>::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);
+ {
+ 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;
+ }
- // 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,
- " [" <<fullPathScriptName <<"] : doesn't exist"
+ std::string tfullPathScriptName = Utilities::MakePkgnameFromPath(path, name, false);
+ 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,
+ " [" <<fullPathScriptName <<"] : does not exist"
<<std::endl);
- continue; // try next path
- }
- bbtkMessage("Interpreter",2,
+ continue; // try next path
+ }
+ bbtkMessage("Interpreter",2,
+ " [" <<fullPathScriptName
+ <<"] : found" <<std::endl);
+ foundFile = true;
+ break; // a script was found; we stop iterating
+ }
+ else
+ {
+ fullPathScriptName = tfullPathScriptName + ".bbs";
+ // Check if library exists
+ if ( ! Utilities::FileExists(fullPathScriptName) )
+ {
+ fullPathScriptName = tfullPathScriptName + ".bbp";
+ 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,
+ " [" <<tfullPathScriptName <<".bbs/.bbp] : do not exist"
+ <<std::endl);
+ continue; // try next path
+ }
+ }
+ bbtkMessage("Interpreter",2,
" [" <<fullPathScriptName
<<"] : found" <<std::endl);
- foundFile = true;
- break; // a script was found; we stop iterating
-
+ foundFile = true;
+ break; // a script was found; we stop iterating
+ }
} //------------------ // end for ( package_paths.begin();i!=package_paths.end() )
- }
-
+ }
+
if (!foundFile)
{
if (fullnameGiven)
else
bbtkError("Script ["<<fullPathScriptName<<"] not found");
else
- bbtkError("No ["<<pkgname<<".bbs] script found");
+ bbtkError("No ["<<pkgname<<".bbs/.bbp] script found");
return;
}
else
+ {
LoadScript(fullPathScriptName,name);
+ if (source) GetExecuter()->SetCurrentFileName(fullPathScriptName);
+ }
return;
}
mIncludeFileName.push_back(includeScriptName);
mLine.push_back(0);
- return;
+ return;
}
//=======================================================================
}
// tests the number of args
- if ( ( words.size()-1 < c->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]);
bbtkError(words[0]<<" : wrong number of arguments");
c = mCommandDict.find(s);
if ( c == mCommandDict.end() ) {
bbtkError(s<<" : Unknown command");
- }
+ }
// std::cout << " " << s << " : "<< std::endl;
// CommandParamDictType::iterator i;
// for ( i = c->second.begin();
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);
memset(histline,0,MAX_LINE_SIZE);
char* line = newline;
- int hist = mHistory.size();
+ unsigned int hist = mHistory.size();
write(1,"> ",2);
while(1)
BlackBox::Pointer box = workspace->GetPrototype()->bbGetBlackBox(boxname);
// BlackBox::InputConnectorMapType incm = box->bbGetInputConnectorMap();
- int nb = 0;
+ // int nb = 0;
BlackBox::InputConnectorMapType::iterator i;
for (i=box->bbGetInputConnectorMap().begin();
i!=box->bbGetInputConnectorMap().end();