Program: bbtk
Module: $RCSfile: bbtkInterpreter.cxx,v $ $
Language: C++
- Date: $Date: 2008/02/06 09:27:52 $
- Version: $Revision: 1.26 $
+ Date: $Date: 2008/02/21 07:30:20 $
+ Version: $Revision: 1.36 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
=========================================================================*/
/**
* \file
- * \brief class Interpreter :
+ * \brief class Interpreter :
*/
-#include "bbtkInterpreter.h"
+#include "bbtkInterpreter.h"
#include "bbtkMessageManager.h"
#include "bbtkConfigurationFile.h"
#include "bbtkWxConsole.h"
#include "bbtkUtilities.h"
#include <sys/stat.h>
+#include <algorithm>
#ifdef CMAKE_HAVE_TERMIOS_H
#include <termios.h>
#define BBTK_USE_TERMIOS_BASED_PROMPT
//=======================================================================
/**
- *
+ *
*/
Interpreter::Interpreter()
:
mGlobalInterpreter = this;
- // mFactory = new bbtk::Factory();
mExecuter = new bbtk::Executer();
- //mExecuter->SetFactory(mFactory);
+
+ // For the time being, comment out previous line, and
+ // uncomment next line to check Transcriptor
+
+ // mExecuter = new bbtk::Transcriptor("GeneratedProgram.txt");
// Builds the commands dict
CommandInfoType info;
info.argmax = 2;
info.code = cInclude;
info.syntax = "include <filename> [source]";
- info.help = "Includes the file <filename>.\n Advanced (used to get the right 'Include' field in doc of packages appli) : If the keyword 'source' is provided then informs bbi that the included file is the source of the current box definition.";
+ 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).";
mCommandDict[info.category] = info;
info.category = "quit";
*
*/
void Interpreter::InterpretFile( const std::string& filename,
- bool use_configuration_file)
+ bool use_configuration_file)
{
bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretFile(\""<<filename<<"\")"<<std::endl);
case cNew :
mExecuter->Create(words[1],words[2]);
break;
-
+
case cDelete :
// TO DO !!
// mExecuter->Remove(words[1]);
break;
-
+
case cConnect :
Utilities::SplitAroundFirstDot(words[1],left,right);
Utilities::SplitAroundFirstDot(words[2],left2,right2);
mExecuter->Connect(left,right,left2,right2);
break;
-
+
case cPackage :
mExecuter->BeginPackage(words[1]);
break;
case cEndPackage :
mExecuter->EndPackage();
break;
-
+
case cDefine :
if (mFileName.size()>0)
{
{
mExecuter->Define(words[1],"",filename);
}
- else
+ else
{
mExecuter->Define(words[1],words[2],filename);
}
break;
-
+
case cEndDefine :
mExecuter->EndDefine();
break;
-
+
case cPrint :
Print(words[1]); /// \todo use mExecuter
break;
mExecuter->SetNoExecMode(true);
else if (words[1]=="unfreeze")
mExecuter->SetNoExecMode(false);
- else
+ else
mExecuter->Update(words[1]);
break;
-
+
case cInput :
Utilities::SplitAroundFirstDot(words[2],left,right);
mExecuter->DefineInput(words[1],left,right,words[3]);
break;
-
+
case cOutput :
Utilities::SplitAroundFirstDot(words[2],left,right);
mExecuter->DefineOutput(words[1],left,right,words[3]);
break;
-
+
case cSet :
Utilities::SplitAroundFirstDot(words[1],left,right);
mExecuter->Set(left,right,words[2]);
break;
-
+
case cAuthor :
mExecuter->Author(words[1]);
break;
- case cCategory :
- mExecuter->Category(words[1]);
- break;
-
- case cIndex :
- if (words.size()==1)
- Index("tmp_index.html");
- else if (words.size()==2)
- Index(words[1]);
- else if (words.size()==3)
- Index(words[1],words[2]);
- break;
- case cDescription :
- mExecuter->Description(words[1]);
+ case cCategory :
+ mExecuter->Category(words[1]);
break;
-
+
+ case cIndex :
+ if (words.size()==1)
+ Index("tmp_index.html");
+ else if (words.size()==2)
+ Index(words[1]);
+ else if (words.size()==3)
+ Index(words[1],words[2]);
+ break;
+
+ case cDescription :
+ mExecuter->Description(words[1]);
+ break;
+
case cHelp :
Help(words);
break;
-
+
case cMessage :
- if (words.size()<3)
+ if (words.size()<3)
{
- bbtk::MessageManager::PrintInfo();
+ bbtk::MessageManager::PrintInfo();
}
- else
+ else
{
sscanf(words[2].c_str(),"%d",&level);
bbtk::MessageManager::SetMessageLevel(words[1],level);
}
break;
-
- case cGraph :
+
+ case cGraph :
Graph(words);
break;
-
+
case cConfig :
- Config();
+ Config();
break;
-
+
case cReset : // EED
this->mExecuter->Reset();
break;
-
+
case cInclude :
- if (mCommandLine)
+ if (mCommandLine)
{
InterpretFile(words[1], true ); // true : better pass use_config_file
}
- else
+ else
{
SwitchToFile(words[1], true ); // true : better pass use_config_file
}
this->mExecuter->SetCurrentFileName(words[1]);
}
break;
-
+
case cLoad:
LoadPackage(words[1], true ); // true : better pass use_config_file
break;
-
+
case cUnload:
UnLoadPackage(words[1]);
break;
-
+
case cQuit :
+ delete mExecuter;
throw QuitException();
break;
-
- case cWorkspace :
+
+ case cWorkspace :
if (words.size() == 2)
{
if (words[1]=="freeze") mExecuter->SetNoExecMode(true);
else if (words[1]=="unfreeze") mExecuter->SetNoExecMode(false);
}
- else
+ else
{
mExecuter->SetWorkspaceName(words[2]);
}
default:
bbtkInternalError("should not reach here !!!");
}
-
+
bbtkDecTab("Interpreter",9);
}
//=======================================================================
//=======================================================================
/**
- *
+ *
*/
void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>& tokens)
{
bbtkDebugMessageInc("Interpreter",9,"Interpreter::SplitLine(\""<<str<<"\")"<<std::endl);
-
+
std::string delimiters = "\"";
std::vector<std::string> quote;
Utilities::SplitString(str,delimiters,quote);
}
bbtkDebugMessageCont("Interpreter",9,std::endl);
- bbtkDebugDecTab("Interpreter",9);
+ bbtkDebugDecTab("Interpreter",9);
}
//=======================================================================
{
s.replace(pos,2,cr,1);
pos = s.find(ss, pos-1);
- }
+ }
}
//=======================================================================
//=======================================================================
/**
- *
+ *
*/
void Interpreter::Print( const std::string& str)
{
std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
bool is_text = true;
if (lastPos>0) is_text = false;
-
+
// Find first delimiter.
std::string::size_type pos = str.find_first_of(delimiters, lastPos);
-
+
while (std::string::npos != pos || std::string::npos != lastPos)
{
if (is_text)
std::cout << *i;
}
std::cout << std::endl;
- bbtkDebugDecTab("Interpreter",9);
+ bbtkDebugDecTab("Interpreter",9);
}
//=======================================================================
/**
- *
+ *
*/
// ===================================================================================
//
// use ./directory/subdir/scrname.bbs
//
-
+
bbtkDebugMessageInc("Interpreter",9,"Interpreter::SwitchToFile( \""
<<name<<"\")"<<std::endl);
std::string fullPathScriptName; // full path script name
std::string pkgname; // e.g. <scriptname>.bbs
std::vector<std::string> Filenames;
-
+
if (use_configuration_file)
{
// The following is *NOT* a debug time message :
// It's a user intended message.
// Please don't remove it.
bbtkMessage("Interpreter",1,
- "look for : [" << name
+ "look for : [" << name
<< "] (use_configuration_file == TRUE)" << std::endl);
script_paths = ConfigurationFile::GetInstance().Get_bbs_paths();
}
bbtkMessage("Interpreter",2,
"WARNING : No '.bbs' file found in ["
<< upath << "]" << std::endl);
-
return;
}
-
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
+ for (i=script_paths.begin();i!=script_paths.end();i++)// ==== relative name, iterate + load all .bbs files
{
path = *i;
fullDirectoryName = Utilities::MakePkgnameFromPath(path, upath, false);
- // Check if library exists
- if ( ! Utilities::IsDirectory(fullDirectoryName) )
+ //EED 18 Fev 2008
+ // 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.
nbBssFiles = 0;
for (std::vector<std::string>::iterator i = Filenames.begin(); i!= Filenames.end(); ++i)
{
-
if ((*i).substr((*i).size()-4, 4) != ".bbs")
continue; // ignore non .bbs files
LoadScript(*i,name);
bbtkMessage("Interpreter",1,
"WARNING : No '.bbs' file found in ["
<< fullDirectoryName << "]" << std::endl);
-
+
//break; // a directory was found; we stop iterating
// LG : No! We want all files included !
}
// ===========================================================check user supplied location
fullnameGiven = true;
-
fullPathScriptName = Utilities::ExpandLibName(name, false);
// allow user to always forget ".bbs"
}
bbtkMessage("Interpreter",2,
" [" <<fullPathScriptName
- <<"] : found" <<std::endl);
+ <<"] : found" <<std::endl);
foundFile = true;
break; // a script was found; we stop iterating
bbtkError("Script ["<<fullPathScriptName<<"] not found");
else
bbtkError("No ["<<pkgname<<".bbs] script found");
- return;
+ return;
}
else
LoadScript(fullPathScriptName,name);
return;
- }
-
+ }
+
//=======================================================================
return;
}
- std::ifstream* s;
+ std::ifstream* s;
s = new std::ifstream;
s->open(fullPathScriptName.c_str());
if (!s->good())
{
bbtkError("Could not open file ["<<fullPathScriptName<<"]");
- return;
+ return;
}
-
+
bbtkMessage("Interpreter",1," -->[" << fullPathScriptName
<< "] found" << std::endl);
mFileName.push_back(fullPathScriptName);
mIncludeFileName.push_back(includeScriptName);
mLine.push_back(0);
- return;
+ return;
}
//=======================================================================
{
bbtkDebugMessage("Interpreter",9,"Interpreter::CloseCurrentFile()"
<<std::endl);
-
- if (mFile.size()==0)
+
+ if (mFile.size()==0)
{
bbtkDebugMessage("Interpreter",9," -> no file left open"<<std::endl);
return;
mFile.pop_back();
bbtkDebugMessage("Interpreter",9,
" Closing file '"<<mFileName.back()<<"'"<<std::endl);
-
+
mFileName.pop_back();
mIncludeFileName.pop_back();
mLine.pop_back();
{
bbtkDebugMessage("Interpreter",9,"Interpreter::CloseAllFiles()"
<<std::endl);
-
+
while (mFile.size() != 0)
{
mFile.back()->close();
CommandInfoType& info )
{
bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretCommand(...)"<<std::endl);
-
+
// searches the command category
CommandDictType::iterator c;
c = mCommandDict.find(words[0]);
void Interpreter::Help(const std::vector<std::string>& words)
{
unsigned int nbarg = words.size()-1;
-
+
if (nbarg==0)
{
HelpCommands();
try
{
HelpPackage(words[1]);
+#ifdef _USE_WXWIDGETS_
+ if ( WxConsole::GetInstance() != 0 )
+ {
+ std::string url =
+ ConfigurationFile::GetInstance().Get_doc_path();
+ url += "/bbdoc/" + words[1] + "/index.html";
+ if (Utilities::FileExists(url))
+ {
+ WxConsole::GetInstance()->ShowHtmlPage(url);
+ }
+ }
+#endif
}
catch (bbtk::Exception f)
{
try
{
- HelpBlackBox(words[1]);
- }
- catch (bbtk::Exception g)
- {
- try
- {
- this->mExecuter->ShowRelations(words[1],"0","9999");
- }
- catch (bbtk::Exception h){
- bbtkError("\""<<words[1].c_str()
- <<"\" is not a known command, package, black box type or black box name");
- }
- }
+ std::string package;
+ HelpBlackBox(words[1],package);
+#ifdef _USE_WXWIDGETS_
+ if ( WxConsole::GetInstance() != 0 )
+ {
+ std::string url =
+ ConfigurationFile::GetInstance().Get_doc_path();
+ url += "/bbdoc/" + package + "/index.html";
+ if (Utilities::FileExists(url))
+ {
+ url += "#" + words[1];
+ WxConsole::GetInstance()->ShowHtmlPage(url);
+ }
+ }
+#endif
+ }
+ catch (bbtk::Exception g)
+ {
+ try
+ {
+ this->mExecuter->ShowRelations(words[1],"0","9999");
+ }
+ catch (bbtk::Exception h){
+ bbtkError("\""<<words[1].c_str()
+ <<"\" is not a known command, package, black box type or black box name");
+ }
+ }
}
- }
+ }
}
else if (nbarg==2)
{
/// Displays the Configuration
void Interpreter::Config() const
{
- bbtkDebugMessageInc("Kernel",9,"Factory::Config"<<std::endl);
-
- ConfigurationFile cf = ConfigurationFile::GetInstance();
-
- const std::string config_xml_full_path = cf.Get_config_xml_full_path();
- const std::string description = cf.Get_description();
- const std::string url = cf.Get_url();
- const std::string data_path = cf.Get_data_path();
- const std::string default_doc_tmp = cf.Get_default_doc_tmp();
- const std::string file_separator = cf.Get_file_separator();
- const std::vector<std::string>bbs_paths = cf.Get_bbs_paths();
- const std::vector<std::string>package_paths = cf.Get_package_paths();
-
- bbtkMessage("Help",1, "=============" << std::endl);
- bbtkMessage("Help",1, "Configuration" << std::endl);
- bbtkMessage("Help",1, "=============" << std::endl);
- bbtkMessage("Help",1, "bbtk_config.xml : [" << config_xml_full_path << "]" << std::endl);
- bbtkMessage("Help",1, "Documentation Url : [" << url << "]" << std::endl);
- bbtkMessage("Help",1, "Data Path : [" << data_path << "]" << std::endl);
- bbtkMessage("Help",1, "Default Doc_tmp : [" << default_doc_tmp << "]" << std::endl);
- bbtkMessage("Help",1, "File Separator : [" << file_separator << "]" << std::endl);
-
- std::vector<std::string>::const_iterator i;
-
- bbtkMessage("Help",1, "BBS Paths " << std::endl);
- for (i = bbs_paths.begin(); i!=bbs_paths.end(); ++i )
- {
- bbtkMessage("Help",1,"--- ["<<*i<<"]"<<std::endl);
- }
-
- bbtkMessage("Help",1, "PACKAGE Paths : " << std::endl);
- for (i = package_paths.begin(); i!=package_paths.end(); ++i )
- {
- bbtkMessage("Help",1,"--- ["<<*i<<"]"<<std::endl);
- }
-
- bbtkDebugDecTab("Kernel",9);
+ ConfigurationFile::GetInstance().GetHelp(1);
}
+ //===================================================================
//=======================================================================
/// Displays help on all the commands
std::cout << " " << i->first << std::endl;
// std::cout << " usage : " << i->second.syntax << std::endl;
// std::cout << " " << i->second.help << std::endl;
-
+
}
}
//=======================================================================
// ++i) {
std::cout << " usage : " << c->second.syntax << std::endl;
std::cout << " " << c->second.help << std::endl;
-
+
}
//=======================================================================
//=======================================================================
-
+
//=======================================================================
#ifdef BBTK_USE_TERMIOS_BASED_PROMPT
{
int c;
int ind=0;
-
+
int MAX_LINE_SIZE = 160;
int MAX_HISTORY_SIZE = 100;
-
+
char* newline = new char[MAX_LINE_SIZE];
memset(newline,0,MAX_LINE_SIZE);
char* histline = new char[MAX_LINE_SIZE];
memset(histline,0,MAX_LINE_SIZE);
-
+
char* line = newline;
int hist = mHistory.size();
-
-
+
write(1,"> ",2);
while(1)
{
{
bbtkDebugMessageInc("Interpreter",9,
"Interpreter::CommandLineInterpreter()"<<std::endl);
-
+
#ifdef BBTK_USE_TERMIOS_BASED_PROMPT
// Initialise the tty in non canonical mode with no echo
// oter remembers the previous settings to restore them after
}
}
while (again);
-
+
#ifdef BBTK_USE_TERMIOS_BASED_PROMPT
tcsetattr(0,TCSANOW,&oter);
#endif
-
+
std::cout << "Good bye !" << std::endl;
-
+
bbtkDebugDecTab("Interpreter",9);
}