-/*=========================================================================
-
+/*=========================================================================
Program: bbtk
- Module: $RCSfile: bbtkInterpreter.cxx,v $ $
+ Module: $RCSfile: bbtkInterpreter.cxx,v $
Language: C++
- Date: $Date: 2008/04/25 08:05:23 $
- Version: $Revision: 1.65 $
-
- 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: 2010/09/15 14:17:17 $
+ Version: $Revision: 1.89 $
=========================================================================*/
+
+/* ---------------------------------------------------------------------
+
+* 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 :
#include "bbtkMessageManager.h"
#include "bbtkConfigurationFile.h"
#include "bbtkUtilities.h"
+#include "bbtkAtomicBlackBox.h"
#include "bbtkWxBlackBox.h"
#include <sys/stat.h>
#include <algorithm>
//=======================================================================
Interpreter::Pointer Interpreter::New(const std::string& cpp_file)
{
- bbtkDebugMessage("Kernel",9,"Interpreter::New()"<<std::endl);
+ bbtkDebugMessage("kernel",9,"Interpreter::New('"<<cpp_file<<"')"<<std::endl);
return MakePointer(new Interpreter(cpp_file));
}
//=======================================================================
+ //=======================================================================
+ Interpreter::Pointer Interpreter::New(VirtualExec::Pointer e)
+ {
+ bbtkDebugMessage("kernel",9,"Interpreter::New(VirtualExec)"<<std::endl);
+ return MakePointer(new Interpreter(e));
+ }
+ //=======================================================================
+
//=======================================================================
Interpreter::Interpreter(const std::string& cpp_file)
- :
- mUser(0),
- mCommandLine(false),
- mThrow(false)
{
+ bbtkDebugMessage("object",2,"==> Interpreter("<<cpp_file<<")"<<std::endl);
+ Init(VirtualExec::Pointer(), cpp_file);
+ bbtkDebugMessage("object",2,"<== Interpreter("<<cpp_file<<")"<<std::endl);
+ }
+ //=======================================================================
+
+ //=======================================================================
+ Interpreter::Interpreter(VirtualExec::Pointer e)
+ {
+ bbtkDebugMessage("object",2,"==> Interpreter(VirtualExec)"<<std::endl);
+ Init(e,"");
+ bbtkDebugMessage("object",2,"<== Interpreter(VirtualExec)"<<std::endl);
+ }
+ //=======================================================================
+ //=======================================================================
+ void Interpreter::Init(VirtualExec::Pointer e, const std::string& cpp_file)
+ {
+ mUser = 0;
+ mCommandLine = false;
+ mThrow = false;
bufferNb =0;
bbtk::MessageManager::RegisterMessageType("echo","Level>0 : Prints the output of the 'print' 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()" <<std::endl);
-
- if (cpp_file.size()!=0)
+ if (e)
+ {
+ mVirtualExecuter = e;
+ }
+ else if (cpp_file.size()!=0)
{
mVirtualExecuter = boost::static_pointer_cast<VirtualExec>(bbtk::Transcriptor::New(cpp_file));
}
}
// Lock this pointer or will auto-destruct !!
- mVirtualExecuter->SetInterpreter(MakePointer(this,true));
+ if (!e) mVirtualExecuter->SetInterpreter(MakePointer(this,true));
// For the time being, comment out previous line, and
// uncomment next line to check Transcriptor
info.help = "Deletes the black box of name <box>";
mCommandDict[info.keyword] = info;
+ info.keyword = "clear";
+ info.argmin = 0;
+ info.argmax = 0;
+ info.code = cClear;
+ info.syntax = "clear";
+ info.help = "Clears the currently defined complex box (deletes all its boxes and connections)";
+ mCommandDict[info.keyword] = info;
+
+ info.keyword = "break";
+ info.argmin = 0;
+ info.argmax = 0;
+ info.code = cBreak;
+ info.syntax = "break";
+ info.help = "Breaks the current execution";
+ mCommandDict[info.keyword] = info;
+
info.keyword = "newgui";
info.argmin = 2;
info.argmax = 2;
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.argmin = 1;
info.argmax = 1;
info.code = cKind;
- info.syntax = "kind <ADAPTOR|DEFAULT_ADAPTOR|WIDGET_ADAPTOR|DEFAULT_WIDGET_ADAPTOR>";
+ info.syntax = "kind <ADAPTOR|DEFAULT_ADAPTOR|GUI|DEFAULT_GUI>";
info.help = "Sets the kind of the currently defined complex black box";
mCommandDict[info.keyword] = info;
info.argmax = 0;
info.code = cReset;
info.syntax = "reset";
- info.help = "Deletes all boxes and unloads all packages (bbi is reset to its start state)";
+ info.help = "Deletes all boxes and unloads all packages (reset to start state)";
mCommandDict[info.keyword] = info;
info.keyword = "author";
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 = cInclude;
info.syntax = "include <filename> [source]";
- info.help = "Includes the file <filename>.\n 'source' : If the keyword 'source' is provided then informs bbi that the included file is the source of the current box definition (Advanced; used to get the right 'Include' field in html doc of packages 'appli' scripts).";
+ info.help = "Includes the file <filename>.\n 'source' : If the keyword 'source' is provided then informs the interpreter that the included file is the source of the current box definition (Advanced; used to get the right 'Include' field in html doc of packages 'appli' scripts).";
mCommandDict[info.keyword] = info;
info.keyword = "quit";
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;
*/
- bbtkDebugDecTab("Interpreter",9);
+
}
//=======================================================================
*/
Interpreter::~Interpreter()
{
- bbtkDebugMessageInc("Interpreter",9,"==> Interpreter::~Interpreter()" <<std::endl);
+ bbtkDebugMessage("object",2,"==> ~Interpreter()" <<std::endl);
mVirtualExecuter = VirtualExec::Pointer();
- bbtkDebugMessageInc("Interpreter",9,"<== Interpreter::~Interpreter()" <<std::endl);
+ bbtkDebugMessage("object",2,"<== ~Interpreter()" <<std::endl);
}
//=======================================================================
- InterpreterError::InterpreterError( const std::string& message,
+ //=======================================================================
+ InterpreterException::InterpreterException( const std::string& message,
bool in_script_file,
const std::string& script_file,
int script_line
)
- : Exception("Interpreter",0,message),
+ : Exception("interpreter",0,message),
mInScriptFile(in_script_file),
mScriptFile(script_file),
mScriptLine(script_line)
{
}
- InterpreterError::InterpreterError( const Exception& excep,
+ //=======================================================================
+ //=======================================================================
+ InterpreterException::InterpreterException( const Exception& excep,
bool in_script_file,
const std::string& script_file,
int script_line
{
}
//=======================================================================
+
+
+ //=======================================================================
+ void Interpreter::CatchInterpreterException( const InterpreterException& e )
+ {
+ if (GetExecuter()->GetNoErrorMode())
+ {
+ bbtkWarning("ERROR :"<<e.GetErrorMessage()
+ <<" ("<<e.GetScriptFile()<<":"<<e.GetScriptLine()
+ <<" skipped");
+
+ return;
+ }
+ if (mThrow)
+ {
+ if (e.GetErrorMessage()!="break")
+ {
+ mStatus = Interpreter_ERROR;
+ CloseAllFiles();
+ }
+ throw InterpreterException(e);
+ }
+ else
+ {
+ std::stringstream mess;
+ mess << "* ERROR : "<<e.GetErrorMessage()<<std::endl;
+ if (e.IsInScriptFile())
+ {
+ mess << "* FILE : \""<<e.GetScriptFile()<<"\""<<std::endl;
+ mess << "* LINE : "<<e.GetScriptLine()<<std::endl;
+ }
+ CloseAllFiles();
+ std::cerr << mess.str();
+ }
+ }
+ //=======================================================================
+
+ //=======================================================================
void Interpreter::CatchBbtkException( const bbtk::Exception& e )
{
+ if (GetExecuter()->GetNoErrorMode())
+ {
+ std::string file("?");
+ int line = 0;
+ if (mFileName.size()) {
+ file = mFileName.back();
+ line = mLine.back();
+ }
+ bbtkWarning("ERROR '"<<e.GetErrorMessage()
+ <<"' ("<<file<<":"<<line<<") skipped");
+
+ return;
+ }
+ mStatus = Interpreter_ERROR;
if (mThrow)
{
bool in_script = false;
file = mFileName.back();
line = mLine.back();
}
- CloseAllFiles();
- throw InterpreterError(e,in_script,file,line);
+ if (e.GetErrorMessage()!="break")
+ CloseAllFiles();
+ throw InterpreterException(e,in_script,file,line);
}
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;
}
+ CloseAllFiles();
std::cerr << mess.str();
}
}
//=======================================================================
void Interpreter::CatchStdException( const std::exception& e )
{
+ if (GetExecuter()->GetNoErrorMode())
+ {
+ std::string file("?");
+ int line = 0;
+ if (mFileName.size()) {
+ file = mFileName.back();
+ line = mLine.back();
+ }
+ bbtkWarning("ERROR '"<<e.what()
+ <<"' ("<<file<<":"<<line<<") skipped");
+
+ return;
+ }
+ mStatus = Interpreter_ERROR;
if (mThrow)
{
bool in_script = false;
line = mLine.back();
}
CloseAllFiles();
- throw InterpreterError(e.what(),in_script,file,line);
+ throw InterpreterException(e.what(),in_script,file,line);
}
else
{
mess << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
mess << "* LINE : "<<mLine.back()<<std::endl;
}
+ CloseAllFiles();
std::cerr << mess.str();
}
}
//=======================================================================
void Interpreter::CatchUnknownException()
{
+ if (GetExecuter()->GetNoErrorMode())
+ {
+ std::string file("?");
+ int line = 0;
+ if (mFileName.size()) {
+ file = mFileName.back();
+ line = mLine.back();
+ }
+ bbtkWarning("UNDEFINED ERROR "
+ <<"("<<file<<":"<<line<<") skipped");
+ return;
+ }
+ mStatus = Interpreter_ERROR;
if (mThrow)
{
bool in_script = false;
line = mLine.back();
}
CloseAllFiles();
- throw InterpreterError("Unknown exception caught",
+ throw InterpreterException("Unknown exception caught",
in_script,file,line);
}
else
mess << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
mess << "* LINE : "<<mLine.back()<<std::endl;
}
+ CloseAllFiles();
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(); \
+
+#define CATCH_MACRO \
+ catch (InterpreterException e) \
+ { \
+ CatchInterpreterException(e); \
+ } \
+ catch (bbtk::Exception e) \
+ { \
+ CatchBbtkException(e); \
+ } \
+ catch (std::exception& e) \
+ { \
+ CatchStdException(e); \
+ } \
+ catch (...) \
+ { \
+ CatchUnknownException(); \
}
//=======================================================================
//=======================================================================
- /**
- *
- */
- 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);
+ bbtkDebugMessage("interpreter",4,"==> Interpreter::InterpretFile(\""<<filename<<"\")"<<std::endl);
bool exm = mCommandLine;
mCommandLine = false;
- ExitStatus status = Interpreter_OK;
-
try
{
- SwitchToFile(filename);
-
- bool insideComment = false; // for multiline comment
- while (mFile.size()>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(\""<<filename<<"\")"<<std::endl);
- bbtkDecTab("Interpreter",9);
+ bbtkDebugMessage("interpreter",4,
+ "<== Interpreter::InterpretFile(\""
+ <<filename<<"\")"<<std::endl);
+
mCommandLine = exm;
- return status;
+ return mStatus;
}
//=======================================================================
//=======================================================================
- /**
- *
- */
Interpreter::ExitStatus
Interpreter::InterpretBuffer( std::stringstream* buffer )
{
- bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretBuffer()"<<std::endl);
+ bbtkDebugMessage("interpreter",4,"==> Interpreter::InterpretBuffer()"<<std::endl);
bool exm = mCommandLine;
mCommandLine = false;
- ExitStatus status = Interpreter_OK;
-
try
{
+ mStatus = Interpreter_OK;
SwitchToStream(buffer);
- bool insideComment = false; // for multiline comment
- while (mFile.size()>0)
+ mInsideComment = false;
+ InterpretCurrentStreams();
+ }
+ CATCH_MACRO;
+
+ // CloseAllFiles();
+ bbtkDebugMessage("interpreter",4,"<== Interpreter::InterpretBuffer()"<<std::endl);
+
+
+ mCommandLine = exm;
+ return mStatus;
+ }
+ //=======================================================================
+
+ //=======================================================================
+ /// Interprets the currently open streams
+ Interpreter::ExitStatus Interpreter::InterpretCurrentStreams()
+ {
+ bbtkDebugMessage("interpreter",4,
+ "==> Interpreter::InterpretCurrentStreams()"<<std::endl);
+
+ while (mFile.size()>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()"<<std::endl);
- bbtkDecTab("Interpreter",9);
-
- mCommandLine = exm;
- return status;
+ bbtkDebugMessage("interpreter",4,
+ "<== Interpreter::InterpretCurrentStreams()"<<std::endl);
+
+ return mStatus;
}
//=======================================================================
/// Runs the interpretation of a command
Interpreter::ExitStatus Interpreter::InterpretLine( const std::string& line )
{
- bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretLine('"<<line<<"')"<<std::endl);
-
- ExitStatus status = Interpreter_OK;
+ bbtkDebugMessage("interpreter",5,"==> Interpreter::InterpretLine('"<<line<<"')"<<std::endl);
try
{
- bool insideComment = false;
- InterpretLine(line, insideComment);
+ mStatus = Interpreter_OK;
+ mInsideComment = false;
+//std::cout<<"JCP bbtkInterpreter.cxx Interpreter::InterpretLine("<<std::endl;
+ DoInterpretLine(line );
}
CATCH_MACRO;
-
-
- bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretLine()"
- <<std::endl);
- bbtkDecTab("Interpreter",9);
- return status;
+
+ bbtkDebugMessage("interpreter",5,"<== Interpreter::InterpretLine('"<<line<<"')"<<std::endl);
+
+ return mStatus;
}
+ //=======================================================================
+ void Interpreter::commandNew(std::string boxType, std::string boxName)
+ {
+ mVirtualExecuter->Create(boxType,boxName);
+ }
+
+ void Interpreter::commandDelete(std::string boxName)
+ {
+ mVirtualExecuter->Destroy(boxName);
+ }
- //=======================================================================
- /**
- *
- */
-void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
-{
- bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretLine(\""<<line<<"\")"<<std::endl);
- bbtkMessage("echo",2,line<<std::endl);
+ void Interpreter::commandConnection(std::string nodeFrom, std::string outputLabel, std::string nodeTo, std::string inputLabel)
+ {
+ mVirtualExecuter->Connect(nodeFrom,outputLabel,nodeTo,inputLabel);
+ }
+
+ void Interpreter::commandPackage(std::string packageName)
+ {
+ mVirtualExecuter->BeginPackage(packageName);
+ }
+
+ void Interpreter::commandEndPackage()
+ {
+ mVirtualExecuter->EndPackage();
+ }
+
+ void Interpreter::commandDefine(std::string name, std::string pack, std::string scriptfilename)
+ {
+ mVirtualExecuter->Define(name,pack,scriptfilename);
+ }
+
+ void Interpreter::commandEndDefine()
+ {
+ mVirtualExecuter->EndDefine();
+ }
+ void Interpreter::commandKind(std::string kind)
+ {
+ mVirtualExecuter->Kind(kind);
+ }
+
+ void Interpreter::commandPrint(std::string value)
+ {
+ mVirtualExecuter->Print(value);
+ }
+
+
+ void Interpreter::commandExec(std::string word)
+ {
+ 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(std::string name, std::string box, std::string input,std::string help)
+ {
+ mVirtualExecuter->DefineInput(name,box,input,help);
+ }
+
+ void Interpreter::commandOutput(std::string name, std::string box, std::string output,std::string help)
+ {
+ mVirtualExecuter->DefineOutput(name,box,output,help);
+ }
+
+ void Interpreter::commandSet(std::string box, std::string input, std::string value)
+ {
+ mVirtualExecuter->Set(box,input,value);
+ }
+
+ void Interpreter::commandAuthor(std::string author)
+ {
+ mVirtualExecuter->Author(author);
+ }
+
+ void Interpreter::commandCategory(std::string categorytype)
+ {
+ mVirtualExecuter->Category(categorytype);
+ }
+
+
+
+ void Interpreter::commandDescription(std::string description)
+ {
+ mVirtualExecuter->Description(description);
+ }
+
+
+ void Interpreter::commandClear()
+ {
+ mVirtualExecuter->Clear();
+ }
+
+ void Interpreter::commandInclude(std::string word, bool ok)
+ {
+ // 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(std::string packageName)
+ {
+ GetExecuter()->LoadPackage(packageName);
+ }
+
+ void Interpreter::commandUnload(std::string packageName)
+ {
+ GetExecuter()->UnLoadPackage(packageName);
+ }
+
+ void Interpreter::commandBreak()
+ {
+ /*
+ std::cout << "BreakException("
+ <<in_script<<","
+ <<file<<","
+ <<line<<")"<<std::endl;
+ */
+ bbtkError("break");//,in_script,file,line);
+ // throw BreakException(in_script,file,line);
+ }
+
+ void Interpreter::commandQuit()
+ {
+ bbtkError("quit");//,in_script,file,line);
+ //throw QuitException(in_script,file,line);
+ }
+
+ void Interpreter::commandMessage()
+ {
+ mVirtualExecuter->HelpMessages();
+ }
+
+//ups2 EED Borrame
+ void Interpreter::commandMessage(std::string kind, std::string levelstr)
+ {
+ int level=0;
+ sscanf(levelstr.c_str(),"%d",&level);
+ mVirtualExecuter->SetMessageLevel(kind,level);
+
+ }
+
+
+
+ //=======================================================================
+ void Interpreter::DoInterpretLine( const std::string& line )
+ {
+ bbtkDebugMessage("interpreter",6,"==> Interpreter::DoInterpretLine(\""
+ <<line<<"\")"<<std::endl);
std::vector<std::string> 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"<<std::endl);
+ bbtkDebugDecTab("interpreter",9);
+ bbtkMessage("interpreter",9,"Comment"<<std::endl);
return;
}
if (words[0][0]=='/' && words[0][1]=='*')
{
- bbtkDebugDecTab("Interpreter",9);
- bbtkMessage("Interpreter",9,"In multiline comment"<<std::endl);
- insideComment = true;
+ bbtkDebugDecTab("interpreter",9);
+ bbtkMessage("interpreter",9,"In multiline comment"<<std::endl);
+ mInsideComment = true;
return;
}
if (words[0][0]=='*' && words[0][1]=='/')
{
- bbtkDebugDecTab("Interpreter",9);
- bbtkMessage("Interpreter",9,"Out multiline comment"<<std::endl);
- if ( !insideComment ) {
- bbtkDebugDecTab("Interpreter",9);
- bbtkMessage("Interpreter",9,"Comment mismatch : '*/' with no matching '/*'"<<std::endl);
+ bbtkDebugDecTab("interpreter",9);
+ bbtkMessage("interpreter",9,"Out multiline comment"<<std::endl);
+ if ( !mInsideComment ) {
+ bbtkDebugDecTab("interpreter",9);
+ bbtkMessage("interpreter",9,"Comment mismatch : '*/' with no matching '/*'"<<std::endl);
}
- insideComment = false;
+ mInsideComment = false;
return;
}
- if (insideComment)
+ if (mInsideComment)
{
- bbtkDebugDecTab("Interpreter",9);
- bbtkMessage("Interpreter",9,"Multiline Comment"<<std::endl);
+ bbtkDebugDecTab("interpreter",9);
+ bbtkMessage("interpreter",9,"Multiline Comment"<<std::endl);
return;
}
// Command
CommandInfoType command;
InterpretCommand(words,command);
-
- bbtkDebugMessage("Interpreter",9,
+//std::cout<<"JCP bbtkInterpreter command.keyword ="<<command.keyword<<std::endl;
+ bbtkDebugMessage("interpreter",9,
"Command='"<<command.keyword
<<"' code="<<command.code<<std::endl);
- int level=0;
+
std::string left,right,left2,right2;
std::string filename;
+
+//ups1 EED borrame
+ // message command
+ if (command.code==cMessage)
+ {
+ if (words.size()<3)
+ {
+ commandMessage();
+//EED Borrame mVirtualExecuter->HelpMessages();
+ }
+ else
+ {
+ commandMessage(words[1],words[2]);
+//EED Borrame sscanf(words[2].c_str(),"%d",&level);
+//EED Borrame mVirtualExecuter->SetMessageLevel(words[1],level);
+ }
+ return;
+ }
+ else
+ {
+ bbtkMessage("echo",2,line<<std::endl);
+ }
+
+ // break and quit commands
+ if ((command.code==cBreak) || (command.code==cQuit))
+ {
+ 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();
+ }
+ if (command.code==cBreak)
+ {
+ /*
+ std::cout << "BreakException("
+ <<in_script<<","
+ <<file<<","
+ <<line<<")"<<std::endl;
+ */
+ commandBreak();
+//EED Borrame bbtkError("break");//,in_script,file,line);
+ // throw BreakException(in_script,file,line);
+ }
+ else
+ {
+ commandQuit();
+//EED Borrame bbtkError("quit");//,in_script,file,line);
+ //throw QuitException(in_script,file,line);
+ }
+ return;
+ }
+//std::cout<<" mVirtualExecuter->Create(words[1],words[2]); "<<line<<std::endl;
+ // other cammands
+
switch (command.code)
- {
+ {
case cNew :
- mVirtualExecuter->Create(words[1],words[2]);
+ commandNew(words[1],words[2]);
+//EED Borrame mVirtualExecuter->Create(words[1],words[2]);
break;
case cDelete :
- mVirtualExecuter->Destroy(words[1]);
+ commandDelete(words[1]);
+//EED Borrame mVirtualExecuter->Destroy(words[1]);
break;
case cConnect :
Utilities::SplitAroundFirstDot(words[1],left,right);
Utilities::SplitAroundFirstDot(words[2],left2,right2);
- mVirtualExecuter->Connect(left,right,left2,right2);
+ commandConnection(left,right,left2,right2);
+//EED Borrame mVirtualExecuter->Connect(left,right,left2,right2);
break;
case cPackage :
- mVirtualExecuter->BeginPackage(words[1]);
+ commandPackage(words[1]);
+//EED Borrame mVirtualExecuter->BeginPackage(words[1]);
break;
case cEndPackage :
- mVirtualExecuter->EndPackage();
+ commandEndPackage();
+//EED Borrame mVirtualExecuter->EndPackage();
break;
case cDefine :
if (mFileName.size()>0)
{
- filename = mIncludeFileName.back(); //Utilities::get_file_name(mFileName.back());
+//??? commandDefine(????);
+ filename = mFileName.back(); //mIncludeFileName.back(); //Utilities::get_file_name(mFileName.back());
}
if (words.size()==2)
{
- mVirtualExecuter->Define(words[1],"",filename);
+ commandDefine(words[1],"",filename);
+//EED Borrame mVirtualExecuter->Define(words[1],"",filename);
}
else
{
- mVirtualExecuter->Define(words[1],words[2],filename);
+ commandDefine(words[1],words[2],filename);
+//EED Borrame mVirtualExecuter->Define(words[1],words[2],filename);
}
break;
case cEndDefine :
- mVirtualExecuter->EndDefine();
+ commandEndDefine();
+//EED Borrame mVirtualExecuter->EndDefine();
break;
case cKind :
- mVirtualExecuter->Kind(words[1]);
+ commandKind(words[1]);
+//EED Borrame mVirtualExecuter->Kind(words[1]);
break;
case cPrint :
- mVirtualExecuter->Print(words[1]);
+ commandPrint(words[1]);
+//EED Borrame mVirtualExecuter->Print(words[1]);
break;
-
+
case cExec :
- if (words[1]=="freeze")
- mVirtualExecuter->SetNoExecMode(true);
- else if (words[1]=="unfreeze")
- mVirtualExecuter->SetNoExecMode(false);
- else
- mVirtualExecuter->Execute(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);
- mVirtualExecuter->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);
- mVirtualExecuter->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);
- mVirtualExecuter->Set(left,right,words[2]);
+ commandSet(left,right,words[2]);
+//EED Borrame mVirtualExecuter->Set(left,right,words[2]);
break;
case cAuthor :
- mVirtualExecuter->Author(words[1]);
+ commandAuthor(words[1]);
+//EED Borrame mVirtualExecuter->Author(words[1]);
break;
case cNewGUI :
- NewGUI(words[1],words[2]);
+ commandNewGUI(words[1],words[2]);
break;
case cCategory :
- mVirtualExecuter->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 :
- mVirtualExecuter->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)
- {
- mVirtualExecuter->HelpMessages();
- }
- else
- {
- sscanf(words[2].c_str(),"%d",&level);
- mVirtualExecuter->SetMessageLevel(words[1],level);
- }
- break;
case cGraph :
- Graph(words);
+ commandGraph(words);
break;
case cConfig :
- Config();
+ commandConfig();
break;
case cReset :
- 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()->LoadPackage(words[1]);
+ commandLoad( words[1] );
+//EED Borrame GetExecuter()->LoadPackage(words[1]);
break;
case cUnload:
- GetExecuter()->UnLoadPackage(words[1]);
- break;
-
- case cQuit :
- throw QuitException();
+ commandUnload( words[1] );
+//EED Borrame GetExecuter()->UnLoadPackage(words[1]);
break;
case cDebug :
- if (words.size()==2) Debug(words[1]);
- else Debug("");
+ if (words.size()==2) commandDebug(words[1]);
+ else commandDebug("");
break;
+
/* obsolete
case cWorkspace :
if (words.size() == 2)
bbtkInternalError("should not reach here !!!");
}
- bbtkDecTab("Interpreter",9);
-}
+ bbtkDebugMessage("interpreter",6,"<== Interpreter::DoInterpretLine(\""
+ <<line<<"\")"<<std::endl);
+
+ }
//=======================================================================
//=======================================================================
- /**
- *
- */
-void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>& tokens)
+ void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>& tokens)
{
- bbtkDebugMessageInc("Interpreter",9,"Interpreter::SplitLine(\""<<str<<"\")"<<std::endl);
+ bbtkDebugMessage("interpreter",9,"==> Interpreter::SplitLine(\""<<str<<"\")"<<std::endl);
std::string delimiters = "\"";
std::vector<std::string> quote;
++i;
if (i!=quote.end())
{
- // bbtkDebugMessage("Interpreter",0,"\""<<*i<<"\""<<std::endl);
+ // bbtkDebugMessage("interpreter",0,"\""<<*i<<"\""<<std::endl);
tokens.push_back(*i);
++i;
}
for (i=tokens.begin(); i!=tokens.end(); ++i)
{
- bbtkDebugMessage("Interpreter",9,"["<<*i<<"] ");
+ bbtkDebugMessage("interpreter",9,"--["<<*i<<"]"<<std::endl);
}
- bbtkDebugMessageCont("Interpreter",9,std::endl);
+ bbtkDebugMessage("interpreter",9,"<== Interpreter::SplitLine(\""<<str<<"\")"<<std::endl);
- bbtkDebugDecTab("Interpreter",9);
}
//=======================================================================
//=======================================================================
- void Interpreter::Reset()
+ void Interpreter::commandReset()
{
// Cannot close all files if the reset command is read from a file !
- // CloseAllFiles();
+ CloseAllFiles();
mFileNameHistory.clear();
this->mVirtualExecuter->Reset();
}
{
if (mVirtualExecuter->GetNoExecMode()) return;
- bbtkDebugMessageInc("Interpreter",9,"Interpreter::Print(\""<<str<<"\")"<<std::endl);
+ bbtkDebugMessageInc("interpreter",9,"Interpreter::Print(\""<<str<<"\")"<<std::endl);
// TO DO :
// InterpretLine ("load std")
std::cout << *i;
}
std::cout << std::endl;
- bbtkDebugDecTab("Interpreter",9);
+ bbtkDebugDecTab("interpreter",9);
}
*/
*/
// =========================================================================
- 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
// use ./directory/subdir/scrname.bbs
//
- bbtkDebugMessageInc("Interpreter",9,"Interpreter::SwitchToFile( \""
- <<name<<"\")"<<std::endl);
+ bbtkDebugMessage("interpreter",4,"==> Interpreter::SwitchToFile( \""
+ <<name<<"\")"<<std::endl);
std::vector<std::string> script_paths;
std::string fullPathScriptName; // full path script name
// 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);
std::string upath;
pkgname = Utilities::ExtractScriptName(name,upath);
- bbtkMessage("Interpreter",3,
- "extract : pkgname [" << pkgname
- << "] upath [" << upath << "]" << std::endl);
+ bbtkMessage("interpreter",3,
+ "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 "*"
// ==== 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() );
+ // bbtkMessage("interpreter",1,
+ // 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,
+ 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::endl);
- continue; // try next path
- }
- bbtkMessage("Interpreter",2,
- " [" <<fullPathScriptName
- <<"] : found" <<std::endl);
- foundFile = true;
- break; // a script was found; we stop iterating
-
+ std::string tfullPathScriptName = Utilities::MakePkgnameFromPath(path, name, false);
+//Addition JCP tfullPathScriptName.size()>=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,
+ " [" <<fullPathScriptName <<"] : does 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
+ }
+ 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
+ }
+ }
} //------------------ // 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;
}
//=======================================================================
void Interpreter::SwitchToStream( std::stringstream* stream )
{
- mFile.push_back(stream);
+ bbtkDebugMessage("interpreter",4,"==> Interpreter::SwitchToStream()"
+ <<std::endl);
+ mFile.push_back(stream);
std::ostringstream buffer_name;
bufferNb++;
buffer_name << "buffer_" ;
void Interpreter::LoadScript( std::string fullPathScriptName,
std::string includeScriptName)
{
- Utilities::replace( fullPathScriptName ,
+ bbtkDebugMessage("interpreter",4,"==> Interpreter::LoadScript("
+ <<fullPathScriptName<<")"
+ <<std::endl);
+
+ Utilities::replace( fullPathScriptName ,
INVALID_FILE_SEPARATOR , VALID_FILE_SEPARATOR);
if (find(mFileNameHistory.begin(),
return;
}
- bbtkMessage("Interpreter",1," -->[" << fullPathScriptName
+ bbtkMessage("interpreter",1," -->[" << fullPathScriptName
<< "] found" << std::endl);
mFile.push_back(s);
return;
}
+ //=======================================================================
//=======================================================================
- /**
- *
- */
void Interpreter::CloseCurrentFile()
{
- bbtkDebugMessage("Interpreter",9,"Interpreter::CloseCurrentFile()"
+ bbtkDebugMessage("interpreter",9,"==> Interpreter::CloseCurrentFile()"
<<std::endl);
if (mFile.size()==0)
{
- bbtkDebugMessage("Interpreter",9," -> no file left open"<<std::endl);
+ bbtkDebugMessage("interpreter",9," -> no file left open"<<std::endl);
return;
}
- bbtkDebugMessage("Interpreter",9," Closing file '"<<mFileName.back()<<"'"<<std::endl);
+ bbtkDebugMessage("interpreter",9," Closing file '"<<mFileName.back()<<"'"<<std::endl);
std::ifstream* file = dynamic_cast<std::ifstream*>(mFile.back());
if (file!=0) file->close();
mIncludeFileName.pop_back();
mLine.pop_back();
- bbtkDebugMessage("Interpreter",9," Remains "
+ bbtkDebugMessage("interpreter",9," Remains "
<<mFile.size()
<<" open"<<std::endl);
- bbtkDebugMessage("Interpreter",9,"EO Interpreter::CloseCurrentFile()"
+ bbtkDebugMessage("interpreter",9,"<== Interpreter::CloseCurrentFile()"
<<std::endl);
}
//=======================================================================
//=======================================================================
- /**
- *
- */
void Interpreter::CloseAllFiles()
{
- bbtkDebugMessage("Interpreter",9,"Interpreter::CloseAllFiles()"
+ bbtkDebugMessage("interpreter",9,"==> Interpreter::CloseAllFiles()"
<<std::endl);
while (mFile.size() != 0)
{
CloseCurrentFile();
}
- bbtkDebugMessage("Interpreter",9,"EO Interpreter::CloseAllFiles()"
+ bbtkDebugMessage("interpreter",9,"<== Interpreter::CloseAllFiles()"
<<std::endl);
}
//=======================================================================
//=======================================================================
- /**
- *
- */
void Interpreter::InterpretCommand( const std::vector<std::string>& words,
CommandInfoType& info )
{
- bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretCommand(...)"<<std::endl);
+ bbtkDebugMessage("interpreter",9,"==> Interpreter::InterpretCommand(...)"<<std::endl);
// searches the command keyword
CommandDictType::iterator c;
}
// 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");
}
-
+//std::cout<<"Interpreter::InterpretCommand( const std::vector<std::string>& words,"<<std::endl;
info = c->second;
- bbtkDecTab("Interpreter",9);
+
+ bbtkDebugMessage("interpreter",9,"<== Interpreter::InterpretCommand(...)"<<std::endl);
+
}
//=======================================================================
//=======================================================================
/// Displays help on all the commands
-void Interpreter::Help(const std::vector<std::string>& words)
+void Interpreter::commandHelp(const std::vector<std::string>& words)
{
unsigned int nbarg = words.size()-1;
{
if (words[1]=="packages")
{
- GetExecuter()->GetFactory()->PrintPackages(true);
+ GetExecuter()->GetFactory()->PrintHelpListPackages(true);
return;
}
try
{
try
{
- GetExecuter()->GetFactory()->HelpPackage(words[1]);
+ GetExecuter()->GetFactory()->PrintHelpPackage(words[1]);
if ( mUser != 0 )
{
std::string url =
try
{
std::string package;
- GetExecuter()->GetFactory()->HelpBlackBox(words[1],package);
+ GetExecuter()->GetFactory()->PrintHelpDescriptor(words[1],
+ package);
if ( mUser != 0 )
{
std::string url =
{
try
{
- GetExecuter()->ShowRelations(words[1],"0","9999");
+ GetExecuter()->PrintHelpBlackBox(words[1],"0","9999");
}
catch (bbtk::Exception h){
bbtkError("\""<<words[1].c_str()
{
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)
{
//===================================================================
/// Displays the Configuration
- void Interpreter::Config() const
+ void Interpreter::commandConfig() const
{
ConfigurationFile::GetInstance().GetHelp(1);
}
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)
//=======================================================================
void Interpreter::CommandLineInterpreter()
{
- bbtkDebugMessageInc("Interpreter",9,
+ bbtkDebugMessageInc("interpreter",9,
"Interpreter::CommandLineInterpreter()"<<std::endl);
#ifdef BBTK_USE_TERMIOS_BASED_PROMPT
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"<<std::endl);
+ bbtkMessage("interpreter",1,"Interpreter : Quit"<<std::endl);
again = false;
}
+ */
catch (bbtk::Exception e)
{
e.Print();
std::cout << "Good bye !" << std::endl;
- bbtkDebugDecTab("Interpreter",9);
+ bbtkDebugDecTab("interpreter",9);
}
//=======================================================================
-void Interpreter::Graph(const std::vector<std::string>& words)
+void Interpreter::commandGraph(const std::vector<std::string>& words)
{
std::string page;
bool system_display = true;
//=======================================================================
-void Interpreter::Index(const std::string& filename,
+void Interpreter::commandIndex(const std::string& filename,
const std::string& type)
{
Factory::IndexEntryType t;
//=======================================================================
-void Interpreter::NewGUI(const std::string& boxname,
+void Interpreter::commandNewGUI(const std::string& boxname,
const std::string& instanceName)
{
if (mRealExecuter.expired())
if (workspace==0)
{
delete s;
- bbtkError("Interpreter::CreateGUI : could not access the executer currently defined complex box");
+ bbtkError("interpreter::CreateGUI : could not access the executer currently defined complex box");
}
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();
// 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
+ if ( ( d->GetCreatorTypeInfo() == typeid(AtomicBlackBoxDescriptor)) )
+ continue;
+#endif
bool widok = true;
std::string widget,adaptor;
// try to find a widget adaptor
//==========================================================================
- void Interpreter::Debug(const std::string& name)
+ void Interpreter::commandDebug(const std::string& name)
{
if ((name.length()==2)&&(name[0]=='-'))
{
{
// int o = MessageManager::GetMessageLevel("debug");
// if (o<2) MessageManager::SetMessageLevel("debug",2);
- mVirtualExecuter->GetFactory()->CheckPackages();
+ mVirtualExecuter->GetFactory()->Check();
// MessageManager::SetMessageLevel("debug",o);
}
}
}
}
//==========================================================================
+
+ /*
+ //==========================================================================
+ // Adds a callback when 'break' command issued
+ void Interpreter::AddBreakObserver( BreakCallbackType c )
+ {
+ mBreakSignal.connect(c);
+ }
+ //==========================================================================
+ */
+
//==========================================================================
std::string Interpreter::GetObjectName() const
{