Program: bbtk
Module: $RCSfile: bbtkInterpreter.cxx,v $ $
Language: C++
- Date: $Date: 2008/02/01 13:06:29 $
- Version: $Revision: 1.17 $
+ Date: $Date: 2008/02/05 11:07:42 $
+ Version: $Revision: 1.22 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
*/
Interpreter::Interpreter()
:
- mCommandLine(false), verbose(false)
+ mCommandLine(false)
{
bbtk::MessageManager::RegisterMessageType("Echo","Level>0 : Prints the 'echo' commands of the user.\n\tLevel>1 : Prints the command being interpreted",1);
bbtk::MessageManager::RegisterMessageType("Interpreter","Messages of the interpreter",0);
info.keyword = "config"; // JPR
info.argmin = 0;
- info.argmax = 1;
+ info.argmax = 0;
info.code = cConfig;
- info.syntax = "config [<verbose>|<v>]";
+ info.syntax = "config";
info.help = "Prints the value of all configuration parameters";
mCommandDict[info.keyword] = info;
+ info.keyword = "index"; // LG
+ info.argmin = 0;
+ info.argmax = 2;
+ info.code = cIndex;
+ info.syntax = "index [<filename> ['Initials'(default)|'Packages'|'Keywords']]";
+ info.help = "Creates an html index of known boxes. If filename is provided then save it to the file 'filename'. The default index entries are the initial letters of the names of the boxes. If 'Packages' or 'Keywords' is provided then the entries are either the package names or the keywords";
+ mCommandDict[info.keyword] = info;
+
info.keyword = "reset"; //EED
info.argmin = 0;
info.argmax = 0;
info.argmin = 0;
info.argmax = 2;
info.code = cMessage;
- info.syntax = "message <category> <level>";
- info.help = "Sets the level of the category of messages <category> to <level>.\n If category='All' then sets the level for all categories. If no category nor level is passed then prints info on available categories of messages and their current level.";
- mCommandDict[info.keyword] = info;
+ 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.keyword = "include";
info.argmin = 1;
delete mExecuter;
//delete mFactory;
- // std::cout <<"EO Interpreter::~Interpreter()"<<std::endl;
bbtkDebugDecTab("Interpreter",9);
}
//=======================================================================
/**
*
*/
- void Interpreter::InterpretFile( const std::string& filename, bool use_configuration_file, bool verbose)
+ void Interpreter::InterpretFile( const std::string& filename,
+ bool use_configuration_file)
{
bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretFile(\""<<filename<<"\")"<<std::endl);
try
{
- SwitchToFile(filename, use_configuration_file, verbose);
+ SwitchToFile(filename, use_configuration_file);
bool insideComment = false; // for multiline comment
while (mFile.size()>0)
{
mExecuter->Author(words[1]);
break;
- case cKeyword :
- mExecuter->Keyword(words[1]);
- break;
-
- case cDescription :
- mExecuter->Description(words[1]);
+ case cKeyword :
+ mExecuter->Keyword(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 :
break;
case cConfig :
- if (words.size()>1) // any param for config means verbose = true
- verbose = true;
- else
- verbose = false;
- Config(verbose);
+ Config();
break;
case cReset : // EED
case cInclude :
if (mCommandLine)
{
- InterpretFile(words[1], true, verbose); // true : better pass use_config_file
+ InterpretFile(words[1], true ); // true : better pass use_config_file
}
else
{
- SwitchToFile(words[1], true, verbose); // true : better pass use_config_file
+ SwitchToFile(words[1], true ); // true : better pass use_config_file
}
break;
case cLoad:
- LoadPackage(words[1], true, verbose); // true : better pass use_config_file
+ LoadPackage(words[1], true ); // true : better pass use_config_file
break;
case cUnload:
- //=======================================================================
- void SplitString ( const std::string& str, const std::string& delimiters,
- std::vector<std::string>& tokens)
- {
- // Skip delimiters at beginning.
- std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
- // Find first delimiter.
- std::string::size_type pos = str.find_first_of(delimiters, lastPos);
-
- while (std::string::npos != pos || std::string::npos != lastPos)
- {
- // Found a token, add it to the vector.
- tokens.push_back(str.substr(lastPos, pos - lastPos));
- // Skip delimiters. Note the "not_of"
- lastPos = str.find_first_not_of(delimiters, pos);
- // Find next delimiter
- pos = str.find_first_of(delimiters, lastPos);
- }
-
- }
- //=======================================================================
-
//=======================================================================
std::string delimiters = "\"";
std::vector<std::string> quote;
- SplitString(str,delimiters,quote);
+ Utilities::SplitString(str,delimiters,quote);
delimiters = " \t";
std::vector<std::string>::iterator i;
for (i=quote.begin(); i!=quote.end(); )
{
- SplitString(*i,delimiters,tokens);
+ Utilities::SplitString(*i,delimiters,tokens);
++i;
if (i!=quote.end())
{
// Replaces substrings "\\n" by a real carriage return "\n"
void SubsBackslashN ( std::string& s )
{
- // std::cout << "BEFORE=["<<s<<"]"<<std::endl;
std::string ss("\\n");
std::string::size_type pos = 0;
pos = s.find(ss,0);
char* cr = "\n";
while ( pos != std::string::npos )
{
- // std::cout << "*** find one "<<std::endl;
s.replace(pos,2,cr,1);
pos = s.find(ss, pos-1);
}
- // std::cout << "AFTER=["<<s<<"]"<<std::endl;
}
//=======================================================================
{
// Found a text token, add it to the vector.
chains.push_back(str.substr(lastPos, pos - lastPos));
- // std::cout << "text='"<<chains.back()<<"'"<<std::endl;
}
else
{
tok = str.substr(lastPos, pos - lastPos);
Utilities::SplitAroundFirstDot(tok,box,output);
chains.push_back( mExecuter->Get(box,output) );
- // std::cout << "outp='"<<chains.back()<<"'"<<std::endl;
}
// Skip delimiters. Note the "not_of"
lastPos = str.find_first_not_of(delimiters, pos);
//
is_text = !is_text;
}
- // std::cout << "nb="<<chains.size()<<std::endl;
std::vector<std::string>::iterator i;
for (i= chains.begin(); i!=chains.end(); ++i)
{
// ===================================================================================
void Interpreter::SwitchToFile( const std::string& name,
- bool use_configuration_file, bool verbose)
+ bool use_configuration_file )
{
// Note : in the following :
// name : the user supplied name
bbtkDebugMessageInc("Interpreter",9,"Interpreter::SwitchToFile( \""
<<name<<"\")"<<std::endl);
-// to be removed in final version
-// use : Config v
-//verbose = true;
std::vector<std::string> script_paths;
std::string fullPathScriptName; // full path script name
std::string pkgname; // e.g. <scriptname>.bbs
// 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;
+ bbtkMessage("Interpreter",1,
+ "look for : [" << name
+ << "] (use_configuration_file == TRUE)" << std::endl);
script_paths = ConfigurationFile::GetInstance().Get_bbs_paths();
}
std::string upath;
pkgname = Utilities::ExtractScriptName(name,upath);
-//std::cout <<"name [" << name << "] pkgname [" << pkgname << "] upath [" << upath << "]" << std::endl;
+
bool fullnameGiven = false;
bool foundFile = false;
nbBssFiles++;
}
if (nbBssFiles==0)
- if (verbose)
- std::cout << "WARNING : No '.bbs' file found in [" << upath << "]" << std::endl;
+ bbtkMessage("Interpreter",2,
+ "WARNING : No '.bbs' file found in ["
+ << upath << "]" << std::endl);
return;
}
}
fullDirectoryName = Utilities::MakePkgnameFromPath(path, upath, false);
-//std::cout <<"fullpath [" << fullDirectoryName << "]" <<std::endl;
+
// Check if library exists
if ( ! Utilities::IsDirectory(fullDirectoryName) )
{
// 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;
+ bbtkMessage("Interpreter",1," [" <<fullDirectoryName
+ <<"] : doesn't exist" <<std::endl);
continue; // try next path
}
foundFile = true;
int nbFiles = Utilities::Explore(fullDirectoryName, false, Filenames);
-// std::cout << "=================nbFiles " << nbFiles << std::endl;
+
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;
+ bbtkMessage("Interpreter",1,
+ "WARNING : No '.bbs' file found in ["
+ << fullDirectoryName << "]" << std::endl);
- break; // a directory was found; we stop iterating
+ //break; // a directory was found; we stop iterating
+ // LG : No! We want all files included !
}
return;
}
// ===========================================================check user supplied location
fullnameGiven = true;
- fullPathScriptName = Utilities::ExpandLibName(name, verbose);
+
+ fullPathScriptName = Utilities::ExpandLibName(name, false);
// allow user to always forget ".bbs"
int l = fullPathScriptName.size();
// fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true); //pkgname);
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 <<" [" <<fullPathScriptName <<"] : doesn't exist" <<std::endl;
+ bbtkMessage("Interpreter",2,
+ " [" <<fullPathScriptName <<"] : doesn't exist"
+ <<std::endl);
continue; // try next path
}
- if (verbose)
- std::cout <<" [" <<fullPathScriptName <<"] : found" <<std::endl;
+ bbtkMessage("Interpreter",2,
+ " [" <<fullPathScriptName
+ <<"] : found" <<std::endl);
foundFile = true;
break; // a script was found; we stop iterating
void Interpreter::LoadScript( std::string fullPathScriptName)
{
- bbtkMessage("Interpreter",1,fullPathScriptName<<" found"<<std::endl);
+ if (find(mFileName.begin(),mFileName.end(),fullPathScriptName)
+ !=mFileName.end())
+ {
+ bbtkMessage("Interpreter",1,"file '"<<fullPathScriptName
+ <<"' already open : I do not open it once more to prevent recursive inclusion"<<std::endl);
+ return;
+ }
std::ifstream* s;
s = new std::ifstream;
return;
}
- if (verbose)
- std::cout << " -->[" << fullPathScriptName << "] found" << std::endl;
+ bbtkMessage("Interpreter",1," -->[" << fullPathScriptName
+ << "] found" << std::endl);
mFile.push_back(s);
mFileName.push_back(fullPathScriptName);
//===================================================================
/// Displays the Configuration
- void Interpreter::Config( bool verbose ) const
+ void Interpreter::Config() const
{
bbtkDebugMessageInc("Core",9,"Factory::Config"<<std::endl);
bbtkDebugDecTab("Interpreter",9);
}
- //=======================================================================
- void Interpreter::Graph(const std::vector<std::string>& words)
- {
- std::string page;
+//=======================================================================
+void Interpreter::Graph(const std::vector<std::string>& words)
+{
+ std::string page;
bool system_display = true;
#ifdef _USE_WXWIDGETS_
page = mExecuter->ShowGraph(words[1],words[2],words[3],words[4],words[5],"",system_display);
}
else if (words.size()==7)
- {
- page = mExecuter->ShowGraph(words[1],words[2],words[3],words[4],words[5],words[6],system_display);
- }
-
+ {
+ page = mExecuter->ShowGraph(words[1],words[2],words[3],words[4],words[5],words[6],system_display);
+ }
+
#ifdef _USE_WXWIDGETS_
if ( WxConsole::GetInstance() != 0 )
WxConsole::GetInstance()->ShowHtmlPage(page);
#endif
}
- //=======================================================================
+//=======================================================================
+
+//=======================================================================
+void Interpreter::Index(const std::string& filename,
+ const std::string& type)
+{
+ Factory::IndexEntryType t;
+ if (type=="Initials") t = Factory::Initials;
+ else if (type=="Keywords") t = Factory::Keywords;
+ else if (type=="Packages") t = Factory::Packages;
+
+ GetGlobalFactory()->CreateHtmlIndex(t,filename);
+}
+//=======================================================================
}//namespace