1 /*=========================================================================
4 Module: $RCSfile: bbtkInterpreter.cxx,v $ $
6 Date: $Date: 2008/04/18 12:59:15 $
7 Version: $Revision: 1.60 $
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()"<<std::endl);
46 return MakePointer(new Interpreter(cpp_file));
48 //=======================================================================
50 //=======================================================================
51 Interpreter::Interpreter(const std::string& cpp_file)
59 bbtk::MessageManager::RegisterMessageType("Echo","Level>0 : Prints the 'echo' commands of the user.\n\tLevel>1 : Prints the command being interpreted",1);
60 bbtk::MessageManager::RegisterMessageType("Interpreter","Messages of the interpreter",0);
61 bbtkDebugMessageInc("Interpreter",9,"Interpreter::Interpreter()" <<std::endl);
63 if (cpp_file.size()!=0)
65 mExecuter = boost::static_pointer_cast<VirtualExec>(bbtk::Transcriptor::New(cpp_file));
69 mExecuter = boost::static_pointer_cast<VirtualExec>(bbtk::Executer::New());
72 // Lock this pointer or will auto-destruct !!
73 mExecuter->SetInterpreter(MakePointer(this,true));
75 // For the time being, comment out previous line, and
76 // uncomment next line to check Transcriptor
78 //mExecuter = new bbtk::Transcriptor("GeneratedProgram.txt");
80 // Builds the commands dict
87 info.syntax = "new <type> <name>";
88 info.help = "Creates a new black box of type <type> with name <name>";
89 mCommandDict[info.keyword] = info;
91 info.keyword = "delete";
95 info.syntax = "delete <box>";
96 info.help = "Deletes the black box of name <box>";
97 mCommandDict[info.keyword] = info;
99 info.keyword = "newgui";
103 info.syntax = "newgui <box> <name>";
104 info.help = "Automatically creates a graphical user interface with name <name> for the black box <box> and connects it to the box inputs";
105 mCommandDict[info.keyword] = info;
107 info.keyword = "connect";
110 info.code = cConnect;
111 info.syntax = "connect <box1.output> <box2.input>";
112 info.help = "Connects the ouput <output> of black box <box1> to the input <input> of black box <box2>";
113 mCommandDict[info.keyword] = info;
115 info.keyword = "print";
119 info.syntax = "print <string>";
120 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').";
121 mCommandDict[info.keyword] = info;
123 info.keyword = "exec";
127 info.syntax = "exec <box | 'freeze' | 'unfreeze' >";
128 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.";
129 mCommandDict[info.keyword] = info;
131 info.keyword = "package";
134 info.code = cPackage;
135 info.syntax = "package <name>";
136 info.help = "Begins the definition of a package.";
137 mCommandDict[info.keyword] = info;
139 info.keyword = "endpackage";
142 info.code = cEndPackage;
143 info.syntax = "endpackage";
144 info.help = "Ends the definition of a package.";
145 mCommandDict[info.keyword] = info;
147 info.keyword = "define";
151 info.syntax = "define <type> [<package>]";
152 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.";
153 mCommandDict[info.keyword] = info;
155 info.keyword = "endefine";
158 info.code = cEndDefine;
159 info.syntax = "endefine";
160 info.help = "Ends the definition of a new type of complex black box";
161 mCommandDict[info.keyword] = info;
163 info.keyword = "kind";
167 info.syntax = "kind <ADAPTOR|DEFAULT_ADAPTOR|WIDGET_ADAPTOR|DEFAULT_WIDGET_ADAPTOR>";
168 info.help = "Sets the kind of the currently defined complex black box";
169 mCommandDict[info.keyword] = info;
171 info.keyword = "input";
175 info.syntax = "input <name> <box.input> <help>";
176 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";
177 mCommandDict[info.keyword] = info;
179 info.keyword = "output";
183 info.syntax = "output <name> <box.output> <help>";
184 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";
185 mCommandDict[info.keyword] = info;
187 info.keyword = "set";
191 info.syntax = "set <box.input> <value>";
192 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";
193 mCommandDict[info.keyword] = info;
195 info.keyword = "config"; // JPR
199 info.syntax = "config";
200 info.help = "Prints the value of all configuration parameters";
201 mCommandDict[info.keyword] = info;
203 info.keyword = "index"; // LG
208 info.syntax = "index [<filename> ['Initials'(default)|'Packages'|'Categories'|'Adaptors']]";
209 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.";
210 mCommandDict[info.keyword] = info;
212 info.keyword = "reset";
216 info.syntax = "reset";
217 info.help = "Deletes all boxes and unloads all packages (bbi is reset to its start state)";
218 mCommandDict[info.keyword] = info;
220 info.keyword = "author";
224 info.syntax = "author <string>";
225 info.help = "Adds the string <string> to the author information of the black box being defined";
226 mCommandDict[info.keyword] = info;
228 info.keyword = "category"; //JP
231 info.code = cCategory;
232 info.syntax = "category <list of items, separated by ;>";
233 info.help = "Adds the string <string> to the category information of the black box being defined";
234 mCommandDict[info.keyword] = info;
236 info.keyword = "description";
239 info.code = cDescription;
240 info.syntax = "description <string>";
241 info.help = "Adds the string <string> to the descriptive information of the black box being defined";
242 mCommandDict[info.keyword] = info;
244 info.keyword = "help";
248 info.syntax = "help";
249 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>";
250 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.";
251 mCommandDict[info.keyword] = info;
253 info.keyword = "message";
256 info.code = cMessage;
257 info.syntax = "message <kind> <level>";
258 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;
260 info.keyword = "include";
263 info.code = cInclude;
264 info.syntax = "include <filename> [source]";
265 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).";
266 mCommandDict[info.keyword] = info;
268 info.keyword = "quit";
272 info.syntax = "quit";
273 info.help = "Quits the program (during script execution it stops the complete execution)";
274 mCommandDict[info.keyword] = info;
276 info.keyword = "load";
280 info.syntax = "load <packagename>";
281 info.help = "Loads the black box package <packagename>";
282 mCommandDict[info.keyword] = info;
284 info.keyword = "unload";
288 info.syntax = "unload <packagename>";
289 info.help = "Unloads the black box package <packagename>";
290 mCommandDict[info.keyword] = info;
292 info.keyword = "graph";
296 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 ]]]]]]";
297 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')";
298 mCommandDict[info.keyword] = info;
300 info.keyword = "object";
304 info.syntax = "object <object name>";
305 info.help = "Provides debug info on object <object name>";
306 mCommandDict[info.keyword] = info;
309 info.keyword = "workspace";
312 info.code = cWorkspace;
313 info.syntax = "workspace < ( freeze | unfreeze ) | ( rename <newname> ) >";
314 info.help = "Configures the workspace.\n 'freeze' allow to block execution commands while keeping definition commands active. 'unfreeze' turns back the worspace in 'normal' mode.\n 'rename' allow to set a new name to the workspace.";
315 mCommandDict[info.keyword] = info;
318 bbtkDebugDecTab("Interpreter",9);
321 //=======================================================================
325 //=======================================================================
329 Interpreter::~Interpreter()
331 bbtkDebugMessageInc("Interpreter",9,"==> Interpreter::~Interpreter()" <<std::endl);
332 mExecuter = VirtualExec::Pointer();
333 bbtkDebugMessageInc("Interpreter",9,"<== Interpreter::~Interpreter()" <<std::endl);
335 //=======================================================================
338 InterpreterError::InterpreterError( const std::string& message,
340 const std::string& script_file,
343 : Exception("Interpreter",0,message),
344 mInScriptFile(in_script_file),
345 mScriptFile(script_file),
346 mScriptLine(script_line)
349 InterpreterError::InterpreterError( const Exception& excep,
351 const std::string& script_file,
355 mInScriptFile(in_script_file),
356 mScriptFile(script_file),
357 mScriptLine(script_line)
360 //=======================================================================
361 void Interpreter::CatchBbtkException( const bbtk::Exception& e )
365 bool in_script = false;
366 std::string file("");
368 if (mFileName.size()) {
369 std::ifstream* fs = dynamic_cast<std::ifstream*>(mFile.back());
370 if (fs!=0) in_script = true;
371 file = mFileName.back();
375 throw InterpreterError(e,in_script,file,line);
379 std::stringstream mess;
380 mess << "* ERROR : "<<e.GetMessage()<<std::endl;
381 if (mFileName.size()) {
382 mess << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
383 mess << "* LINE : "<<mLine.back()<<std::endl;
385 std::cerr << mess.str();
388 //=======================================================================
390 //=======================================================================
391 void Interpreter::CatchStdException( const std::exception& e )
395 bool in_script = false;
396 std::string file("");
398 if (mFileName.size()) {
399 std::ifstream* fs = dynamic_cast<std::ifstream*>(mFile.back());
400 if (fs!=0) in_script = true;
401 file = mFileName.back();
405 throw InterpreterError(e.what(),in_script,file,line);
409 std::stringstream mess;
410 mess << "* ERROR : "<<e.what()<<std::endl;
411 if (mFileName.size()) {
412 mess << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
413 mess << "* LINE : "<<mLine.back()<<std::endl;
415 std::cerr << mess.str();
418 //=======================================================================
420 //=======================================================================
421 void Interpreter::CatchUnknownException()
425 bool in_script = false;
426 std::string file("");
428 if (mFileName.size()) {
429 std::ifstream* fs = dynamic_cast<std::ifstream*>(mFile.back());
430 if (fs!=0) in_script = true;
431 file = mFileName.back();
435 throw InterpreterError("Unknown exception caught",
436 in_script,file,line);
440 std::stringstream mess;
441 mess << "* UNDEFINED ERROR (not a bbtk nor a std exception)"
443 if (mFileName.size()) {
444 mess << "* FILE : \""<<mFileName.back()<<"\""<<std::endl;
445 mess << "* LINE : "<<mLine.back()<<std::endl;
447 std::cerr << mess.str();
450 //=======================================================================
452 //=======================================================================
454 #define CATCH_MACRO \
455 catch (QuitException e) \
457 status = Interpreter_QUIT; \
458 if (mThrow) throw QuitException(); \
460 catch (bbtk::Exception e) \
462 status = Interpreter_ERROR; \
463 CatchBbtkException(e); \
465 catch (std::exception& e) \
467 status = Interpreter_ERROR; \
468 CatchStdException(e); \
472 status = Interpreter_ERROR; \
473 CatchUnknownException(); \
475 //=======================================================================
478 //=======================================================================
482 Interpreter::ExitStatus Interpreter::InterpretFile( const std::string& filename )
484 bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretFile(\""<<filename<<"\")"<<std::endl);
486 bool exm = mCommandLine;
487 mCommandLine = false;
489 ExitStatus status = Interpreter_OK;
493 SwitchToFile(filename);
495 bool insideComment = false; // for multiline comment
496 while (mFile.size()>0)
498 while (!mFile.back()->eof()) {
501 mFile.back()->getline(buf,500);
502 std::string str(buf);
503 int size=str.length();
504 if ( str[ size-1 ]==13 )
509 InterpretLine(str, insideComment);
518 bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretFile(\""<<filename<<"\")"<<std::endl);
519 bbtkDecTab("Interpreter",9);
525 //=======================================================================
528 //=======================================================================
532 Interpreter::ExitStatus
533 Interpreter::InterpretBuffer( std::stringstream* buffer )
535 bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretBuffer()"<<std::endl);
537 bool exm = mCommandLine;
538 mCommandLine = false;
540 ExitStatus status = Interpreter_OK;
544 SwitchToStream(buffer);
545 bool insideComment = false; // for multiline comment
546 while (mFile.size()>0)
548 while (!mFile.back()->eof()) {
551 mFile.back()->getline(buf,500);
552 std::string str(buf);
554 int size=str.length();
555 if ( str[ size-1 ]==13 )
560 InterpretLine(str, insideComment);
570 bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretBuffer()"<<std::endl);
571 bbtkDecTab("Interpreter",9);
576 //=======================================================================
578 //=======================================================================
579 /// Runs the interpretation of a command
580 Interpreter::ExitStatus Interpreter::InterpretLine( const std::string& line )
582 printf("EED Interpreter::InterpretLine %s \n", line.c_str() );
583 bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretLine('"<<line<<"')"<<std::endl);
585 ExitStatus status = Interpreter_OK;
589 bool insideComment = false;
590 InterpretLine(line, insideComment);
594 catch (QuitException e)
596 status = Interpreter_QUIT;
598 catch (bbtk::Exception e)
600 std::cerr << "* ERROR : "<<e.GetMessage()<<std::endl;
601 status = Interpreter_ERROR;
603 catch (std::exception& e)
605 std::cerr << "* ERROR : "<<e.what()<<" (not in bbtk)"<<std::endl;
606 status = Interpreter_ERROR;
611 << "* UNDEFINED ERROR (not a bbtk nor a std exception)"<<std::endl;
612 status = Interpreter_ERROR;
616 bbtkDebugMessage("Interpreter",9,"EO Interpreter::InterpretLine()"
618 bbtkDecTab("Interpreter",9);
624 //=======================================================================
628 void Interpreter::InterpretLine( const std::string& line, bool &insideComment )
630 bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretLine(\""<<line<<"\")"<<std::endl);
631 bbtkMessage("Echo",2,line<<std::endl);
633 std::vector<std::string> words;
634 SplitLine(line,words);
639 bbtkDebugDecTab("Interpreter",9);
643 // Single line comment : # or //
644 if ( words[0][0]=='#' || (words[0][0]=='/' && words[0][1]=='/') )
646 bbtkDebugDecTab("Interpreter",9);
647 bbtkMessage("Interpreter",9,"Comment"<<std::endl);
651 // Multi line comment ( /* ... */ ) -delimiters on different lines !-
653 if (words[0][0]=='/' && words[0][1]=='*')
655 bbtkDebugDecTab("Interpreter",9);
656 bbtkMessage("Interpreter",9,"In multiline comment"<<std::endl);
657 insideComment = true;
661 if (words[0][0]=='*' && words[0][1]=='/')
663 bbtkDebugDecTab("Interpreter",9);
664 bbtkMessage("Interpreter",9,"Out multiline comment"<<std::endl);
665 if ( !insideComment ) {
666 bbtkDebugDecTab("Interpreter",9);
667 bbtkMessage("Interpreter",9,"Comment mismatch : '*/' with no matching '/*'"<<std::endl);
669 insideComment = false;
675 bbtkDebugDecTab("Interpreter",9);
676 bbtkMessage("Interpreter",9,"Multiline Comment"<<std::endl);
681 CommandInfoType command;
682 InterpretCommand(words,command);
684 bbtkDebugMessage("Interpreter",9,
685 "Command='"<<command.keyword
686 <<"' code="<<command.code<<std::endl);
688 std::string left,right,left2,right2;
689 std::string filename;
690 switch (command.code)
693 mExecuter->Create(words[1],words[2]);
697 mExecuter->Destroy(words[1]);
701 Utilities::SplitAroundFirstDot(words[1],left,right);
702 Utilities::SplitAroundFirstDot(words[2],left2,right2);
703 mExecuter->Connect(left,right,left2,right2);
707 mExecuter->BeginPackage(words[1]);
711 mExecuter->EndPackage();
715 if (mFileName.size()>0)
717 filename = mIncludeFileName.back(); //Utilities::get_file_name(mFileName.back());
721 mExecuter->Define(words[1],"",filename);
725 mExecuter->Define(words[1],words[2],filename);
730 mExecuter->EndDefine();
734 mExecuter->Kind(words[1]);
738 mExecuter->Print(words[1]);
742 if (words[1]=="freeze")
743 mExecuter->SetNoExecMode(true);
744 else if (words[1]=="unfreeze")
745 mExecuter->SetNoExecMode(false);
747 mExecuter->Execute(words[1]);
751 Utilities::SplitAroundFirstDot(words[2],left,right);
752 mExecuter->DefineInput(words[1],left,right,words[3]);
756 Utilities::SplitAroundFirstDot(words[2],left,right);
757 mExecuter->DefineOutput(words[1],left,right,words[3]);
761 Utilities::SplitAroundFirstDot(words[1],left,right);
762 mExecuter->Set(left,right,words[2]);
766 mExecuter->Author(words[1]);
770 NewGUI(words[1],words[2]);
774 mExecuter->Category(words[1]);
779 Index("tmp_index.html");
780 else if (words.size()==2)
782 else if (words.size()==3)
783 Index(words[1],words[2]);
787 mExecuter->Description(words[1]);
797 mExecuter->HelpMessages();
801 sscanf(words[2].c_str(),"%d",&level);
802 mExecuter->SetMessageLevel(words[1],level);
815 this->mExecuter->Reset();
816 mFileNameHistory.clear();
822 InterpretFile(words[1]);
826 SwitchToFile(words[1]);
828 // if 'source' was given
831 GetExecuter()->SetCurrentFileName(words[1]);
836 GetExecuter()->LoadPackage(words[1]);
840 GetExecuter()->UnLoadPackage(words[1]);
844 throw QuitException();
848 if (words.size()==2) ObjectInfo(words[1]);
853 if (words.size() == 2)
855 if (words[1]=="freeze") mExecuter->SetNoExecMode(true);
856 else if (words[1]=="unfreeze") mExecuter->SetNoExecMode(false);
860 mExecuter->SetWorkspaceName(words[2]);
865 bbtkInternalError("should not reach here !!!");
868 bbtkDecTab("Interpreter",9);
870 //=======================================================================
876 //=======================================================================
880 void Interpreter::SplitLine ( const std::string& str, std::vector<std::string>& tokens)
882 bbtkDebugMessageInc("Interpreter",9,"Interpreter::SplitLine(\""<<str<<"\")"<<std::endl);
884 std::string delimiters = "\"";
885 std::vector<std::string> quote;
886 Utilities::SplitString(str,delimiters,quote);
889 std::vector<std::string>::iterator i;
890 for (i=quote.begin(); i!=quote.end(); )
892 Utilities::SplitString(*i,delimiters,tokens);
896 // bbtkDebugMessage("Interpreter",0,"\""<<*i<<"\""<<std::endl);
897 tokens.push_back(*i);
902 for (i=tokens.begin(); i!=tokens.end(); ++i)
904 bbtkDebugMessage("Interpreter",9,"["<<*i<<"] ");
906 bbtkDebugMessageCont("Interpreter",9,std::endl);
908 bbtkDebugDecTab("Interpreter",9);
910 //=======================================================================
915 //=======================================================================
920 void Interpreter::Print( const std::string& str)
922 if (mExecuter->GetNoExecMode()) return;
924 bbtkDebugMessageInc("Interpreter",9,"Interpreter::Print(\""<<str<<"\")"<<std::endl);
927 // InterpretLine ("load std")
928 // InterpretLine("new ConcatStrings _C_ ") -> trouver un nom unique : # commande
929 // InterpretLine("new Print _P_")
930 // InterpretLine("connect _C_.Out _P_.In")
934 std::vector<std::string> chains;
935 std::string delimiters("$");
937 // Skip delimiters at beginning.
938 std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
940 if (lastPos>0) is_text = false;
942 // Find first delimiter.
943 std::string::size_type pos = str.find_first_of(delimiters, lastPos);
945 while (std::string::npos != pos || std::string::npos != lastPos)
949 // Found a text token, add it to the vector.
950 chains.push_back(str.substr(lastPos, pos - lastPos));
951 // std::string token = str.substr(lastPos, pos - lastPos)
952 // InterpretLine("set _C_.In%num% %token%")
958 // is an output (between $$) : decode
959 std::string tok,box,output;
960 tok = str.substr(lastPos, pos - lastPos);
961 Utilities::SplitAroundFirstDot(tok,box,output);
962 chains.push_back( mExecuter->Get(box,output) );
964 // InterpretLine("connect %tok% _C_.In%num%")
967 // Skip delimiters. Note the "not_of"
968 lastPos = str.find_first_not_of(delimiters, pos);
969 // Find next delimiter
970 pos = str.find_first_of(delimiters, lastPos);
975 // InterpretLine("exec _P_")
976 // if (IS_IN_WORKSPACE) InterpretLine("delete _C_; delete _P_");
978 std::vector<std::string>::iterator i;
979 for (i= chains.begin(); i!=chains.end(); ++i)
981 // bbtkMessage("Echo",1,*i);
982 Utilities::SubsBackslashN(*i);
985 std::cout << std::endl;
986 bbtkDebugDecTab("Interpreter",9);
990 //=======================================================================
995 // ===================================================================================
997 void Interpreter::SwitchToFile( const std::string& name )
999 // Note : in the following :
1000 // name : the user supplied name
1001 // - abreviated name e.g. scr scr.bbs
1002 // - relative full name e.g. ./scr.bbs ../../scr.bbs
1003 // - absolute full name e.g. /home/usrname/proj/dir/scr.bbs
1004 // same for Windows, with c:, d: ...
1006 // use ./directory/subdir/scrname.bbs
1009 bbtkDebugMessageInc("Interpreter",9,"Interpreter::SwitchToFile( \""
1010 <<name<<"\")"<<std::endl);
1012 std::vector<std::string> script_paths;
1013 std::string fullPathScriptName; // full path script name
1014 std::string pkgname; // e.g. <scriptname>.bbs
1015 std::vector<std::string> Filenames;
1017 // The following is *NOT* a debug time message :
1018 // It's a user intended message.
1019 // Please don't remove it.
1020 bbtkMessage("Interpreter",1,
1021 "look for : [" << name
1022 << "]" << std::endl);
1026 pkgname = Utilities::ExtractScriptName(name,upath);
1028 bbtkMessage("Interpreter",3,
1029 "extract : pkgname [" << pkgname
1030 << "] upath [" << upath << "]" << std::endl);
1031 bool fullnameGiven = false;
1032 bool foundFile = false;
1034 // ==== "*" provided : load all scripts in given path
1035 // relative (e.g. std/boxes/*) or absolute
1040 std::stringstream* stream = new std::stringstream;
1041 //if (upath.size()!=0) // avoid troubles for "*"
1043 // ==== no path provided : look in root bbs path
1044 if (upath.size()==0)
1046 // bbtkMessage("Interpreter",1,
1047 script_paths.push_back( ConfigurationFile::GetInstance().Get_root_bbs_path() );
1049 // ==== absolute path provided
1050 else if (upath[0]=='/' || upath[1] == ':' )
1052 if ( Utilities::IsDirectory( upath ) )
1054 script_paths.push_back(upath);
1058 bbtkError("'"<<upath<<"' : directory does not exist");
1061 // ==== relative path provided : search all bbs path appended with
1062 // the relative path provided
1065 std::vector<std::string>::const_iterator i;
1066 for (i=ConfigurationFile::GetInstance().Get_bbs_paths().begin();
1067 i!=ConfigurationFile::GetInstance().Get_bbs_paths().end();
1070 std::string full_path(*i);
1071 // we *really* want '.' to be the current working directory
1072 if (full_path == ".") {
1073 char buf[2048]; // for getcwd
1074 char * currentDir = getcwd(buf, 2048);
1075 std::string cwd(currentDir);
1076 full_path = currentDir;
1079 full_path += ConfigurationFile::GetInstance().Get_file_separator();
1082 if ( Utilities::IsDirectory( full_path ) )
1084 script_paths.push_back(full_path);
1087 if (script_paths.empty())
1089 bbtkError("no '"<<upath<<"' subdir found in search paths"
1094 // === search paths list complete : now explore it
1097 std::vector<std::string>::iterator i;
1098 for (i=script_paths.begin();i!=script_paths.end();i++)// ==== relative name, iterate + load all .bbs files
1100 bbtkMessage("Interpreter",1,
1101 "--> Looking in '" << *i << "'" << std::endl);
1105 int nbFiles = Utilities::Explore(*i, false, Filenames);
1108 for (std::vector<std::string>::iterator j = Filenames.begin();
1109 j!= Filenames.end(); ++j)
1111 int lgr = (*j).size();
1113 continue; // ignore non .bbs file
1114 if ((*j).substr(lgr-4, 4) != ".bbs")
1117 (*stream) << "include \"" << *j << "\"\n";
1118 bbtkMessage("Interpreter",2,
1119 " --> Found '" << *j << "'" << std::endl);
1126 bbtkMessage("Interpreter",1,
1127 " --> No .bbs found"<< std::endl);
1131 bbtkMessage("Interpreter",1,
1132 " --> "<<nbBssFiles<<" .bbs found"<< std::endl);
1133 SwitchToStream(stream);
1136 //break; // a directory was found; we stop iterating
1137 // LG : No! We want all files included !
1141 //=============== end pkgname=="*" ===========
1144 // if name starts with a / or a . or contains : user is assumed to have passed a relative/absolute name
1145 // (not only a plain script name)
1146 // we trust him, and try to expland the directory name
1147 // WARNING : starting from current local directory : ./whatYouWant (./ mandatory!)
1149 if (name[0]=='/' || name[1] == ':' || name[0]=='.') // absolute path (linux/windows) or relative path
1152 // ===========================================================check user supplied location
1153 fullnameGiven = true;
1155 fullPathScriptName = Utilities::ExpandLibName(name, false);
1157 // allow user to always forget ".bbs"
1158 int l = fullPathScriptName.size();
1164 if (fullPathScriptName.substr(l-4, 4) != ".bbs")
1166 fullPathScriptName = fullPathScriptName + ".bbs";
1171 fullPathScriptName = fullPathScriptName + ".bbs";
1174 if ( Utilities::FileExists(fullPathScriptName))
1181 // =============================== iterate on the paths
1183 script_paths = ConfigurationFile::GetInstance().Get_bbs_paths();
1185 std::vector<std::string>::iterator i;
1186 for (i=script_paths.begin();i!=script_paths.end();++i)
1189 // we *really* want '.' to be the current working directory
1191 char buf[2048]; // for getcwd
1192 char * currentDir = getcwd(buf, 2048);
1193 std::string cwd(currentDir);
1197 fullPathScriptName = Utilities::MakePkgnameFromPath(path, name, true);
1199 // Check if library exists
1200 if ( ! Utilities::FileExists(fullPathScriptName) )
1202 // The following is *NOT* a debug time message :
1203 // It's a user intended message.
1204 // Please don't remove it.
1205 bbtkMessage("Interpreter",2,
1206 " [" <<fullPathScriptName <<"] : doesn't exist"
1208 continue; // try next path
1210 bbtkMessage("Interpreter",2,
1211 " [" <<fullPathScriptName
1212 <<"] : found" <<std::endl);
1214 break; // a script was found; we stop iterating
1216 } //------------------ // end for ( package_paths.begin();i!=package_paths.end() )
1222 if(fullPathScriptName == "")
1223 bbtkError("Path ["<<upath<<"] doesn't exist");
1225 bbtkError("Script ["<<fullPathScriptName<<"] not found");
1227 bbtkError("No ["<<pkgname<<".bbs] script found");
1231 LoadScript(fullPathScriptName,name);
1235 //=======================================================================
1238 //=======================================================================
1239 void Interpreter::SwitchToStream( std::stringstream* stream )
1241 mFile.push_back(stream);
1242 std::ostringstream buffer_name;
1244 buffer_name << "buffer_" ;
1246 if (mFileName.size()>0 )
1248 buffer_name << mFileName.back() << "_" << mLine.back();
1250 mFileName.push_back(buffer_name.str());
1251 mIncludeFileName.push_back(buffer_name.str());
1254 //=======================================================================
1256 //=======================================================================
1258 void Interpreter::LoadScript( std::string fullPathScriptName,
1259 std::string includeScriptName)
1261 Utilities::replace( fullPathScriptName ,
1262 INVALID_FILE_SEPARATOR , VALID_FILE_SEPARATOR);
1264 if (find(mFileNameHistory.begin(),
1265 mFileNameHistory.end(),
1266 fullPathScriptName)!=mFileNameHistory.end())
1272 s = new std::ifstream;
1273 s->open(fullPathScriptName.c_str());
1276 bbtkError("Could not open file ["<<fullPathScriptName<<"]");
1280 bbtkMessage("Interpreter",1," -->[" << fullPathScriptName
1281 << "] found" << std::endl);
1284 mFileName.push_back(fullPathScriptName);
1285 mFileNameHistory.push_back(fullPathScriptName);
1286 mIncludeFileName.push_back(includeScriptName);
1292 //=======================================================================
1296 void Interpreter::CloseCurrentFile()
1298 bbtkDebugMessage("Interpreter",9,"Interpreter::CloseCurrentFile()"
1301 if (mFile.size()==0)
1303 bbtkDebugMessage("Interpreter",9," -> no file left open"<<std::endl);
1307 bbtkDebugMessage("Interpreter",9," Closing file '"<<mFileName.back()<<"'"<<std::endl);
1309 std::ifstream* file = dynamic_cast<std::ifstream*>(mFile.back());
1310 if (file!=0) file->close();
1312 delete mFile.back();
1314 mFileName.pop_back();
1315 mIncludeFileName.pop_back();
1318 bbtkDebugMessage("Interpreter",9," Remains "
1320 <<" open"<<std::endl);
1321 bbtkDebugMessage("Interpreter",9,"EO Interpreter::CloseCurrentFile()"
1324 //=======================================================================
1326 //=======================================================================
1330 void Interpreter::CloseAllFiles()
1332 bbtkDebugMessage("Interpreter",9,"Interpreter::CloseAllFiles()"
1335 while (mFile.size() != 0)
1339 bbtkDebugMessage("Interpreter",9,"EO Interpreter::CloseAllFiles()"
1342 //=======================================================================
1346 //=======================================================================
1350 void Interpreter::InterpretCommand( const std::vector<std::string>& words,
1351 CommandInfoType& info )
1353 bbtkDebugMessageInc("Interpreter",9,"Interpreter::InterpretCommand(...)"<<std::endl);
1355 // searches the command keyword
1356 CommandDictType::iterator c;
1357 c = mCommandDict.find(words[0]);
1358 if ( c == mCommandDict.end() ) {
1359 bbtkError(words[0]<<" : unknown command");
1362 // tests the number of args
1363 if ( ( words.size()-1 < c->second.argmin ) ||
1364 ( words.size()-1 > c->second.argmax ) )
1366 HelpCommand(words[0]);
1367 bbtkError(words[0]<<" : wrong number of arguments");
1371 bbtkDecTab("Interpreter",9);
1373 //=======================================================================
1376 //=======================================================================
1377 /// Displays help on all the commands
1378 void Interpreter::Help(const std::vector<std::string>& words)
1380 unsigned int nbarg = words.size()-1;
1388 if (words[1]=="packages")
1390 GetExecuter()->GetFactory()->PrintPackages(true);
1395 HelpCommand(words[1]);
1397 catch (bbtk::Exception e)
1401 GetExecuter()->GetFactory()->HelpPackage(words[1]);
1405 ConfigurationFile::GetInstance().Get_doc_path();
1406 url += "/bbdoc/" + words[1] + "/index.html";
1407 if (Utilities::FileExists(url))
1409 mUser->InterpreterUserViewHtmlPage(url);
1413 catch (bbtk::Exception f)
1417 std::string package;
1418 GetExecuter()->GetFactory()->HelpBlackBox(words[1],package);
1422 ConfigurationFile::GetInstance().Get_doc_path();
1423 url += "/bbdoc/" + package + "/index.html";
1424 if (Utilities::FileExists(url))
1426 url += "#" + words[1];
1427 mUser->InterpreterUserViewHtmlPage(url);
1431 catch (bbtk::Exception g)
1435 GetExecuter()->ShowRelations(words[1],"0","9999");
1437 catch (bbtk::Exception h){
1438 bbtkError("\""<<words[1].c_str()
1439 <<"\" is not a known command, package, black box type or black box name");
1447 if (words[2]=="all")
1449 if ( words[1]=="packages" )
1451 GetExecuter()->GetFactory()->PrintPackages(true,true);
1456 GetExecuter()->GetFactory()->HelpPackage(words[1],true);
1458 catch (bbtk::Exception f)
1464 HelpCommand(words[0]);
1465 bbtkError(words[0]<<" : syntax error");
1470 bbtkError("Should not reach here !!!");
1473 //=======================================================================
1475 //===================================================================
1476 /// Displays the Configuration
1477 void Interpreter::Config() const
1479 ConfigurationFile::GetInstance().GetHelp(1);
1481 //===================================================================
1483 //=======================================================================
1484 /// Displays help on all the commands
1485 void Interpreter::HelpCommands()
1487 std::cout << "Available commands :" << std::endl;
1488 CommandDictType::iterator i;
1489 for ( i = mCommandDict.begin();
1490 i != mCommandDict.end();
1492 std::cout << " " << i->first << std::endl;
1493 // std::cout << " usage : " << i->second.syntax << std::endl;
1494 // std::cout << " " << i->second.help << std::endl;
1498 //=======================================================================
1501 //=======================================================================
1502 /// Displays help on a particular commands
1503 void Interpreter::HelpCommand(const std::string& s)
1505 CommandDictType::iterator c;
1506 c = mCommandDict.find(s);
1507 if ( c == mCommandDict.end() ) {
1508 bbtkError(s<<" : Unknown command");
1510 // std::cout << " " << s << " : "<< std::endl;
1511 // CommandParamDictType::iterator i;
1512 // for ( i = c->second.begin();
1513 // i != c->second.end();
1515 std::cout << " usage : " << c->second.syntax << std::endl;
1516 std::cout << " " << c->second.help << std::endl;
1519 //=======================================================================
1522 //=======================================================================
1523 /// Fills the vector commands with the commands which
1524 /// have the first n chars of buf for prefix
1525 /// TODO : skip initial spaces in buf and also return the position of first
1526 /// non blank char in buf
1527 void Interpreter::FindCommandsWithPrefix( char* buf,
1529 std::vector<std::string>& commands )
1531 CommandDictType::const_iterator i;
1532 for (i=mCommandDict.begin(); i!=mCommandDict.end(); ++i)
1534 if ((i->first).find(buf,0,n) == 0)
1535 commands.push_back(i->first);
1538 //=======================================================================
1542 //=======================================================================
1543 #ifdef BBTK_USE_TERMIOS_BASED_PROMPT
1545 inline void PrintChar(char c) { write(STDOUT_FILENO,&c,1); }
1546 inline void BackSpace() { write(STDOUT_FILENO,"\b \b",3); }
1548 // LG : KEYBOARD CODES AS SCANNED ON MY TTY : UNIVERSAL ?
1549 // IF NOT THE USER SHOULD BE ABLE TO CONFIGURE IT
1550 // E.G. STORE THIS IN bbtk_config.xml
1551 #define BBTK_UP_ARROW_KBCODE 0x00415B1B
1552 #define BBTK_DOWN_ARROW_KBCODE 0x00425B1B
1553 #define BBTK_RIGHT_ARROW_KBCODE 0x00435B1B
1554 #define BBTK_LEFT_ARROW_KBCODE 0x00445B1B
1555 #define BBTK_BACKSPACE_KBCODE 0x00000008
1556 #define BBTK_DEL_KBCODE 0x0000007F
1557 #define BBTK_SPACE_KBCODE 0x00000020
1559 //=======================================================================
1560 void Interpreter::GetLineFromPrompt(std::string& s)
1565 int MAX_LINE_SIZE = 160;
1566 int MAX_HISTORY_SIZE = 100;
1568 char* newline = new char[MAX_LINE_SIZE];
1569 memset(newline,0,MAX_LINE_SIZE);
1570 char* histline = new char[MAX_LINE_SIZE];
1571 memset(histline,0,MAX_LINE_SIZE);
1573 char* line = newline;
1574 int hist = mHistory.size();
1580 read ( STDIN_FILENO, &c, 4) ;
1582 bbtkDebugMessage("Debug",9,"[0x"<<std::hex<<c<<"]\n");
1584 // Printable character
1585 if ( (ind<MAX_LINE_SIZE-1) &&
1586 ( c >= BBTK_SPACE_KBCODE ) &&
1587 ( c < BBTK_DEL_KBCODE ))
1595 // delete the unused line
1601 // empty lines are not stored in from history
1604 // if history too long : delete oldest command
1605 if (mHistory.size()>MAX_HISTORY_SIZE)
1607 delete mHistory.front();
1608 mHistory.pop_front();
1610 mHistory.push_back(line);
1615 else if ( (ind>0) &&
1616 ((c == BBTK_BACKSPACE_KBCODE) ||
1617 (c == BBTK_DEL_KBCODE)) )
1625 // TODO : Command completion
1626 std::vector<std::string> commands;
1627 FindCommandsWithPrefix( line,ind,commands);
1628 if (commands.size()==1)
1630 std::string com = *commands.begin();
1631 for (; ind<com.size(); ++ind)
1633 PrintChar(com[ind]);
1639 else if (commands.size()>1)
1641 std::vector<std::string>::iterator i;
1643 for (i=commands.begin();i!=commands.end();++i)
1645 write(STDOUT_FILENO,(*i).c_str(),strlen((*i).c_str()));
1648 write(STDOUT_FILENO,"\n> ",3);
1649 //for (int j=0;j<ind;++j)
1651 write(STDOUT_FILENO,line,ind);
1655 // Arrow up : back in history
1656 else if (c==BBTK_UP_ARROW_KBCODE)
1660 // erase current line
1661 while (ind--) BackSpace();
1665 strcpy(histline,mHistory[hist]);
1669 write(STDOUT_FILENO,line,ind);
1672 // Arrow down : down in history
1673 else if (c==BBTK_DOWN_ARROW_KBCODE)
1675 if (hist<mHistory.size()-1)
1677 // erase current line
1678 while (ind--) BackSpace();
1682 strcpy(histline,mHistory[hist]);
1686 write(STDOUT_FILENO,line,ind);
1688 // end of history : switch back to newline
1689 else if (hist==mHistory.size()-1)
1691 // erase current line
1692 while (ind--) BackSpace();
1699 write(STDOUT_FILENO,line,ind);
1703 else if (line[ind]!=0 && c==BBTK_RIGHT_ARROW_KBCODE)
1705 PrintChar(line[ind]);
1710 else if (ind>0 && c==BBTK_LEFT_ARROW_KBCODE)
1718 write(STDOUT_FILENO,"\n\r",2);
1726 //=======================================================================
1727 void Interpreter::GetLineFromPrompt(std::string& s)
1753 //=======================================================================
1759 //=======================================================================
1760 void Interpreter::CommandLineInterpreter()
1762 bbtkDebugMessageInc("Interpreter",9,
1763 "Interpreter::CommandLineInterpreter()"<<std::endl);
1765 #ifdef BBTK_USE_TERMIOS_BASED_PROMPT
1766 // Initialise the tty in non canonical mode with no echo
1767 // oter remembers the previous settings to restore them after
1768 struct termios ter,oter;
1771 ter.c_lflag &= ~ECHO;
1772 ter.c_lflag &= ~ICANON;
1775 tcsetattr(0,TCSANOW,&ter);
1778 mCommandLine = true;
1780 bool insideComment = false; // for multiline comment
1786 GetLineFromPrompt(line);
1787 InterpretLine(line, insideComment);
1789 catch (QuitException e)
1791 bbtkMessage("Interpreter",1,"Interpreter : Quit"<<std::endl);
1794 catch (bbtk::Exception e)
1798 catch (std::exception& e)
1800 std::cerr << "* ERROR :: "<<e.what()<<" (not in bbtk)"<<std::endl;
1804 std::cerr << "* UNDEFINED ERROR (not a bbtk nor a std exception)"<<std::endl;
1809 #ifdef BBTK_USE_TERMIOS_BASED_PROMPT
1810 tcsetattr(0,TCSANOW,&oter);
1813 std::cout << "Good bye !" << std::endl;
1815 bbtkDebugDecTab("Interpreter",9);
1818 //=======================================================================
1819 void Interpreter::Graph(const std::vector<std::string>& words)
1822 bool system_display = true;
1824 if ( ( mUser != 0 ) && ( mUser->InterpreterUserHasOwnHtmlPageViewer() ) )
1825 system_display = false;
1827 if (words.size()==1)
1829 page = mExecuter->ShowGraph(".","0","0","","","",system_display);
1831 else if (words.size()==2)
1833 page = mExecuter->ShowGraph(words[1],"0","0","","","",system_display);
1835 else if (words.size()==3)
1837 page = mExecuter->ShowGraph(words[1],words[2],"0","","","",system_display);
1839 else if (words.size()==4)
1841 page = mExecuter->ShowGraph(words[1],words[2],words[3],"","","",system_display);
1843 else if (words.size()==5)
1845 page = mExecuter->ShowGraph(words[1],words[2],words[3],words[4],"","",system_display);
1847 else if (words.size()==6)
1849 page = mExecuter->ShowGraph(words[1],words[2],words[3],words[4],words[5],"",system_display);
1851 else if (words.size()==7)
1853 page = mExecuter->ShowGraph(words[1],words[2],words[3],words[4],words[5],words[6],system_display);
1856 if ( ( mUser != 0 ) && ( mUser->InterpreterUserHasOwnHtmlPageViewer() ) )
1857 mUser->InterpreterUserViewHtmlPage(page);
1860 //=======================================================================
1863 //=======================================================================
1864 void Interpreter::Index(const std::string& filename,
1865 const std::string& type)
1867 Factory::IndexEntryType t;
1868 if (type=="Initials") t = Factory::Initials;
1869 else if (type=="Categories") t = Factory::Categories;
1870 else if (type=="Packages") t = Factory::Packages;
1871 else if (type=="Adaptors") t = Factory::Adaptors;
1873 GetExecuter()->GetFactory()->CreateHtmlIndex(t,filename);
1875 //=======================================================================
1878 //=======================================================================
1879 void Interpreter::NewGUI(const std::string& boxname,
1880 const std::string& instanceName)
1882 std::string typeName = instanceName+"Type";
1883 std::stringstream* s = new std::stringstream;
1884 // create the complex box
1885 (*s) << "define "<<typeName<<std::endl;
1886 // (*s) << " description 'Automatically generated user interface for the box "
1887 // << boxname << "'" <<std::endl;
1888 // create the Layout box
1889 (*s) << " load wx"<<std::endl;
1890 (*s) << " new LayoutLine layout"<<std::endl;
1891 // create the output 'Widget'
1892 (*s) << " output Widget layout.Widget Widget"<<std::endl;
1893 // the box change output
1894 (*s) << " new MultipleInputs change"<<std::endl;
1895 (*s) << " output BoxChange change.Out BoxChange"<<std::endl;
1897 // Browse the inputs of the box in order to find which ones are not
1898 // connected and can be adapted from a widget adaptor
1899 // vector which stores the list of inputs of the box which must be connected
1900 std::vector<std::string> in;
1902 Factory::Pointer F = mExecuter->GetFactory();
1904 Package::Pointer user = F->GetPackage("user");
1906 ComplexBlackBoxDescriptor::Pointer workspace = mExecuter->GetWorkspace();
1911 bbtkError("Interpreter::CreateGUI : could not access the executer workspace");
1916 (ComplexBlackBoxDescriptor::Pointer)(user->GetBlackBoxMap().find("workspace")->second.get());
1919 BlackBox::Pointer box = workspace->GetPrototype()->bbGetBlackBox(boxname);
1920 // BlackBox::InputConnectorMapType incm = box->bbGetInputConnectorMap();
1922 BlackBox::InputConnectorMapType::iterator i;
1923 for (i=box->bbGetInputConnectorMap().begin();
1924 i!=box->bbGetInputConnectorMap().end();
1927 // If the input is connected : continue
1928 if (i->second->IsConnected()) continue;
1929 // Get the input descriptor
1930 const BlackBoxInputDescriptor* d = box->bbGetDescriptor()->GetInputDescriptor(i->first);
1931 // If it is a "system" input : skip it
1932 if ( ( d->GetCreatorTypeInfo() == typeid(AtomicBlackBoxDescriptor)) ||
1933 ( d->GetCreatorTypeInfo() == typeid(WxBlackBoxDescriptor)) )
1936 std::string widget,adaptor;
1937 // try to find a widget adaptor
1938 if (F->FindWidgetAdaptor(DataInfo(d->GetTypeInfo(),""),
1942 // command to create the adaptor
1943 (*s) << " new "<<adaptor<<" "<<i->first<<std::endl;
1944 // Sets the label of the widget adaptor to the name of the input
1945 (*s) << " set "<<i->first<<".Label "<<i->first<<std::endl;
1946 // Sets the initial value of the widget to the value of the input
1947 (*s) << " set "<<i->first<<".In \" "
1948 <<box->bbGetInputAsString(i->first)<<"\""
1950 // store the input name
1951 in.push_back(i->first);
1952 (*s) << " connect "<<i->first<<".Widget layout.Widget"<<in.size()<<std::endl;
1953 //<i->first<<"'"<<std::endl;
1954 (*s) << " connect "<<i->first<<".BoxChange change.In"<<in.size()<<std::endl;
1956 // try to find a two pieces adaptor
1957 else if (F->FindWidgetAdaptor2(DataInfo(d->GetTypeInfo(),""),
1961 // command to create the widget
1962 (*s) << " new "<<widget<<" "<<i->first<<"Widget"<<std::endl;
1963 // command to create the adaptor
1964 (*s) << " new "<<adaptor<<" "<<i->first<<std::endl;
1966 (*s) << " connect "<<i->first<<"Widget.Out "
1967 <<i->first<<".In"<<std::endl;
1968 // Sets the label of the widget adaptor to the name of the input
1969 (*s) << " set "<<i->first<<"Widget.Label "<<i->first<<std::endl;
1970 // Sets the initial value of the widget to the value of the input
1971 (*s) << " set "<<i->first<<"Widget.In \" "
1972 <<box->bbGetInputAsString(i->first)<<"\""<< std::endl;
1973 // store the input name
1974 in.push_back(i->first);
1975 (*s) << " connect "<<i->first<<"Widget.Widget layout.Widget"<<in.size()<<std::endl;
1976 //<i->first<<"'"<<std::endl;
1977 (*s) << " connect "<<i->first<<"Widget.BoxChange change.In"<<in.size()<<std::endl;
1980 // try to find an adaptor from string
1981 // If found then can create a text input which
1982 // will be automatically adapted
1983 else if (F->FindAdaptor(DataInfo(typeid(std::string),""),
1987 // command to create the adaptor
1988 (*s) << " new InputText "<<i->first<<std::endl;
1989 // Sets the label of the widget adaptor to the name of the input
1990 (*s) << " set "<<i->first<<".Title "<<i->first<<std::endl;
1991 // Sets the initial value of the widget to the value of the input
1992 (*s) << " set "<<i->first<<".In \" "
1993 <<box->bbGetInputAsString(i->first)<<"\""<< std::endl;
1994 // store the input name
1995 in.push_back(i->first);
1996 (*s) << " connect "<<i->first<<".Widget layout.Widget"<<in.size()<<std::endl;
1997 //<i->first<<"'"<<std::endl;
1998 (*s) << " connect "<<i->first<<".BoxChange change.In"<<in.size()<<std::endl;
2007 // command to create the output
2008 (*s) << " output "<<i->first<<" "
2009 <<i->first<<".Out "<<i->first<<std::endl;
2010 // <<" Output of the widget which allows to set "
2014 // Inputs for window properties
2015 (*s) << " input WinTitle layout.WinTitle Title"<<std::endl;
2016 (*s) << " input WinWidth layout.WinWidth Width"<<std::endl;
2017 (*s) << " input WinHeight layout.WinHeight Height"<<std::endl;
2018 (*s) << " input WinDialog layout.WinDialog Dialog"<<std::endl;
2019 (*s) << " input WinHide layout.WinHide Hide"<<std::endl;
2023 // Execute the box executes the layout
2024 (*s) << " exec layout" << std::endl;
2025 (*s) << "endefine" << std::endl;
2026 // (*s) << "help "<< typeName<< std::endl;
2027 // instanciate the box and connect it
2028 (*s) << "new "<<typeName<<" "<<instanceName<<std::endl;
2030 std::vector<std::string>::iterator j;
2031 for (j=in.begin();j!=in.end();++j)
2034 (*s) << "connect "<<instanceName<<"."<<*j<<" "
2035 << boxname<<"."<<*j<<std::endl;
2037 // That's all folks ! now execute the commands :
2040 //=======================================================================
2044 //==========================================================================
2045 void Interpreter::ObjectInfo(const std::string& name)
2047 Object:: PrintObjectInfo(name);
2049 //==========================================================================
2050 //==========================================================================
2051 std::string Interpreter::GetObjectName() const
2053 return std::string("Interpreter");
2055 //==========================================================================
2057 //==========================================================================
2058 std::string Interpreter::GetObjectInfo() const
2060 std::stringstream i;
2063 //==========================================================================
2065 //==========================================================================
2066 size_t Interpreter::GetObjectSize() const
2068 size_t s = Superclass::GetObjectSize();
2069 s += Interpreter::GetObjectInternalSize();
2072 //==========================================================================
2073 //==========================================================================
2074 size_t Interpreter::GetObjectInternalSize() const
2076 size_t s = sizeof(Interpreter);
2079 //==========================================================================
2080 //==========================================================================
2081 size_t Interpreter::GetObjectRecursiveSize() const
2083 size_t s = Superclass::GetObjectRecursiveSize();
2084 s += Interpreter::GetObjectInternalSize();
2085 s += mExecuter->GetObjectRecursiveSize();
2088 //==========================================================================