Program: bbtk
Module: $RCSfile: bbtkInterpreter.cxx,v $ $
Language: C++
- Date: $Date: 2008/03/20 11:04:57 $
- Version: $Revision: 1.49 $
+ Date: $Date: 2008/03/26 08:51:43 $
+ Version: $Revision: 1.56 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
Interpreter::Interpreter()
:
mUser(0),
- mCommandLine(false)
+ mCommandLine(false),
+ mThrow(false)
{
bufferNb =0;
bbtk::MessageManager::RegisterMessageType("Echo","Level>0 : Prints the 'echo' commands of the user.\n\tLevel>1 : Prints the command being interpreted",1);
//=======================================================================
+ InterpreterError::InterpreterError( const std::string& message,
+ bool in_script_file,
+ const std::string& script_file,
+ int script_line
+ )
+ : Exception("Interpreter",0,message),
+ mInScriptFile(in_script_file),
+ mScriptFile(script_file),
+ mScriptLine(script_line)
+ {
+ }
+ InterpreterError::InterpreterError( const Exception& excep,
+ bool in_script_file,
+ const std::string& script_file,
+ int script_line
+ )
+ : Exception(excep),
+ mInScriptFile(in_script_file),
+ mScriptFile(script_file),
+ mScriptLine(script_line)
+ {
+ }
+ //=======================================================================
+ void Interpreter::CatchBbtkException( const bbtk::Exception& e )
+ {
+ if (mThrow)
+ {
+ bool in_script = false;
+ std::string file("");
+ int line = 0;
+ if (mFileName.size()) {
+ std::ifstream* fs = dynamic_cast<std::ifstream*>(mFile.back());
+ if (fs!=0) in_script = true;
+ file = mFileName.back();
+ line = mLine.back();
+ }
+ CloseAllFiles();
+ throw InterpreterError(e,in_script,file,line);
+ }
+ else
+ {
+ std::stringstream mess;
+ mess << "* ERROR : "<<e.GetMessage()<<std::endl;
+ if (mFileName.size()) {
+ mess << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
+ mess << "* LINE : "<<mLine.back()<<std::endl;
+ }
+ std::cerr << mess.str();
+ }
+ }
+ //=======================================================================
+
+ //=======================================================================
+ void Interpreter::CatchStdException( const std::exception& e )
+ {
+ if (mThrow)
+ {
+ bool in_script = false;
+ std::string file("");
+ int line = 0;
+ if (mFileName.size()) {
+ std::ifstream* fs = dynamic_cast<std::ifstream*>(mFile.back());
+ if (fs!=0) in_script = true;
+ file = mFileName.back();
+ line = mLine.back();
+ }
+ CloseAllFiles();
+ throw InterpreterError(e.what(),in_script,file,line);
+ }
+ else
+ {
+ std::stringstream mess;
+ mess << "* ERROR : "<<e.what()<<std::endl;
+ if (mFileName.size()) {
+ mess << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
+ mess << "* LINE : "<<mLine.back()<<std::endl;
+ }
+ std::cerr << mess.str();
+ }
+ }
+ //=======================================================================
+
+ //=======================================================================
+ void Interpreter::CatchUnknownException()
+ {
+ if (mThrow)
+ {
+ bool in_script = false;
+ std::string file("");
+ int line = 0;
+ if (mFileName.size()) {
+ std::ifstream* fs = dynamic_cast<std::ifstream*>(mFile.back());
+ if (fs!=0) in_script = true;
+ file = mFileName.back();
+ line = mLine.back();
+ }
+ CloseAllFiles();
+ 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 : \""<<mFileName.back()<<"\""<<std::endl;
+ mess << "* LINE : "<<mLine.back()<<std::endl;
+ }
+ std::cerr << mess.str();
+ }
+ }
+ //=======================================================================
+
+ //=======================================================================
+
+#define CATCH_MACRO \
+ catch (QuitException e) \
+ { \
+ status = Interpreter_QUIT; \
+ if (mThrow) throw QuitException(); \
+ } \
+ catch (bbtk::Exception e) \
+ { \
+ status = Interpreter_ERROR; \
+ CatchBbtkException(e); \
+ } \
+ catch (std::exception& e) \
+ { \
+ status = Interpreter_ERROR; \
+ CatchStdException(e); \
+ } \
+ catch (...) \
+ { \
+ status = Interpreter_ERROR; \
+ CatchUnknownException(); \
+ }
+ //=======================================================================
+
+
//=======================================================================
/**
*
bool exm = mCommandLine;
mCommandLine = false;
- ExitStatus status = OK;
+ ExitStatus status = Interpreter_OK;
try
{
CloseCurrentFile();
}
}
- catch (QuitException e)
- {
- status = QUIT;
- }
- catch (bbtk::Exception e)
- {
- std::cerr << "* ERROR : "<<e.GetMessage()<<std::endl;
- if (mFileName.size()) {
- std::cerr << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
- std::cerr << "* LINE : "<<mLine.back()<<std::endl;
- }
- status = ERROR;
- }
- catch (std::exception& e)
- {
- std::cerr << "* ERROR : "<<e.what()<<" (not in bbtk)"<<std::endl;
- if (mFileName.size()) {
- std::cerr << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
- std::cerr << "* LINE : "<<mLine.back()<<std::endl;
- }
- status = ERROR;
- }
- catch (...)
- {
- std::cerr << "* UNDEFINED ERROR (not a bbtk nor a std exception)"<<std::endl;
- if (mFileName.size()) {
- std::cerr << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
- std::cerr << "* LINE : "<<mLine.back()<<std::endl;
- }
- status = ERROR;
- }
-
+ CATCH_MACRO;
+
CloseAllFiles();
bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretFile(\""<<filename<<"\")"<<std::endl);
bbtkDecTab("Interpreter",9);
bool exm = mCommandLine;
mCommandLine = false;
- ExitStatus status = OK;
+ ExitStatus status = Interpreter_OK;
try
{
CloseCurrentFile();
}
}
- catch (QuitException e)
- {
- status = QUIT;
- }
- catch (bbtk::Exception e)
- {
- std::cerr << "* ERROR : "<<e.GetMessage()<<std::endl;
- if (mFileName.size())
- {
- std::cerr << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
- std::cerr << "* LINE : "<<mLine.back()<<std::endl;
- }
- status = ERROR;
- }
- catch (std::exception& e)
- {
- std::cerr << "* ERROR : "<<e.what()<<" (not in bbtk)"<<std::endl;
- if (mFileName.size())
- {
- std::cerr << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
- std::cerr << "* LINE : "<<mLine.back()<<std::endl;
- }
- status = ERROR;
- }
- catch (...)
- {
- std::cerr
- << "* UNDEFINED ERROR (not a bbtk nor a std exception)"<<std::endl;
- if (mFileName.size())
- {
- std::cerr << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
- std::cerr << "* LINE : "<<mLine.back()<<std::endl;
- }
- status = ERROR;
- }
+ CATCH_MACRO;
CloseAllFiles();
bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretBuffer()"<<std::endl);
/// Runs the interpretation of a command
Interpreter::ExitStatus Interpreter::InterpretLine( const std::string& line )
{
+printf("EED Interpreter::InterpretLine %s \n", line.c_str() );
bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretLine('"<<line<<"')"<<std::endl);
- ExitStatus status = OK;
+ ExitStatus status = Interpreter_OK;
try
{
bool insideComment = false;
InterpretLine(line, insideComment);
}
- catch (QuitException e)
+ CATCH_MACRO;
+ /*
+ catch (QuitException e)
{
- status = QUIT;
+ status = Interpreter_QUIT;
}
catch (bbtk::Exception e)
{
std::cerr << "* ERROR : "<<e.GetMessage()<<std::endl;
- status = ERROR;
+ status = Interpreter_ERROR;
}
catch (std::exception& e)
{
std::cerr << "* ERROR : "<<e.what()<<" (not in bbtk)"<<std::endl;
- status = ERROR;
+ status = Interpreter_ERROR;
}
catch (...)
{
std::cerr
<< "* UNDEFINED ERROR (not a bbtk nor a std exception)"<<std::endl;
- status = ERROR;
+ status = Interpreter_ERROR;
}
-
+ */
bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretLine()"
<<std::endl);
break;
case cDelete :
- // TO DO !!
- // mExecuter->Remove(words[1]);
+ mExecuter->Destroy(words[1]);
break;
case cConnect :
break;
case cPrint :
- Print(words[1]); /// \todo use generate command
+ mExecuter->Print(words[1]);
break;
case cExec :
else if (words[1]=="unfreeze")
mExecuter->SetNoExecMode(false);
else
- mExecuter->Update(words[1]);
+ mExecuter->Execute(words[1]);
break;
case cInput :
case cMessage :
if (words.size()<3)
{
- bbtk::MessageManager::PrintInfo();
+ mExecuter->HelpMessages();
}
else
{
- sscanf(words[2].c_str(),"%d",&level);
- bbtk::MessageManager::SetMessageLevel(words[1],level);
+ sscanf(words[2].c_str(),"%d",&level);
+ mExecuter->SetMessageLevel(words[1],level);
}
break;
break;
case cLoad:
- GetExecuter()->GetFactory()->LoadPackage(words[1]);
+ GetExecuter()->LoadPackage(words[1]);
break;
case cUnload:
- GetExecuter()->GetFactory()->UnLoadPackage(words[1]);
+ GetExecuter()->UnLoadPackage(words[1]);
break;
case cQuit :
delete mExecuter;
throw QuitException();
break;
-
+ /* obsolete
case cWorkspace :
if (words.size() == 2)
{
mExecuter->SetWorkspaceName(words[2]);
}
break;
-
+ */
default:
bbtkInternalError("should not reach here !!!");
}
//=======================================================================
- //=======================================================================
- // Replaces substrings "\\n" by a real carriage return "\n"
- void SubsBackslashN ( std::string& s )
- {
- std::string ss("\\n");
- std::string::size_type pos = 0;
- pos = s.find(ss,0);
- char* cr = "\n";
- while ( pos != std::string::npos )
- {
- s.replace(pos,2,cr,1);
- pos = s.find(ss, pos-1);
- }
- }
- //=======================================================================
-
+
//=======================================================================
/**
*
*/
+ /*
void Interpreter::Print( const std::string& str)
{
if (mExecuter->GetNoExecMode()) return;
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);
}
+*/
//=======================================================================
/**
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,
+ bbtkMessage("Interpreter",3,
"extract : pkgname [" << pkgname
<< "] upath [" << 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
+ // ==== "*" provided : load all scripts in given path
+ // relative (e.g. std/boxes/*) or absolute
+ if (pkgname == "*")
{
- int nbFiles = Utilities::Explore(upath, false, Filenames);
- nbBssFiles = 0;
- for (std::vector<std::string>::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;
-
- (*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<std::string>::iterator i;
- std::string fullDirectoryName;
- for (i=script_paths.begin();i!=script_paths.end();i++)// ==== relative name, iterate + load all .bbs files
- {
- 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);
+ int nbBssFiles;
+
+ 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,
+ script_paths.push_back( ConfigurationFile::GetInstance().Get_root_bbs_path() );
+ }
+ // ==== absolute path provided
+ else if (upath[0]=='/' || upath[1] == ':' )
+ {
+ if ( Utilities::IsDirectory( upath ) )
+ {
+ script_paths.push_back(upath);
+ }
+ else
+ {
+ bbtkError("'"<<upath<<"' : not a valid folder");
+ }
+ }
+ // ==== relative path provided : search all bbs path appended with
+ // 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);
+ }
+ }
+ }
+ // === search paths list complete : now explore it
+ if (script_paths.empty())
+ {
+ bbtkMessage("Interpreter",1,
+ "'"<<upath<<"' : No matching folder" << std::endl);
+ }
- // 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," [" <<fullDirectoryName
- <<"] : doesn't exist" <<std::endl);
- continue; // try next path
- } // if IsDirectory
- foundFile = true;
-
- Filenames.clear();
- int nbFiles = Utilities::Explore(fullDirectoryName, false, Filenames);
+ std::vector<std::string>::iterator i;
+ for (i=script_paths.begin();i!=script_paths.end();i++)// ==== relative name, iterate + load all .bbs files
+ {
+ bbtkMessage("Interpreter",1,
+ "--> Looking in '" << *i << "'" << std::endl);
+
+
+ Filenames.clear();
+ 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;
+
+ (*stream) << "include \"" << *j << "\"\n";
+ 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
+ return;
+ }
+ //=============== end pkgname=="*" ===========
- nbBssFiles = 0;
- for (std::vector<std::string>::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;
-
- (*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 *
// 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)
} // 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);
-
- // 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::endl);
- continue; // try next path
- }
- bbtkMessage("Interpreter",2,
- " [" <<fullPathScriptName
- <<"] : found" <<std::endl);
- foundFile = true;
- break; // a script was found; we stop iterating
-
- } //------------------ // end for ( package_paths.begin();i!=package_paths.end() )
+ {
+ 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,
+ " [" <<fullPathScriptName <<"] : doesn't exist"
+ <<std::endl);
+ continue; // try next path
+ }
+ bbtkMessage("Interpreter",2,
+ " [" <<fullPathScriptName
+ <<"] : found" <<std::endl);
+ foundFile = true;
+ break; // a script was found; we stop iterating
+
+ } //------------------ // end for ( package_paths.begin();i!=package_paths.end() )
}
-
+
if (!foundFile)
- {
- if (fullnameGiven)
- if(fullPathScriptName == "")
+ {
+ if (fullnameGiven)
+ if(fullPathScriptName == "")
bbtkError("Path ["<<upath<<"] doesn't exist");
- else
+ else
bbtkError("Script ["<<fullPathScriptName<<"] not found");
- else
+ else
bbtkError("No ["<<pkgname<<".bbs] script found");
- return;
- }
+ return;
+ }
else
LoadScript(fullPathScriptName,name);
-
+
return;
}
+ //=======================================================================
+ //=======================================================================
void Interpreter::SwitchToStream( std::stringstream* stream )
{
mFile.push_back(stream);
mIncludeFileName.push_back(buffer_name.str());
mLine.push_back(0);
}
+ //=======================================================================
//=======================================================================
mFileName.push_back(fullPathScriptName);
mIncludeFileName.push_back(includeScriptName);
mLine.push_back(0);
+
return;
}