1 /*=========================================================================
4 Module: $RCSfile: bbtkInterpreter.cxx,v $ $
6 Date: $Date: 2008/10/02 12:29:26 $
7 Version: $Revision: 1.72 $
9 Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10 l'Image). All rights reserved. See Doc/License.txt or
11 http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
13 This software is distributed WITHOUT ANY WARRANTY; without even
14 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 PURPOSE. See the above copyright notices for more information.
17 =========================================================================*/
20 * \brief class Interpreter :
23 #include "bbtkInterpreter.h"
24 #include "bbtkExecuter.h"
25 #include "bbtkTranscriptor.h"
26 #include "bbtkMessageManager.h"
27 #include "bbtkConfigurationFile.h"
28 #include "bbtkUtilities.h"
29 #include "bbtkWxBlackBox.h"
32 #ifdef CMAKE_HAVE_TERMIOS_H
34 #define BBTK_USE_TERMIOS_BASED_PROMPT
42 //=======================================================================
43 Interpreter::Pointer Interpreter::New(const std::string& cpp_file)
45 bbtkDebugMessage("Kernel",9,"Interpreter::New('"<<cpp_file<<"')"<<std::endl);
46 return MakePointer(new Interpreter(cpp_file));
48 //=======================================================================
50 //=======================================================================
51 Interpreter::Pointer Interpreter::New(VirtualExec::Pointer e)
53 bbtkDebugMessage("Kernel",9,"Interpreter::New(VirtualExec)"<<std::endl);
54 return MakePointer(new Interpreter(e));
56 //=======================================================================
58 //=======================================================================
59 Interpreter::Interpreter(const std::string& cpp_file)
61 Init(VirtualExec::Pointer(), cpp_file);
63 //=======================================================================
65 //=======================================================================
66 Interpreter::Interpreter(VirtualExec::Pointer e)
70 //=======================================================================
72 //=======================================================================
73 void Interpreter::Init(VirtualExec::Pointer e, const std::string& cpp_file)
79 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);
80 bbtk::MessageManager::RegisterMessageType("Interpreter","Messages of the interpreter",0);
81 bbtkDebugMessageInc("Interpreter",9,"Interpreter::Interpreter()" <<std::endl);
86 else if (cpp_file.size()!=0)
88 mVirtualExecuter = boost::static_pointer_cast<VirtualExec>(bbtk::Transcriptor::New(cpp_file));
92 bbtk::Executer::Pointer exe = bbtk::Executer::New();
94 mVirtualExecuter = boost::static_pointer_cast<VirtualExec>(exe);
97 // Lock this pointer or will auto-destruct !!
98 if (!e) mVirtualExecuter->SetInterpreter(MakePointer(this,true));
100 // For the time being, comment out previous line, and
101 // uncomment next line to check Transcriptor
103 //mVirtualExecuter = new bbtk::Transcriptor("GeneratedProgram.txt");
105 // Builds the commands dict
106 CommandInfoType info;
108 info.keyword = "new";
112 info.syntax = "new <type> <name>";
113 info.help = "Creates a new black box of type <type> with name <name>";
114 mCommandDict[info.keyword] = info;
116 info.keyword = "delete";
120 info.syntax = "delete <box>";
121 info.help = "Deletes the black box of name <box>";
122 mCommandDict[info.keyword] = info;
124 info.keyword = "newgui";
128 info.syntax = "newgui <box> <name>";
129 info.help = "Automatically creates a graphical user interface with name <name> for the black box <box> and connects it to the box inputs";
130 mCommandDict[info.keyword] = info;
132 info.keyword = "connect";
135 info.code = cConnect;
136 info.syntax = "connect <box1.output> <box2.input>";
137 info.help = "Connects the ouput <output> of black box <box1> to the input <input> of black box <box2>";
138 mCommandDict[info.keyword] = info;
140 info.keyword = "print";
144 info.syntax = "print <string>";
145 info.help = "Prints the string. Substitutes any token of the form '$box.output$' by the string adaptation of the output of the box (requires the right adaptor). No carriage return is issued at the end, use '\\n' to add carriage returns. The level of 'echo' messages must be greater than 1 (see the command 'message').";
146 mCommandDict[info.keyword] = info;
148 info.keyword = "exec";
152 info.syntax = "exec <box | 'freeze' | 'unfreeze' | 'freeze_no_error' >";
153 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.";
154 mCommandDict[info.keyword] = info;
156 info.keyword = "package";
159 info.code = cPackage;
160 info.syntax = "package <name>";
161 info.help = "Begins the definition of a package.";
162 mCommandDict[info.keyword] = info;
164 info.keyword = "endpackage";
167 info.code = cEndPackage;
168 info.syntax = "endpackage";
169 info.help = "Ends the definition of a package.";
170 mCommandDict[info.keyword] = info;
172 info.keyword = "define";
176 info.syntax = "define <type> [<package>]";
177 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.";
178 mCommandDict[info.keyword] = info;
180 info.keyword = "endefine";
183 info.code = cEndDefine;
184 info.syntax = "endefine";
185 info.help = "Ends the definition of a new type of complex black box";
186 mCommandDict[info.keyword] = info;
188 info.keyword = "kind";
192 info.syntax = "kind <ADAPTOR|DEFAULT_ADAPTOR|WIDGET_ADAPTOR|DEFAULT_WIDGET_ADAPTOR>";
193 info.help = "Sets the kind of the currently defined complex black box";
194 mCommandDict[info.keyword] = info;
196 info.keyword = "input";
200 info.syntax = "input <name> <box.input> <help>";
201 info.help = "Defines the input <name> of the current working black box as being an alias for the input <input> of the black box <box>. <help> defines the help string for the newly created input";
202 mCommandDict[info.keyword] = info;
204 info.keyword = "output";
208 info.syntax = "output <name> <box.output> <help>";
209 info.help = "Defines the output <name> of the current working black box as being an alias for the output <output> of the black box <box>. <help> defines the help string for the newly created output";
210 mCommandDict[info.keyword] = info;
212 info.keyword = "set";
216 info.syntax = "set <box.input> <value>";
217 info.help = "Sets the value of the input <input> of the black box <box> to <value>. There must exist a string to the value type adaptor";
218 mCommandDict[info.keyword] = info;
220 info.keyword = "config"; // JPR
224 info.syntax = "config";
225 info.help = "Prints the value of all configuration parameters";
226 mCommandDict[info.keyword] = info;
228 info.keyword = "index"; // LG
233 info.syntax = "index [<filename> ['Initials'(default)|'Packages'|'Categories'|'Adaptors']]";
234 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 'Categories' is provided then the entries are either the packages names or the categories. If 'Adaptors' is provided then an alphabetical index of all adaptors is created.";
235 mCommandDict[info.keyword] = info;
237 info.keyword = "reset";
241 info.syntax = "reset";
242 info.help = "Deletes all boxes and unloads all packages (reset to start state)";
243 mCommandDict[info.keyword] = info;
245 info.keyword = "author";
249 info.syntax = "author <string>";
250 info.help = "Adds the string <string> to the author information of the black box being defined";
251 mCommandDict[info.keyword] = info;
253 info.keyword = "category"; //JP
256 info.code = cCategory;
257 info.syntax = "category <list of items, separated by ;>";
258 info.help = "Adds the string <string> to the category information of the black box being defined";
259 mCommandDict[info.keyword] = info;
261 info.keyword = "description";
264 info.code = cDescription;
265 info.syntax = "description <string>";
266 info.help = "Adds the string <string> to the descriptive information of the black box being defined";
267 mCommandDict[info.keyword] = info;
269 info.keyword = "help";
273 info.syntax = "help";
274 info.syntax = "\n (1) help \n (2) help <command name> \n (3) help packages [all]\n (4) help <package name> [all]\n (5) help <black box type> \n (6) help <black box name>";
275 info.help = "Effect :\n (1) Lists all available commands;\n (2) Prints help on a particular command; \n (3) Lists the packages loaded and their black boxes.\n Add 'all' to list adaptors; \n (4) Prints short help on the black boxes of a package.\n Add 'all' to include adaptors; \n (5) Prints full help on a black box type; \n (6) Prints information on the inputs, outputs and connections of a black box instance.";
276 mCommandDict[info.keyword] = info;
278 info.keyword = "message";
281 info.code = cMessage;
282 info.syntax = "message <kind> <level>";
283 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.";
284 mCommandDict[info.keyword] = info;
286 info.keyword = "include";
289 info.code = cInclude;
290 info.syntax = "include <filename> [source]";
291 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).";
292 mCommandDict[info.keyword] = info;
294 info.keyword = "quit";
298 info.syntax = "quit";
299 info.help = "Quits the program (during script execution it stops the complete execution)";
300 mCommandDict[info.keyword] = info;
302 info.keyword = "load";
306 info.syntax = "load <packagename>";
307 info.help = "Loads the black box package <packagename>";
308 mCommandDict[info.keyword] = info;
310 info.keyword = "unload";
314 info.syntax = "unload <packagename>";
315 info.help = "Unloads the black box package <packagename>";
316 mCommandDict[info.keyword] = info;
318 info.keyword = "graph";
322 info.syntax = "graph [ BlackBoxName [ Detail 0..1 [ Level 0..99999 [ Output html file [ Custom header [ Custom title ]]]]]] \n graph [ BlackBoxNameType [ Detail 0..1 [ Level 0..99999 [ Output html file [ Custom header [ Custom title ]]]]]]";
323 info.help = "Shows a graphical view of a bbtk pipeline.\n- BlackBoxName : name of the box to view. Default '.' : current box.\n- BlackBoxNameType : name of the type of box to view, ex : 'workspace')";
324 mCommandDict[info.keyword] = info;
326 info.keyword = "debug";
330 info.syntax = "debug [expr|-C|-D]";
331 info.help = "Prints debug info on living bbtk objects containing the string 'expr' (default expr=''). -C checks the factory integrity. -D turns on objects debug info after main ends";
332 mCommandDict[info.keyword] = info;
335 info.keyword = "workspace";
338 info.code = cWorkspace;
339 info.syntax = "workspace < ( freeze | unfreeze ) | ( rename <newname> ) >";
340 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.";
341 mCommandDict[info.keyword] = info;
344 bbtkDebugDecTab("Interpreter",9);
347 //=======================================================================
351 //=======================================================================
355 Interpreter::~Interpreter()
357 bbtkDebugMessageInc("Interpreter",9,"==> Interpreter::~Interpreter()" <<std::endl);
358 mVirtualExecuter = VirtualExec::Pointer();
359 bbtkDebugMessageInc("Interpreter",9,"<== Interpreter::~Interpreter()" <<std::endl);
361 //=======================================================================
364 InterpreterError::InterpreterError( const std::string& message,
366 const std::string& script_file,
369 : Exception("Interpreter",0,message),
370 mInScriptFile(in_script_file),
371 mScriptFile(script_file),
372 mScriptLine(script_line)
375 InterpreterError::InterpreterError( const Exception& excep,
377 const std::string& script_file,
381 mInScriptFile(in_script_file),
382 mScriptFile(script_file),
383 mScriptLine(script_line)
386 //=======================================================================
387 void Interpreter::CatchBbtkException( const bbtk::Exception& e )
391 bool in_script = false;
392 std::string file("");
394 if (mFileName.size()) {
395 std::ifstream* fs = dynamic_cast<std::ifstream*>(mFile.back());
396 if (fs!=0) in_script = true;
397 file = mFileName.back();
401 throw InterpreterError(e,in_script,file,line);
405 std::stringstream mess;
406 mess << "* ERROR : "<<e.GetErrorMessage()<<std::endl;
407 if (mFileName.size()) {
408 mess << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
409 mess << "* LINE : "<<mLine.back()<<std::endl;
411 std::cerr << mess.str();
414 //=======================================================================
416 //=======================================================================
417 void Interpreter::CatchStdException( const std::exception& e )
421 bool in_script = false;
422 std::string file("");
424 if (mFileName.size()) {
425 std::ifstream* fs = dynamic_cast<std::ifstream*>(mFile.back());
426 if (fs!=0) in_script = true;
427 file = mFileName.back();
431 throw InterpreterError(e.what(),in_script,file,line);
435 std::stringstream mess;
436 mess << "* ERROR : "<<e.what()<<std::endl;
437 if (mFileName.size()) {
438 mess << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
439 mess << "* LINE : "<<mLine.back()<<std::endl;
441 std::cerr << mess.str();
444 //=======================================================================
446 //=======================================================================
447 void Interpreter::CatchUnknownException()
451 bool in_script = false;
452 std::string file("");
454 if (mFileName.size()) {
455 std::ifstream* fs = dynamic_cast<std::ifstream*>(mFile.back());
456 if (fs!=0) in_script = true;
457 file = mFileName.back();
461 throw InterpreterError("Unknown exception caught",
462 in_script,file,line);
466 std::stringstream mess;
467 mess << "* UNDEFINED ERROR (not a bbtk nor a std exception)"
469 if (mFileName.size()) {
470 mess << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
471 mess << "* LINE : "<<mLine.back()<<std::endl;
473 std::cerr << mess.str();
476 //=======================================================================
478 //=======================================================================
480 #define CATCH_MACRO \
481 catch (QuitException e) \
483 status = Interpreter_QUIT; \
484 if (mThrow) throw QuitException(); \
486 catch (bbtk::Exception e) \
488 status = Interpreter_ERROR; \
489 CatchBbtkException(e); \
491 catch (std::exception& e) \
493 status = Interpreter_ERROR; \
494 CatchStdException(e); \
498 status = Interpreter_ERROR; \
499 CatchUnknownException(); \
501 //=======================================================================
504 //=======================================================================
508 Interpreter::ExitStatus Interpreter::InterpretFile( const std::string& filename )
510 bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretFile(\""<<filename<<"\")"<<std::endl);
512 bool exm = mCommandLine;
513 mCommandLine = false;
515 ExitStatus status = Interpreter_OK;
519 SwitchToFile(filename);
521 bool insideComment = false; // for multiline comment
522 while (mFile.size()>0)
524 while (!mFile.back()->eof()) {
527 mFile.back()->getline(buf,500);
528 std::string str(buf);
529 int size=str.length();
530 if ( str[ size-1 ]==13 )
536 InterpretLine(str, insideComment);
547 bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretFile(\""<<filename<<"\")"<<std::endl);
548 bbtkDecTab("Interpreter",9);
554 //=======================================================================
557 //=======================================================================
561 Interpreter::ExitStatus
562 Interpreter::InterpretBuffer( std::stringstream* buffer )
564 bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretBuffer()"<<std::endl);
566 bool exm = mCommandLine;
567 mCommandLine = false;
569 ExitStatus status = Interpreter_OK;
573 SwitchToStream(buffer);
574 bool insideComment = false; // for multiline comment
575 while (mFile.size()>0)
577 while (!mFile.back()->eof()) {
580 mFile.back()->getline(buf,500);
581 std::string str(buf);
583 int size=str.length();
584 if ( str[ size-1 ]==13 )
590 InterpretLine(str, insideComment);
600 bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretBuffer()"<<std::endl);
601 bbtkDecTab("Interpreter",9);
606 //=======================================================================
608 //=======================================================================
609 /// Runs the interpretation of a command
610 Interpreter::ExitStatus Interpreter::InterpretLine( const std::string& line )
612 bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretLine('"<<line<<"')"<<std::endl);
614 ExitStatus status = Interpreter_OK;
618 bool insideComment = false;
619 InterpretLine(line, insideComment);
624 bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretLine()"
626 bbtkDecTab("Interpreter",9);
632 //=======================================================================
636 void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
638 bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretLine(\""<<line<<"\")"<<std::endl);
639 bbtkMessage("echo",2,line<<std::endl);
641 std::vector<std::string> words;
642 SplitLine(line,words);
647 bbtkDebugDecTab("Interpreter",9);
651 // Single line comment : # or //
652 if ( words[0][0]=='#' || (words[0][0]=='/' && words[0][1]=='/') )
654 bbtkDebugDecTab("Interpreter",9);
655 bbtkMessage("Interpreter",9,"Comment"<<std::endl);
659 // Multi line comment ( /* ... */ ) -delimiters on different lines !-
661 if (words[0][0]=='/' && words[0][1]=='*')
663 bbtkDebugDecTab("Interpreter",9);
664 bbtkMessage("Interpreter",9,"In multiline comment"<<std::endl);
665 insideComment = true;
669 if (words[0][0]=='*' && words[0][1]=='/')
671 bbtkDebugDecTab("Interpreter",9);
672 bbtkMessage("Interpreter",9,"Out multiline comment"<<std::endl);
673 if ( !insideComment ) {
674 bbtkDebugDecTab("Interpreter",9);
675 bbtkMessage("Interpreter",9,"Comment mismatch : '*/' with no matching '/*'"<<std::endl);
677 insideComment = false;
683 bbtkDebugDecTab("Interpreter",9);
684 bbtkMessage("Interpreter",9,"Multiline Comment"<<std::endl);
689 CommandInfoType command;
690 InterpretCommand(words,command);
692 bbtkDebugMessage("Interpreter",9,
693 "Command='"<<command.keyword
694 <<"' code="<<command.code<<std::endl);
696 std::string left,right,left2,right2;
697 std::string filename;
698 switch (command.code)
701 mVirtualExecuter->Create(words[1],words[2]);
705 mVirtualExecuter->Destroy(words[1]);
709 Utilities::SplitAroundFirstDot(words[1],left,right);
710 Utilities::SplitAroundFirstDot(words[2],left2,right2);
711 mVirtualExecuter->Connect(left,right,left2,right2);
715 mVirtualExecuter->BeginPackage(words[1]);
719 mVirtualExecuter->EndPackage();
723 if (mFileName.size()>0)
725 filename = mIncludeFileName.back(); //Utilities::get_file_name(mFileName.back());
729 mVirtualExecuter->Define(words[1],"",filename);
733 mVirtualExecuter->Define(words[1],words[2],filename);
738 mVirtualExecuter->EndDefine();
742 mVirtualExecuter->Kind(words[1]);
746 mVirtualExecuter->Print(words[1]);
750 if (words[1]=="freeze")
752 mVirtualExecuter->SetNoExecMode(true);
755 else if (words[1]=="freeze_no_error ")
757 mVirtualExecuter->SetNoExecMode(true);
758 mVirtualExecuter->SetNoErrorMode(true);
761 else if (words[1]=="unfreeze")
763 mVirtualExecuter->SetNoExecMode(false);
764 mVirtualExecuter->SetNoErrorMode(false);
768 mVirtualExecuter->Execute(words[1]);
773 Utilities::SplitAroundFirstDot(words[2],left,right);
774 mVirtualExecuter->DefineInput(words[1],left,right,words[3]);
778 Utilities::SplitAroundFirstDot(words[2],left,right);
779 mVirtualExecuter->DefineOutput(words[1],left,right,words[3]);
783 Utilities::SplitAroundFirstDot(words[1],left,right);
784 mVirtualExecuter->Set(left,right,words[2]);
788 mVirtualExecuter->Author(words[1]);
792 NewGUI(words[1],words[2]);
796 mVirtualExecuter->Category(words[1]);
801 Index("tmp_index.html");
802 else if (words.size()==2)
804 else if (words.size()==3)
805 Index(words[1],words[2]);
809 mVirtualExecuter->Description(words[1]);
819 mVirtualExecuter->HelpMessages();
823 sscanf(words[2].c_str(),"%d",&level);
824 mVirtualExecuter->SetMessageLevel(words[1],level);
843 InterpretFile(words[1]);
847 SwitchToFile(words[1]);
849 // if 'source' was given
852 GetExecuter()->SetCurrentFileName(words[1]);
857 GetExecuter()->LoadPackage(words[1]);
861 GetExecuter()->UnLoadPackage(words[1]);
865 throw QuitException();
869 if (words.size()==2) Debug(words[1]);
874 if (words.size() == 2)
876 if (words[1]=="freeze") mVirtualExecuter->SetNoExecMode(true);
877 else if (words[1]=="unfreeze") mVirtualExecuter->SetNoExecMode(false);
881 mVirtualExecuter->SetWorkspaceName(words[2]);
886 bbtkInternalError("should not reach here !!!");
889 bbtkDecTab("Interpreter",9);
891 //=======================================================================
897 //=======================================================================
901 void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>& tokens)
903 bbtkDebugMessageInc("Interpreter",9,"Interpreter::SplitLine(\""<<str<<"\")"<<std::endl);
905 std::string delimiters = "\"";
906 std::vector<std::string> quote;
907 Utilities::SplitString(str,delimiters,quote);
910 std::vector<std::string>::iterator i;
911 for (i=quote.begin(); i!=quote.end(); )
913 Utilities::SplitString(*i,delimiters,tokens);
917 // bbtkDebugMessage("Interpreter",0,"\""<<*i<<"\""<<std::endl);
918 tokens.push_back(*i);
923 for (i=tokens.begin(); i!=tokens.end(); ++i)
925 bbtkDebugMessage("Interpreter",9,"["<<*i<<"] ");
927 bbtkDebugMessageCont("Interpreter",9,std::endl);
929 bbtkDebugDecTab("Interpreter",9);
931 //=======================================================================
934 //=======================================================================
935 void Interpreter::Reset()
937 // Cannot close all files if the reset command is read from a file !
939 mFileNameHistory.clear();
940 this->mVirtualExecuter->Reset();
942 //=======================================================================
944 //=======================================================================
949 void Interpreter::Print( const std::string& str)
951 if (mVirtualExecuter->GetNoExecMode()) return;
953 bbtkDebugMessageInc("Interpreter",9,"Interpreter::Print(\""<<str<<"\")"<<std::endl);
956 // InterpretLine ("load std")
957 // InterpretLine("new ConcatStrings _C_ ") -> trouver un nom unique : # commande
958 // InterpretLine("new Print _P_")
959 // InterpretLine("connect _C_.Out _P_.In")
963 std::vector<std::string> chains;
964 std::string delimiters("$");
966 // Skip delimiters at beginning.
967 std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
969 if (lastPos>0) is_text = false;
971 // Find first delimiter.
972 std::string::size_type pos = str.find_first_of(delimiters, lastPos);
974 while (std::string::npos != pos || std::string::npos != lastPos)
978 // Found a text token, add it to the vector.
979 chains.push_back(str.substr(lastPos, pos - lastPos));
980 // std::string token = str.substr(lastPos, pos - lastPos)
981 // InterpretLine("set _C_.In%num% %token%")
987 // is an output (between $$) : decode
988 std::string tok,box,output;
989 tok = str.substr(lastPos, pos - lastPos);
990 Utilities::SplitAroundFirstDot(tok,box,output);
991 chains.push_back( mVirtualExecuter->Get(box,output) );
993 // InterpretLine("connect %tok% _C_.In%num%")
996 // Skip delimiters. Note the "not_of"
997 lastPos = str.find_first_not_of(delimiters, pos);
998 // Find next delimiter
999 pos = str.find_first_of(delimiters, lastPos);
1004 // InterpretLine("exec _P_")
1005 // if (IS_IN_WORKSPACE) InterpretLine("delete _C_; delete _P_");
1007 std::vector<std::string>::iterator i;
1008 for (i= chains.begin(); i!=chains.end(); ++i)
1011 Utilities::SubsBackslashN(*i);
1014 std::cout << std::endl;
1015 bbtkDebugDecTab("Interpreter",9);
1019 //=======================================================================
1024 // =========================================================================
1025 void Interpreter::SwitchToFile( const std::string& name )
1027 // Note : in the following :
1028 // name : the user supplied name
1029 // - abreviated name e.g. scr scr.bbs
1030 // - relative full name e.g. ./scr.bbs ../../scr.bbs
1031 // - absolute full name e.g. /home/usrname/proj/dir/scr.bbs
1032 // same for Windows, with c:, d: ...
1034 // use ./directory/subdir/scrname.bbs
1037 bbtkDebugMessageInc("Interpreter",9,"Interpreter::SwitchToFile( \""
1038 <<name<<"\")"<<std::endl);
1040 std::vector<std::string> script_paths;
1041 std::string fullPathScriptName; // full path script name
1042 std::string pkgname; // e.g. <scriptname>.bbs
1043 std::vector<std::string> Filenames;
1045 // The following is *NOT* a debug time message :
1046 // It's a user intended message.
1047 // Please don't remove it.
1048 bbtkMessage("Interpreter",1,
1049 "look for : [" << name
1050 << "]" << std::endl);
1054 pkgname = Utilities::ExtractScriptName(name,upath);
1056 bbtkMessage("Interpreter",3,
1057 "extract : pkgname [" << pkgname
1058 << "] upath [" << upath << "]" << std::endl);
1059 bool fullnameGiven = false;
1060 bool foundFile = false;
1062 // ==== "*" provided : load all scripts in given path
1063 // relative (e.g. std/boxes/*) or absolute
1068 std::stringstream* stream = new std::stringstream;
1069 //if (upath.size()!=0) // avoid troubles for "*"
1071 // ==== no path provided : look in root bbs path
1072 if (upath.size()==0)
1074 // bbtkMessage("Interpreter",1,
1075 script_paths.push_back( ConfigurationFile::GetInstance().Get_root_bbs_path() );
1077 // ==== absolute path provided
1078 else if (upath[0]=='/' || upath[1] == ':' )
1080 if ( Utilities::IsDirectory( upath ) )
1082 script_paths.push_back(upath);
1086 bbtkError("'"<<upath<<"' : directory does not exist");
1089 // ==== relative path provided : search all bbs path appended with
1090 // the relative path provided
1093 std::vector<std::string>::const_iterator i;
1094 for (i=ConfigurationFile::GetInstance().Get_bbs_paths().begin();
1095 i!=ConfigurationFile::GetInstance().Get_bbs_paths().end();
1098 std::string full_path(*i);
1099 // we *really* want '.' to be the current working directory
1100 if (full_path == ".") {
1101 char buf[2048]; // for getcwd
1102 char * currentDir = getcwd(buf, 2048);
1103 std::string cwd(currentDir);
1104 full_path = currentDir;
1107 full_path += ConfigurationFile::GetInstance().Get_file_separator();
1110 if ( Utilities::IsDirectory( full_path ) )
1112 script_paths.push_back(full_path);
1115 if (script_paths.empty())
1117 bbtkError("no '"<<upath<<"' subdir found in search paths"
1122 // === search paths list complete : now explore it
1125 std::vector<std::string>::iterator i;
1126 for (i=script_paths.begin();i!=script_paths.end();i++)// ==== relative name, iterate + load all .bbs files
1128 bbtkMessage("Interpreter",1,
1129 "--> Looking in '" << *i << "'" << std::endl);
1134 Utilities::Explore(*i, false, Filenames);
1137 for (std::vector<std::string>::iterator j = Filenames.begin();
1138 j!= Filenames.end(); ++j)
1140 int lgr = (*j).size();
1142 continue; // ignore non .bbs file
1143 if ((*j).substr(lgr-4, 4) != ".bbs")
1146 (*stream) << "include \"" << *j << "\"\n";
1147 bbtkMessage("Interpreter",2,
1148 " --> Found '" << *j << "'" << std::endl);
1155 bbtkMessage("Interpreter",1,
1156 " --> No .bbs found"<< std::endl);
1160 bbtkMessage("Interpreter",1,
1161 " --> "<<nbBssFiles<<" .bbs found"<< std::endl);
1162 SwitchToStream(stream);
1165 //break; // a directory was found; we stop iterating
1166 // LG : No! We want all files included !
1170 //=============== end pkgname=="*" ===========
1173 // if name starts with a / or a . or contains : user is assumed to have passed a relative/absolute name
1174 // (not only a plain script name)
1175 // we trust him, and try to expland the directory name
1176 // WARNING : starting from current local directory : ./whatYouWant (./ mandatory!)
1178 if (name[0]=='/' || name[1] == ':' || name[0]=='.') // absolute path (linux/windows) or relative path
1181 // ===========================================================check user supplied location
1182 fullnameGiven = true;
1184 fullPathScriptName = Utilities::ExpandLibName(name, false);
1186 // allow user to always forget ".bbs"
1187 int l = fullPathScriptName.size();
1193 if (fullPathScriptName.substr(l-4, 4) != ".bbs")
1195 fullPathScriptName = fullPathScriptName + ".bbs";
1200 fullPathScriptName = fullPathScriptName + ".bbs";
1203 if ( Utilities::FileExists(fullPathScriptName))
1210 // =============================== iterate on the paths
1212 script_paths = ConfigurationFile::GetInstance().Get_bbs_paths();
1214 std::vector<std::string>::iterator i;
1215 for (i=script_paths.begin();i!=script_paths.end();++i)
1218 // we *really* want '.' to be the current working directory
1220 char buf[2048]; // for getcwd
1221 char * currentDir = getcwd(buf, 2048);
1222 std::string cwd(currentDir);
1226 fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true);
1228 // Check if library exists
1229 if ( ! Utilities::FileExists(fullPathScriptName) )
1231 // The following is *NOT* a debug time message :
1232 // It's a user intended message.
1233 // Please don't remove it.
1234 bbtkMessage("Interpreter",2,
1235 " [" <<fullPathScriptName <<"] : doesn't exist"
1237 continue; // try next path
1239 bbtkMessage("Interpreter",2,
1240 " [" <<fullPathScriptName
1241 <<"] : found" <<std::endl);
1243 break; // a script was found; we stop iterating
1245 } //------------------ // end for ( package_paths.begin();i!=package_paths.end() )
1251 if(fullPathScriptName == "")
1252 bbtkError("Path ["<<upath<<"] doesn't exist");
1254 bbtkError("Script ["<<fullPathScriptName<<"] not found");
1256 bbtkError("No ["<<pkgname<<".bbs] script found");
1260 LoadScript(fullPathScriptName,name);
1264 //=======================================================================
1267 //=======================================================================
1268 void Interpreter::SwitchToStream( std::stringstream* stream )
1270 mFile.push_back(stream);
1271 std::ostringstream buffer_name;
1273 buffer_name << "buffer_" ;
1275 if (mFileName.size()>0 )
1277 buffer_name << mFileName.back() << "_" << mLine.back();
1279 mFileName.push_back(buffer_name.str());
1280 mIncludeFileName.push_back(buffer_name.str());
1283 //=======================================================================
1285 //=======================================================================
1287 void Interpreter::LoadScript( std::string fullPathScriptName,
1288 std::string includeScriptName)
1290 Utilities::replace( fullPathScriptName ,
1291 INVALID_FILE_SEPARATOR , VALID_FILE_SEPARATOR);
1293 if (find(mFileNameHistory.begin(),
1294 mFileNameHistory.end(),
1295 fullPathScriptName)!=mFileNameHistory.end())
1301 s = new std::ifstream;
1302 s->open(fullPathScriptName.c_str());
1305 bbtkError("Could not open file ["<<fullPathScriptName<<"]");
1309 bbtkMessage("Interpreter",1," -->[" << fullPathScriptName
1310 << "] found" << std::endl);
1313 mFileName.push_back(fullPathScriptName);
1314 mFileNameHistory.push_back(fullPathScriptName);
1315 mIncludeFileName.push_back(includeScriptName);
1321 //=======================================================================
1325 void Interpreter::CloseCurrentFile()
1327 bbtkDebugMessage("Interpreter",9,"Interpreter::CloseCurrentFile()"
1330 if (mFile.size()==0)
1332 bbtkDebugMessage("Interpreter",9," -> no file left open"<<std::endl);
1336 bbtkDebugMessage("Interpreter",9," Closing file '"<<mFileName.back()<<"'"<<std::endl);
1338 std::ifstream* file = dynamic_cast<std::ifstream*>(mFile.back());
1339 if (file!=0) file->close();
1341 delete mFile.back();
1343 mFileName.pop_back();
1344 mIncludeFileName.pop_back();
1347 bbtkDebugMessage("Interpreter",9," Remains "
1349 <<" open"<<std::endl);
1350 bbtkDebugMessage("Interpreter",9,"EO Interpreter::CloseCurrentFile()"
1353 //=======================================================================
1355 //=======================================================================
1359 void Interpreter::CloseAllFiles()
1361 bbtkDebugMessage("Interpreter",9,"Interpreter::CloseAllFiles()"
1364 while (mFile.size() != 0)
1368 bbtkDebugMessage("Interpreter",9,"EO Interpreter::CloseAllFiles()"
1371 //=======================================================================
1375 //=======================================================================
1379 void Interpreter::InterpretCommand( const std::vector<std::string>& words,
1380 CommandInfoType& info )
1382 bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretCommand(...)"<<std::endl);
1384 // searches the command keyword
1385 CommandDictType::iterator c;
1386 c = mCommandDict.find(words[0]);
1387 if ( c == mCommandDict.end() ) {
1388 bbtkError(words[0]<<" : unknown command");
1391 // tests the number of args
1392 if ( ( ((int)words.size())-1 < c->second.argmin ) ||
1393 ( ((int)words.size())-1 > c->second.argmax ) )
1395 HelpCommand(words[0]);
1396 bbtkError(words[0]<<" : wrong number of arguments");
1400 bbtkDecTab("Interpreter",9);
1402 //=======================================================================
1405 //=======================================================================
1406 /// Displays help on all the commands
1407 void Interpreter::Help(const std::vector<std::string>& words)
1409 unsigned int nbarg = words.size()-1;
1417 if (words[1]=="packages")
1419 GetExecuter()->GetFactory()->PrintPackages(true);
1424 HelpCommand(words[1]);
1426 catch (bbtk::Exception e)
1430 GetExecuter()->GetFactory()->HelpPackage(words[1]);
1434 ConfigurationFile::GetInstance().Get_doc_path();
1435 url += "/bbdoc/" + words[1] + "/index.html";
1436 if (Utilities::FileExists(url))
1438 mUser->InterpreterUserViewHtmlPage(url);
1442 catch (bbtk::Exception f)
1446 std::string package;
1447 GetExecuter()->GetFactory()->HelpBlackBox(words[1],package);
1451 ConfigurationFile::GetInstance().Get_doc_path();
1452 url += "/bbdoc/" + package + "/index.html";
1453 if (Utilities::FileExists(url))
1455 url += "#" + words[1];
1456 mUser->InterpreterUserViewHtmlPage(url);
1460 catch (bbtk::Exception g)
1464 GetExecuter()->ShowRelations(words[1],"0","9999");
1466 catch (bbtk::Exception h){
1467 bbtkError("\""<<words[1].c_str()
1468 <<"\" is not a known command, package, black box type or black box name");
1476 if (words[2]=="all")
1478 if ( words[1]=="packages" )
1480 GetExecuter()->GetFactory()->PrintPackages(true,true);
1485 GetExecuter()->GetFactory()->HelpPackage(words[1],true);
1487 catch (bbtk::Exception f)
1493 HelpCommand(words[0]);
1494 bbtkError(words[0]<<" : syntax error");
1499 bbtkError("Should not reach here !!!");
1502 //=======================================================================
1504 //===================================================================
1505 /// Displays the Configuration
1506 void Interpreter::Config() const
1508 ConfigurationFile::GetInstance().GetHelp(1);
1510 //===================================================================
1512 //=======================================================================
1513 /// Displays help on all the commands
1514 void Interpreter::HelpCommands()
1516 std::cout << "Available commands :" << std::endl;
1517 CommandDictType::iterator i;
1518 for ( i = mCommandDict.begin();
1519 i != mCommandDict.end();
1521 std::cout << " " << i->first << std::endl;
1522 // std::cout << " usage : " << i->second.syntax << std::endl;
1523 // std::cout << " " << i->second.help << std::endl;
1527 //=======================================================================
1530 //=======================================================================
1531 /// Displays help on a particular commands
1532 void Interpreter::HelpCommand(const std::string& s)
1534 CommandDictType::iterator c;
1535 c = mCommandDict.find(s);
1536 if ( c == mCommandDict.end() ) {
1537 bbtkError(s<<" : Unknown command");
1539 // std::cout << " " << s << " : "<< std::endl;
1540 // CommandParamDictType::iterator i;
1541 // for ( i = c->second.begin();
1542 // i != c->second.end();
1544 std::cout << " usage : " << c->second.syntax << std::endl;
1545 std::cout << " " << c->second.help << std::endl;
1548 //=======================================================================
1551 //=======================================================================
1552 /// Fills the vector commands with the commands which
1553 /// have the first n chars of buf for prefix
1554 /// TODO : skip initial spaces in buf and also return the position of first
1555 /// non blank char in buf
1556 void Interpreter::FindCommandsWithPrefix( char* buf,
1558 std::vector<std::string>& commands )
1560 CommandDictType::const_iterator i;
1561 for (i=mCommandDict.begin(); i!=mCommandDict.end(); ++i)
1563 if ((i->first).find(buf,0,n) == 0)
1564 commands.push_back(i->first);
1567 //=======================================================================
1571 //=======================================================================
1572 #ifdef BBTK_USE_TERMIOS_BASED_PROMPT
1574 inline void PrintChar(char c) { write(STDOUT_FILENO,&c,1); }
1575 inline void BackSpace() { write(STDOUT_FILENO,"\b \b",3); }
1577 // LG : KEYBOARD CODES AS SCANNED ON MY TTY : UNIVERSAL ?
1578 // IF NOT THE USER SHOULD BE ABLE TO CONFIGURE IT
1579 // E.G. STORE THIS IN bbtk_config.xml
1580 #define BBTK_UP_ARROW_KBCODE 0x00415B1B
1581 #define BBTK_DOWN_ARROW_KBCODE 0x00425B1B
1582 #define BBTK_RIGHT_ARROW_KBCODE 0x00435B1B
1583 #define BBTK_LEFT_ARROW_KBCODE 0x00445B1B
1584 #define BBTK_BACKSPACE_KBCODE 0x00000008
1585 #define BBTK_DEL_KBCODE 0x0000007F
1586 #define BBTK_SPACE_KBCODE 0x00000020
1588 //=======================================================================
1589 void Interpreter::GetLineFromPrompt(std::string& s)
1594 unsigned int MAX_LINE_SIZE = 160;
1595 unsigned int MAX_HISTORY_SIZE = 100;
1597 char* newline = new char[MAX_LINE_SIZE];
1598 memset(newline,0,MAX_LINE_SIZE);
1599 char* histline = new char[MAX_LINE_SIZE];
1600 memset(histline,0,MAX_LINE_SIZE);
1602 char* line = newline;
1603 unsigned int hist = mHistory.size();
1609 read ( STDIN_FILENO, &c, 4) ;
1611 bbtkDebugMessage("debug",9,"[0x"<<std::hex<<c<<"]\n");
1613 // Printable character
1614 if ( (ind<MAX_LINE_SIZE-1) &&
1615 ( c >= BBTK_SPACE_KBCODE ) &&
1616 ( c < BBTK_DEL_KBCODE ))
1624 // delete the unused line
1630 // empty lines are not stored in from history
1633 // if history too long : delete oldest command
1634 if (mHistory.size()>MAX_HISTORY_SIZE)
1636 delete mHistory.front();
1637 mHistory.pop_front();
1639 mHistory.push_back(line);
1644 else if ( (ind>0) &&
1645 ((c == BBTK_BACKSPACE_KBCODE) ||
1646 (c == BBTK_DEL_KBCODE)) )
1654 // TODO : Command completion
1655 std::vector<std::string> commands;
1656 FindCommandsWithPrefix( line,ind,commands);
1657 if (commands.size()==1)
1659 std::string com = *commands.begin();
1660 for (; ind<com.size(); ++ind)
1662 PrintChar(com[ind]);
1668 else if (commands.size()>1)
1670 std::vector<std::string>::iterator i;
1672 for (i=commands.begin();i!=commands.end();++i)
1674 write(STDOUT_FILENO,(*i).c_str(),strlen((*i).c_str()));
1677 write(STDOUT_FILENO,"\n> ",3);
1678 //for (int j=0;j<ind;++j)
1680 write(STDOUT_FILENO,line,ind);
1684 // Arrow up : back in history
1685 else if (c==BBTK_UP_ARROW_KBCODE)
1689 // erase current line
1690 while (ind--) BackSpace();
1694 strcpy(histline,mHistory[hist]);
1698 write(STDOUT_FILENO,line,ind);
1701 // Arrow down : down in history
1702 else if (c==BBTK_DOWN_ARROW_KBCODE)
1704 if (hist<mHistory.size()-1)
1706 // erase current line
1707 while (ind--) BackSpace();
1711 strcpy(histline,mHistory[hist]);
1715 write(STDOUT_FILENO,line,ind);
1717 // end of history : switch back to newline
1718 else if (hist==mHistory.size()-1)
1720 // erase current line
1721 while (ind--) BackSpace();
1728 write(STDOUT_FILENO,line,ind);
1732 else if (line[ind]!=0 && c==BBTK_RIGHT_ARROW_KBCODE)
1734 PrintChar(line[ind]);
1739 else if (ind>0 && c==BBTK_LEFT_ARROW_KBCODE)
1747 write(STDOUT_FILENO,"\n\r",2);
1755 //=======================================================================
1756 void Interpreter::GetLineFromPrompt(std::string& s)
1782 //=======================================================================
1788 //=======================================================================
1789 void Interpreter::CommandLineInterpreter()
1791 bbtkDebugMessageInc("Interpreter",9,
1792 "Interpreter::CommandLineInterpreter()"<<std::endl);
1794 #ifdef BBTK_USE_TERMIOS_BASED_PROMPT
1795 // Initialise the tty in non canonical mode with no echo
1796 // oter remembers the previous settings to restore them after
1797 struct termios ter,oter;
1800 ter.c_lflag &= ~ECHO;
1801 ter.c_lflag &= ~ICANON;
1804 tcsetattr(0,TCSANOW,&ter);
1807 mCommandLine = true;
1809 bool insideComment = false; // for multiline comment
1815 GetLineFromPrompt(line);
1816 InterpretLine(line, insideComment);
1818 catch (QuitException e)
1820 bbtkMessage("Interpreter",1,"Interpreter : Quit"<<std::endl);
1823 catch (bbtk::Exception e)
1827 catch (std::exception& e)
1829 std::cerr << "* ERROR :: "<<e.what()<<" (not in bbtk)"<<std::endl;
1833 std::cerr << "* UNDEFINED ERROR (not a bbtk nor a std exception)"<<std::endl;
1838 #ifdef BBTK_USE_TERMIOS_BASED_PROMPT
1839 tcsetattr(0,TCSANOW,&oter);
1842 std::cout << "Good bye !" << std::endl;
1844 bbtkDebugDecTab("Interpreter",9);
1847 //=======================================================================
1848 void Interpreter::Graph(const std::vector<std::string>& words)
1851 bool system_display = true;
1853 if ( ( mUser != 0 ) && ( mUser->InterpreterUserHasOwnHtmlPageViewer() ) )
1854 system_display = false;
1856 if (words.size()==1)
1858 page = mVirtualExecuter->ShowGraph(".","0","0","","","",system_display);
1860 else if (words.size()==2)
1862 page = mVirtualExecuter->ShowGraph(words[1],"0","0","","","",system_display);
1864 else if (words.size()==3)
1866 page = mVirtualExecuter->ShowGraph(words[1],words[2],"0","","","",system_display);
1868 else if (words.size()==4)
1870 page = mVirtualExecuter->ShowGraph(words[1],words[2],words[3],"","","",system_display);
1872 else if (words.size()==5)
1874 page = mVirtualExecuter->ShowGraph(words[1],words[2],words[3],words[4],"","",system_display);
1876 else if (words.size()==6)
1878 page = mVirtualExecuter->ShowGraph(words[1],words[2],words[3],words[4],words[5],"",system_display);
1880 else if (words.size()==7)
1882 page = mVirtualExecuter->ShowGraph(words[1],words[2],words[3],words[4],words[5],words[6],system_display);
1885 if ( ( mUser != 0 ) && ( mUser->InterpreterUserHasOwnHtmlPageViewer() ) )
1886 mUser->InterpreterUserViewHtmlPage(page);
1889 //=======================================================================
1892 //=======================================================================
1893 void Interpreter::Index(const std::string& filename,
1894 const std::string& type)
1896 Factory::IndexEntryType t;
1897 if (type=="Initials") t = Factory::Initials;
1898 else if (type=="Categories") t = Factory::Categories;
1899 else if (type=="Packages") t = Factory::Packages;
1900 else if (type=="Adaptors") t = Factory::Adaptors;
1902 GetExecuter()->GetFactory()->CreateHtmlIndex(t,filename);
1904 //=======================================================================
1907 //=======================================================================
1908 void Interpreter::NewGUI(const std::string& boxname,
1909 const std::string& instanceName)
1911 if (mRealExecuter.expired())
1913 bbtkError("command 'newgui' cannot be compiled yet");
1916 std::string typeName = instanceName+"Type";
1917 std::stringstream* s = new std::stringstream;
1918 // create the complex box
1919 (*s) << "define "<<typeName<<std::endl;
1920 // (*s) << " description 'Automatically generated user interface for the box "
1921 // << boxname << "'" <<std::endl;
1922 // create the Layout box
1923 (*s) << " load wx"<<std::endl;
1924 (*s) << " new LayoutLine layout"<<std::endl;
1925 // create the output 'Widget'
1926 (*s) << " output Widget layout.Widget Widget"<<std::endl;
1927 // the box change output
1928 (*s) << " new MultipleInputs change"<<std::endl;
1929 (*s) << " output BoxChange change.Out BoxChange"<<std::endl;
1931 // Browse the inputs of the box in order to find which ones are not
1932 // connected and can be adapted from a widget adaptor
1933 // vector which stores the list of inputs of the box which must be connected
1934 std::vector<std::string> in;
1936 Factory::Pointer F = mVirtualExecuter->GetFactory();
1938 Package::Pointer user = F->GetPackage("user");
1940 ComplexBlackBoxDescriptor::Pointer workspace =
1941 mRealExecuter.lock()->GetCurrentDescriptor();
1946 bbtkError("Interpreter::CreateGUI : could not access the executer currently defined complex box");
1951 (ComplexBlackBoxDescriptor::Pointer)(user->GetBlackBoxMap().find("workspace")->second.get());
1954 BlackBox::Pointer box = workspace->GetPrototype()->bbGetBlackBox(boxname);
1955 // BlackBox::InputConnectorMapType incm = box->bbGetInputConnectorMap();
1957 BlackBox::InputConnectorMapType::iterator i;
1958 for (i=box->bbGetInputConnectorMap().begin();
1959 i!=box->bbGetInputConnectorMap().end();
1962 // If the input is connected : continue
1963 if (i->second->IsConnected()) continue;
1964 // Get the input descriptor
1965 const BlackBoxInputDescriptor* d = box->bbGetDescriptor()->GetInputDescriptor(i->first);
1966 // If it is a "system" input : skip it
1967 if ( ( d->GetCreatorTypeInfo() == typeid(AtomicBlackBoxDescriptor)) ||
1968 ( d->GetCreatorTypeInfo() == typeid(WxBlackBoxDescriptor)) )
1971 std::string widget,adaptor;
1972 // try to find a widget adaptor
1973 if (F->FindWidgetAdaptor(DataInfo(d->GetTypeInfo(),""),
1977 // command to create the adaptor
1978 (*s) << " new "<<adaptor<<" "<<i->first<<std::endl;
1979 // Sets the label of the widget adaptor to the name of the input
1980 (*s) << " set "<<i->first<<".Label "<<i->first<<std::endl;
1981 // Sets the initial value of the widget to the value of the input
1982 (*s) << " set "<<i->first<<".In \" "
1983 <<box->bbGetInputAsString(i->first)<<"\""
1985 // store the input name
1986 in.push_back(i->first);
1987 (*s) << " connect "<<i->first<<".Widget layout.Widget"<<in.size()<<std::endl;
1988 //<i->first<<"'"<<std::endl;
1989 (*s) << " connect "<<i->first<<".BoxChange change.In"<<in.size()<<std::endl;
1991 // try to find a two pieces adaptor
1992 else if (F->FindWidgetAdaptor2(DataInfo(d->GetTypeInfo(),""),
1996 // command to create the widget
1997 (*s) << " new "<<widget<<" "<<i->first<<"Widget"<<std::endl;
1998 // command to create the adaptor
1999 (*s) << " new "<<adaptor<<" "<<i->first<<std::endl;
2001 (*s) << " connect "<<i->first<<"Widget.Out "
2002 <<i->first<<".In"<<std::endl;
2003 // Sets the label of the widget adaptor to the name of the input
2004 (*s) << " set "<<i->first<<"Widget.Label "<<i->first<<std::endl;
2005 // Sets the initial value of the widget to the value of the input
2006 (*s) << " set "<<i->first<<"Widget.In \" "
2007 <<box->bbGetInputAsString(i->first)<<"\""<< std::endl;
2008 // store the input name
2009 in.push_back(i->first);
2010 (*s) << " connect "<<i->first<<"Widget.Widget layout.Widget"<<in.size()<<std::endl;
2011 //<i->first<<"'"<<std::endl;
2012 (*s) << " connect "<<i->first<<"Widget.BoxChange change.In"<<in.size()<<std::endl;
2015 // try to find an adaptor from string
2016 // If found then can create a text input which
2017 // will be automatically adapted
2018 else if (F->FindAdaptor(DataInfo(typeid(std::string),""),
2022 // command to create the adaptor
2023 (*s) << " new InputText "<<i->first<<std::endl;
2024 // Sets the label of the widget adaptor to the name of the input
2025 (*s) << " set "<<i->first<<".Title "<<i->first<<std::endl;
2026 // Sets the initial value of the widget to the value of the input
2027 (*s) << " set "<<i->first<<".In \" "
2028 <<box->bbGetInputAsString(i->first)<<"\""<< std::endl;
2029 // store the input name
2030 in.push_back(i->first);
2031 (*s) << " connect "<<i->first<<".Widget layout.Widget"<<in.size()<<std::endl;
2032 //<i->first<<"'"<<std::endl;
2033 (*s) << " connect "<<i->first<<".BoxChange change.In"<<in.size()<<std::endl;
2042 // command to create the output
2043 (*s) << " output "<<i->first<<" "
2044 <<i->first<<".Out "<<i->first<<std::endl;
2045 // <<" Output of the widget which allows to set "
2049 // Inputs for window properties
2050 (*s) << " input WinTitle layout.WinTitle Title"<<std::endl;
2051 (*s) << " input WinWidth layout.WinWidth Width"<<std::endl;
2052 (*s) << " input WinHeight layout.WinHeight Height"<<std::endl;
2053 (*s) << " input WinDialog layout.WinDialog Dialog"<<std::endl;
2054 (*s) << " input WinHide layout.WinHide Hide"<<std::endl;
2058 // Execute the box executes the layout
2059 (*s) << " exec layout" << std::endl;
2060 (*s) << "endefine" << std::endl;
2061 // (*s) << "help "<< typeName<< std::endl;
2062 // instanciate the box and connect it
2063 (*s) << "new "<<typeName<<" "<<instanceName<<std::endl;
2065 std::vector<std::string>::iterator j;
2066 for (j=in.begin();j!=in.end();++j)
2069 (*s) << "connect "<<instanceName<<"."<<*j<<" "
2070 << boxname<<"."<<*j<<std::endl;
2072 // That's all folks ! now execute the commands :
2075 //=======================================================================
2079 //==========================================================================
2080 void Interpreter::Debug(const std::string& name)
2082 if ((name.length()==2)&&(name[0]=='-'))
2086 bbtk::StaticInitTime::PrintObjectListInfo = true;
2090 // int o = MessageManager::GetMessageLevel("debug");
2091 // if (o<2) MessageManager::SetMessageLevel("debug",2);
2092 mVirtualExecuter->GetFactory()->CheckPackages();
2093 // MessageManager::SetMessageLevel("debug",o);
2098 Object:: PrintObjectListInfo(name);
2101 //==========================================================================
2102 //==========================================================================
2103 std::string Interpreter::GetObjectName() const
2105 return std::string("Interpreter");
2107 //==========================================================================
2109 //==========================================================================
2110 std::string Interpreter::GetObjectInfo() const
2112 std::stringstream i;
2115 //==========================================================================
2117 //==========================================================================
2118 size_t Interpreter::GetObjectSize() const
2120 size_t s = Superclass::GetObjectSize();
2121 s += Interpreter::GetObjectInternalSize();
2124 //==========================================================================
2125 //==========================================================================
2126 size_t Interpreter::GetObjectInternalSize() const
2128 size_t s = sizeof(Interpreter);
2131 //==========================================================================
2132 //==========================================================================
2133 size_t Interpreter::GetObjectRecursiveSize() const
2135 size_t s = Superclass::GetObjectRecursiveSize();
2136 s += Interpreter::GetObjectInternalSize();
2137 s += mVirtualExecuter->GetObjectRecursiveSize();
2140 //==========================================================================