Program: bbtk
Module: $RCSfile: bbtkInterpreter.cxx,v $ $
Language: C++
- Date: $Date: 2008/01/23 07:51:51 $
- Version: $Revision: 1.3 $
+ Date: $Date: 2008/01/29 14:31:02 $
+ Version: $Revision: 1.13 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
#define BBTK_USE_TERMIOS_BASED_PROMPT
#endif
+#include <string>
namespace bbtk
{
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.";
mCommandDict[info.keyword] = info;
+ info.keyword = "package";
+ info.argmin = 1;
+ info.argmax = 1;
+ info.code = cPackage;
+ info.syntax = "package <name>";
+ info.help = "Begins the definition of a package.";
+ mCommandDict[info.keyword] = info;
+
+ info.keyword = "endpackage";
+ info.argmin = 0;
+ info.argmax = 0;
+ info.code = cEndPackage;
+ info.syntax = "endpackage";
+ info.help = "Ends the definition of a package.";
+ mCommandDict[info.keyword] = info;
+
info.keyword = "define";
info.argmin = 1;
info.argmax = 2;
std::cout << "* LINE : "<<mLine.back()<<std::endl;
}
}
-
+
CloseAllFiles();
bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretFile(\""<<filename<<"\")"<<std::endl);
bbtkDecTab("Interpreter",9);
std::vector<std::string> words;
SplitLine(line,words);
-
+
// Empty line
if (words.size()<1)
{
bbtkMessage("Interpreter",9,"Multiline Comment"<<std::endl);
return;
}
-
+
// Command
CommandInfoType command;
InterpretCommand(words,command);
switch (command.code)
{
case cNew :
- mExecuter->Create(words[1],words[2]);
- break;
+ mExecuter->Create(words[1],words[2]);
+ break;
case cDelete :
- // TO DO !!
- // mExecuter->Remove(words[1]);
- break;
+ // 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;
+ 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)
- {
- filename = Utilities::get_file_name(mFileName.back());
- }
- if (words.size()==2)
- {
- mExecuter->Define(words[1],"user",filename);
- }
- else
- {
- mExecuter->Define(words[1],words[2],filename);
- }
- break;
+ if (mFileName.size()>0)
+ {
+ filename = Utilities::get_file_name(mFileName.back());
+ }
+ if (words.size()==2)
+ {
+ mExecuter->Define(words[1],"",filename);
+ }
+ else
+ {
+ mExecuter->Define(words[1],words[2],filename);
+ }
+ break;
case cEndDefine :
- mExecuter->EndDefine();
- break;
+ mExecuter->EndDefine();
+ break;
case cPrint :
- Print(words[1]); /// \todo use mExecuter
- break;
+ Print(words[1]); /// \todo use mExecuter
+ break;
case cExec :
- if (words[1]=="freeze")
- mExecuter->SetNoExecMode(true);
- else if (words[1]=="unfreeze")
- mExecuter->SetNoExecMode(false);
- else
- mExecuter->Update(words[1]);
- break;
+ if (words[1]=="freeze")
+ mExecuter->SetNoExecMode(true);
+ else if (words[1]=="unfreeze")
+ mExecuter->SetNoExecMode(false);
+ else
+ mExecuter->Update(words[1]);
+ break;
case cInput :
- Utilities::SplitAroundFirstDot(words[2],left,right);
- mExecuter->DefineInput(words[1],left,right,words[3]);
- break;
+ 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;
+ 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;
+ Utilities::SplitAroundFirstDot(words[1],left,right);
+ mExecuter->Set(left,right,words[2]);
+ break;
case cAuthor :
- mExecuter->Author(words[1]);
- break;
+ mExecuter->Author(words[1]);
+ break;
case cDescription :
- mExecuter->Description(words[1]);
- break;
+ mExecuter->Description(words[1]);
+ break;
case cHelp :
- Help(words);
- break;
+ Help(words);
+ break;
case cMessage :
- if (words.size()<3)
- {
+ if (words.size()<3)
+ {
bbtk::MessageManager::PrintInfo();
- }
- else
- {
+ }
+ else
+ {
sscanf(words[2].c_str(),"%d",&level);
bbtk::MessageManager::SetMessageLevel(words[1],level);
- }
- break;
+ }
+ break;
case cGraph :
- Graph(words);
- break;
+ Graph(words);
+ break;
case cConfig :
- if (words.size()>1) // any param for config means verbose = true
- verbose = true;
- else
- verbose = false;
- Config(verbose);
- break;
+ if (words.size()>1) // any param for config means verbose = true
+ verbose = true;
+ else
+ verbose = false;
+ Config(verbose);
+ break;
case cReset : // EED
- this->mExecuter->Reset();
- break;
+ this->mExecuter->Reset();
+ break;
case cInclude :
- if (mCommandLine)
- {
+ if (mCommandLine)
+ {
InterpretFile(words[1], true, verbose); // true : better pass use_config_file
- }
- else
- {
+ }
+ else
+ {
SwitchToFile(words[1], true, verbose); // true : better pass use_config_file
- }
- break;
+ }
+ break;
case cLoad:
- LoadPackage(words[1], true, verbose); // true : better pass use_config_file
- break;
+ LoadPackage(words[1], true, verbose); // true : better pass use_config_file
+ break;
case cUnload:
- UnLoadPackage(words[1]);
- break;
+ UnLoadPackage(words[1]);
+ break;
case cQuit :
- throw QuitException();
- break;
+ throw QuitException();
+ break;
- case cWorkspace :
- if (words.size() == 2)
- {
- if (words[1]=="freeze") mExecuter->SetNoExecMode(true);
- else if (words[1]=="unfreeze") mExecuter->SetNoExecMode(false);
- }
- else
- {
- mExecuter->SetWorkspaceName(words[2]);
- }
- break;
+ case cWorkspace :
+ if (words.size() == 2)
+ {
+ if (words[1]=="freeze") mExecuter->SetNoExecMode(true);
+ else if (words[1]=="unfreeze") mExecuter->SetNoExecMode(false);
+ }
+ else
+ {
+ mExecuter->SetWorkspaceName(words[2]);
+ }
+ break;
default:
- bbtkInternalError("should not reach here !!!");
+ bbtkInternalError("should not reach here !!!");
}
bbtkDecTab("Interpreter",9);
// ===================================================================================
-
void Interpreter::SwitchToFile( const std::string& name,
bool use_configuration_file, bool verbose)
{
+ // Note : in the following :
+ // name : the user supplied name
+ // - abreviated name e.g. scr scr.bbs
+ // - relative full name e.g. ./scr.bbs ../../scr.bbs
+ // - absolute full name e.g. /home/usrname/proj/dir/scr.bbs
+ // same for Windows, with c:, d: ...
+ //
+ // expression like directory/subdir/scrname.bbs is FORBIDDEN (*)
+ // use ./directory/subdir/scrname.bbs
+ //
+ // (*) except when using packagename/boxes/*
+
bbtkDebugMessageInc("Interpreter",9,"Interpreter::SwitchToFile( \""
<<name<<"\")"<<std::endl);
+// to be remove in final version
+// use : Config v
+verbose = true;
std::vector<std::string> script_paths;
- std::string libname; // full path library name
- std::string pkgname; // e.g. <scriptname>.bbs
-
- pkgname = Utilities::ExtractScriptName(name);
+ std::string fullPathScriptName; // full path script name
+ std::string pkgname; // e.g. <scriptname>.bbs
if (use_configuration_file)
{
+ // The following is *NOT* a debug time message :
+ // It's a user intended message.
+ // Please don't remove it.
if (verbose)
std::cout << "look for : [" << name << "] (use_configuration_file == TRUE)" << std::endl;
script_paths = ConfigurationFile::GetInstance().Get_bbs_paths();
}
-
+ std::string upath;
+ pkgname = Utilities::ExtractScriptName(name,upath);
+
bool fullnameGiven = false;
bool foundFile = false;
- std::string::size_type slash_position = name.find_last_of("/\\");
-
- if (slash_position != std::string::npos)
+
+ if(pkgname == "*") // =========================================== load all boxes (e.g. std/boxes/*)
{
- fullnameGiven = true;
- libname = Utilities::ExpandLibName(name, verbose);
- if (libname != "") {
- if ( Utilities::FileExists(libname))
+ std::string path;
+ std::vector<std::string>::iterator i;
+ std::string fullDirectoryName;
+ 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;
+ }
+
+ fullDirectoryName = Utilities::MakePkgnameFromPath(path, upath, false);
+//std::cout <<"fullpath [" << fullDirectoryName << "]" <<std::endl;
+ // Check if library exists
+ if ( ! Utilities::IsDirectory(fullDirectoryName) )
{
- foundFile = true;
+ // The following is *NOT* a debug time message :
+ // It's a user intended message.
+ // Please don't remove it.
+ if (verbose)
+ std::cout <<" [" <<fullDirectoryName <<"] : doesn't exist" <<std::endl;
+ continue; // try next path
+ }
+ foundFile = true;
+
+ std::vector<std::string> Filenames;
+ int nbFiles = Utilities::Explore(fullDirectoryName, false, Filenames);
+// std::cout << "=================nbFiles " << nbFiles << std::endl;
+ int 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);
+ nbBssFiles++;
}
+ if (nbBssFiles==0)
+ if (verbose)
+ std::cout << "WARNING : No '.bbs' file found in [" << fullDirectoryName << "]" << std::endl;
+
+ break; // a directory was found; we stop iterating
+ }
+ return;
+ }
+
+ std::string::size_type slash_position = name.find_last_of("/\\");
+
+ // 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
+ // WARNING : starting from current local directory : ./whatYouWant (./ mandatory!)
+
+ // if (slash_position != std::string::npos)
+ if (name[0]=='/' || name[1] == ':' || name[0]=='.') // absolute path (linux/windows) or relative path
+ {
+
+ // ===========================================================check user supplied location
+ fullnameGiven = true;
+
+ fullPathScriptName = Utilities::ExpandLibName(name, verbose);
+
+ // allow user to always forget ".bbs"
+ int l = fullPathScriptName.size();
+
+ if (l!=0) {
+
+ if (l>4)
+ {
+ if (fullPathScriptName.substr(l-4, 4) != ".bbs")
+ {
+ fullPathScriptName = fullPathScriptName + ".bbs";
+ }
+ }
+ else
+ {
+ fullPathScriptName = fullPathScriptName + ".bbs";
}
+
+ if ( Utilities::FileExists(fullPathScriptName))
+ {
+ foundFile = true;
+ }
+
+ } // endif l != 0
}
- else // ----------------------- iterate on the paths
- {
- std::string path;
+ else
+
+ // =============================================================== iterate on the paths
+ {
+ std::string path;
std::vector<std::string>::iterator i;
for (i=script_paths.begin();i!=script_paths.end();++i)
{
- path = *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);
+ std::string cwd(currentDir);
path = currentDir;
}
- libname = Utilities::MakePkgnameFromPath(path, pkgname);
+ // fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true); //pkgname);
- // Check if library exists
- if ( ! Utilities::FileExists(libname) )
+ fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true);
+//std::cout << "FULL PATH = "<<fullPathScriptName<<std::endl;
+
+ // 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.
if (verbose)
- std::cout <<" [" <<libname <<"] : doesn't exist" <<std::endl;
- continue; // try next path
+ std::cout <<" [" <<fullPathScriptName <<"] : doesn't exist" <<std::endl;
+ continue; // try next path
}
+ if (verbose)
+ std::cout <<" [" <<fullPathScriptName <<"] : found" <<std::endl;
foundFile = true;
break; // a script was found; we stop iterating
} //------------------ // end for ( package_paths.begin();i!=package_paths.end() )
}
- std::ifstream* s;
-
if (!foundFile)
{
if (fullnameGiven)
- if(libname == "")
- bbtkError("Path \""<<name<<"\" doesn't exist");
+ if(fullPathScriptName == "")
+ bbtkError("Path ["<<upath<<"] doesn't exist");
else
- bbtkError("Script \""<<libname<<"\" not found");
+ bbtkError("Script ["<<fullPathScriptName<<"] not found");
else
- bbtkError("No \""<<pkgname<<".bbs\" script found");
+ bbtkError("No ["<<pkgname<<".bbs] script found");
return;
}
+ else
+ LoadScript(fullPathScriptName);
- bbtkMessage("Interpreter",1,pkgname<<" loaded"<<std::endl);
-
+ return;
+ }
+
+
+ //=======================================================================
+
+ void Interpreter::LoadScript( std::string fullPathScriptName)
+ {
+ bbtkMessage("Interpreter",1,fullPathScriptName<<" found"<<std::endl);
+
+ std::ifstream* s;
s = new std::ifstream;
- s->open(libname.c_str());
+ s->open(fullPathScriptName.c_str());
if (!s->good())
{
- bbtkError("Could not open file \""<<libname<<"\"");
+ bbtkError("Could not open file ["<<fullPathScriptName<<"]");
return;
}
-
+
if (verbose)
- std::cout << " -->[" << libname << "] found" << std::endl;
+ std::cout << " -->[" << fullPathScriptName << "] found" << std::endl;
mFile.push_back(s);
- mFileName.push_back(libname);
+ mFileName.push_back(fullPathScriptName);
mLine.push_back(0);
- }
-
-
- //=======================================================================
-
+ return;
+ }
//=======================================================================
/**
// empty lines are not stored in from history
if (strlen(line))
{
- // if history too long : delete oldest command
- if (mHistory.size()>MAX_HISTORY_SIZE)
- {
- delete mHistory.front();
- mHistory.pop_front();
- }
- mHistory.push_back(line);
+ // if history too long : delete oldest command
+ if (mHistory.size()>MAX_HISTORY_SIZE)
+ {
+ delete mHistory.front();
+ mHistory.pop_front();
+ }
+ mHistory.push_back(line);
}
-
break;
}
- // Backspace
- else if ( (ind>0) &&
+ // Backspace
+ else if ( (ind>0) &&
((c == BBTK_BACKSPACE_KBCODE) ||
(c == BBTK_DEL_KBCODE)) )
{
PrintChar(line[ind]);
ind++;
}
-
+
// Arrow left
else if (ind>0 && c==BBTK_LEFT_ARROW_KBCODE)
{
PrintChar('\b');
ind--;
-
+
}
}
bool insideComment = false; // for multiline comment
do
{
- try
+ try
{
std::string line;
GetLineFromPrompt(line);
}
catch (std::exception& e)
{
- std::cerr << "* ERROR : "<<e.what()<<" (not in bbtk)"<<std::endl;
+ std::cerr << "* ERROR :: "<<e.what()<<" (not in bbtk)"<<std::endl;
}
catch (...)
{