source: Sophya/trunk/SophyaLib/SysTools/commander.h@ 4063

Last change on this file since 4063 was 4063, checked in by ansari, 13 years ago

Introduction de la classe interface CE_VarListInterface et modifs classe CExpressionEvaluator pour permettre l'inclusion de variables nommees dans les expressions traitees par CExpressionEvaluator, adaptation de la classe Commander afin que les variables de l'interpreteur soit visible par l'evaluateur CExpressionEvaluator, Reza 27/04/2012

File size: 9.9 KB
RevLine 
[2446]1// This may look like C code, but it is really -*- C++ -*-
2// Classe interpreteur de commande pour piapp
3// Reza Aout 97 , Juillet,Aout 98
4// Octobre 2003: de PIext -> SysTools
5// LAL-IN2P3/CNRS DAPNIA/CEA
6
7#ifndef COMMANDER_H_SEEN
8#define COMMANDER_H_SEEN
9
10#include "machdefs.h"
11#include <iostream>
12#include <fstream>
13#include <string>
14#include <vector>
15#include <list>
16#include <stack>
17#include <map>
18#include <functional>
19
20#include "pdlmgr.h"
21#include "dvlist.h"
22#include "ctimer.h"
23
[2483]24namespace SOPHYA {
[2446]25
[2804]26////// Classe definissant l'interface pour un interpreteur de commande
[2446]27
[2598]28/*!
29 \ingroup SysTools
30 \brief Interface definition for a generic command interpreter.
31*/
[2446]32class CmdInterpreter {
33public:
34 virtual ~CmdInterpreter() {} ;
[2598]35//! Returns the interpreter's name
[2446]36 virtual string Name()=0;
[2598]37//! Method to be called in order to interpret a line or string.
[2446]38 virtual int Interpret(string& line)=0;
39};
40
41
[2804]42/////// Classe definissant l'interface pour un executeur de commande
43
[2598]44/*!
45 \ingroup SysTools
46 \brief Interface definition for command executor, to be used with Commander
[2446]47
[2598]48 A command is defined by a keyword and a number of argument
49*/
50
[2446]51class CmdExecutor {
52public:
53 virtual ~CmdExecutor() {} ;
54 // keyw : Le mot cle associe , args: Arguments de la commande
[2753]55 //! command execution method for a command defined by keyword and its arguments.
[2446]56 virtual int Execute(string& keyw, vector<string>& args, string& toks)=0;
[2943]57 //! Return true if the command \b keyw is thread compatible (can be executed in a separate thread)
[2753]58 virtual bool IsThreadable(string const & keyw) { return false; }
[2446]59};
60
61
62
63class CommanderBloc; // Bloc de type foreach / for de l'interpreteur Commander
64class CommanderScript; // Script de commandes defini ds l'interpreteur Commander
[2671]65class CommandExeThr; // Thread d'execution de commande
[2446]66
[2671]67//! A simple command interpreter with c-shell like syntax and dynamic load capability.
[2446]68
69class Commander : public CmdInterpreter {
70public:
71 static Commander* GetInterpreter();
72
[2955]73 Commander(bool fgsigzt=true);
[2446]74 virtual ~Commander();
75 virtual string Name();
76
[2466]77 virtual void AddHelpGroup(string& grp, string& desc);
[2446]78 virtual void RegisterCommand(string& keyw, string& usage, CmdExecutor * ce,
[2466]79 string& grp);
80 inline void RegisterCommand(string& keyw, string& usage, CmdExecutor * ce,
[3572]81 const char* grp)
[2466]82 { string sgrp = grp; RegisterCommand(keyw, usage, ce, sgrp); }
83
[2446]84 virtual void RegisterHelp(string& keyw, string& usage, string& grp);
85
86 virtual void LoadModule(string& fnameso, string& name);
87
88 virtual void AddInterpreter(CmdInterpreter * cl);
89 virtual void SelInterpreter(string& name);
90
91 virtual int Interpret(string& line);
[2671]92 virtual void StopExecution();
[2473]93
[2446]94 virtual int ExecuteCommand(string& keyw, vector<string>& args, string& toks);
95 virtual int ExecFile(string& file, vector<string>& args);
96 virtual int CShellExecute(string cmd);
97 virtual string& GetUsage(const string& kw);
98
[4034]99 inline void SetMaxLoopLimit(int_8 lim=0) { maxlooplimit_ = lim; }
100 inline int_8 GetMaxLoopLimit() { return maxlooplimit_; }
[2446]101
102 string GetCurrentPrompt() { return curprompt; }
103
104
105 virtual void HelptoLaTeX(string const & flnm);
106
[2943]107 //! return the current selected interpreter (default : this)
[2446]108 inline CmdInterpreter* CurrentInterpreter() { return(curcmdi); }
109
[2518]110 // ----- Action / gestion des variables propres de l'interpreteur
111 // Verifie l'existence de la variable nomme vn et retourne sa valeur ds vv
112 // Retourne false si la variable n'existe pas
113 virtual bool GetVar(string const & vn, string & vv);
114 virtual bool GetVar(string const & vn, int idx, string & vv);
115 virtual bool GetVar(string const & vn, vector<string> & vv);
116 virtual bool SetVar(string const & vn, string const & vv);
117 virtual bool SetVar(string const & vn, int idx, string const & vv);
118 virtual bool SetVar(string const & vn, vector<string> const & vv);
119 virtual bool CheckVarName(string const & vn);
120 virtual bool DeleteVar(string const & vn);
121 virtual void ListVar();
122 // Variables de l'environnement application
123 virtual bool GetVarApp(string const & vn, string & vv);
124 virtual bool SetVarApp(string const & vn, string const & vv);
125 virtual bool DeleteVarApp(string const & vn);
126 virtual void ListVarApp();
127 // Variables d'environnement globales
128 virtual bool GetVarEnv(string const & vn, string & vv);
129 virtual bool SetVarEnv(string const & vn, string const & vv);
130 virtual bool DeleteVarEnv(string const & vn);
131 virtual void ListVarEnv();
132
[2483]133 // Utilitaire pour decoupage en mot
[2446]134 static int LineToWords(string& line, string& kw, vector<string>& tokens,
[2518]135 vector<bool>& qottoks, string& toks, bool uq=true);
[2446]136protected:
[2473]137 virtual int ParseLineExecute(string& line, bool qw=true);
138
139 virtual int ExecuteCommandLine(string & keyw, vector<string> & args,
140 string & toks);
141
[2466]142 virtual bool CheckHelpGrp(string& grp, int& gid, string& desc);
143 inline bool CheckHelpGrp(string& grp, int& gid)
144 { string desc=""; return CheckHelpGrp(grp, gid, desc); }
145
[2473]146 virtual int SubstituteVars(string & s, string & s2);
[2446]147 int EvaluateTest(vector<string> & args,
148 string & line, bool & res);
149
[2518]150 // variable de l'interpreteur = valeur - accepte la syntaxe de type varname[index]
151 virtual bool SetVariable(string const & vn, string const & vv);
[2483]152 // Acces aux variables
153 virtual bool Var2Str(string const & vn, string & vv);
154 inline bool Var2Str(string const & vn, int idx, string & vv)
155 { return GetVar(vn, idx, vv); }
156 inline bool Var2Str(string const & vn, vector<string> & vv)
157 { return GetVar(vn, vv); }
158
[2473]159 virtual string GetTmpDir();
160
161 virtual void SetCurrentPrompt(const char* pr);
[2446]162 inline void SetCurrentPrompt(string const & pr) { SetCurrentPrompt(pr.c_str()); }
[2483]163 inline void SetDefaultPrompt(string const & pr) { defprompt = pr; }
[2446]164
165 virtual void ShowMessage(const char * msg, int att);
166
[4034]167 void PushStack(vector<string> * pargs);
168 inline void PushStack() { PushStack(NULL); return; }
169 inline void PushStack(vector<string> & args) { PushStack(&args); return; }
[2446]170 void PopStack(bool psta=true);
171
[2671]172 // Gestion des threads d'execution de commandes
173 void ListThreads();
[2955]174 void StopThr(uint_8 thrid, bool fgkill=true);
[2671]175 void CleanThrList();
176 void WaitThreads();
177
178// ------ Attributs et variables ------
[2446]179 CmdInterpreter* curcmdi;
180
181// Gestion des variables
[2483]182 typedef map< string, vector<string>, less<string> > CmdVarList;
183 CmdVarList variables;
[2446]184
185// Pour enregistrer la liste de commandes et leurs executeurs et le help
[2804]186/*! \cond Pour supprimer la documentation par doxygen */
187// Command executor registration - For Commander internal use
[2446]188 struct cmdex {int group; string us; CmdExecutor * cex; } ;
[2804]189// Help text registration - For Commander internal use
[2466]190 struct hgrpst {int gid; string desc; } ; // Identification+description d'un groupe de help
[2804]191 /*! \endcond */
192
[2466]193 typedef map<string, hgrpst, less<string> > CmdHGroup; // Liste des groupes de commandes
[2446]194 CmdHGroup cmdhgrp;
[2466]195 int cmdgrpid; // Numero de groupe courant
196 typedef map<string, cmdex, less<string> > CmdExmap;
197 CmdExmap cmdexmap; // Liste des commandes et leurs executeurs
198 CmdExmap helpexmap; // Pour les helps sans commande
[2671]199// Pour garder la liste des threads d'execution de commande
200 list<CommandExeThr *> CmdThrExeList;
201 uint_8 ThrId;
202
[2446]203// Pour garder la liste des modules
204 typedef map<string, PDynLinkMgr* , less<string> > Modmap;
205 Modmap modmap;
206
207// Pour garder la liste des interpreteur
208 typedef map<string, CmdInterpreter*, less<string> > InterpMap;
209 InterpMap interpmap;
210
211// Pour stocker les scripts definis ds l'interpreteur
212 typedef map<string, CommanderScript*, less<string> > ScriptList;
213 ScriptList mScripts; // Liste des scripts
214 CommanderScript* curscript; // Script en cours de definition
215
[2483]216 // Code de retour execution commande
217 int _xstatus;
218 // Valeur de retour (par l'instruction return) -
219 string _retstr;
220
221 // Pour stocker les alias definies par l'interpreteur
[2446]222 typedef map<string, string, less<string> > CmdStrList;
223 CmdStrList mAliases; // Liste des alias
224
[2483]225 // Le stack pour les arguments des .pic et des scripts
[2446]226 stack< vector<string> > ArgsStack;
[2483]227 // Stack pour les Prompts
[2446]228 stack<string> PromptStack;
229
[2483]230 // Gestion des blocs de commandes et tests (if)
[2446]231 stack< CommanderBloc * > CmdBlks; // Bloc de commande courant (foreach, ...)
[4034]232 int felevel_; // foreach-for level
233 int_8 maxlooplimit_; // Limite maximum des boucles
234 /*! \cond Pour supprimer la documentation par doxygen */
235 typedef struct {list<char> tstlist; list<char>::iterator tstresit; bool tstcurres; } TstStatus;
236 /*! \endcond */
237 stack< TstStatus > TestsStack; // Stack des resultats de test
238 list<char>::iterator tresit_; // Test courant
239 bool curtestresult_; // Resultat courant des tests
[2446]240
[2518]241 // Controle du flot d'execution
242 bool fgexebrk;
243
[2483]244 // Commande splitees sur plusieurs lignes
[2446]245 bool mulinefg; // Bloc multi-lignes (ligne suite)
246 string mulinecmd; // Commande multi-lignes
[2483]247
248 // Texte de prompt (attente de commande)
[2446]249 string spromptmul; // Prompt console avant multi-ligne
[2483]250 string curprompt; // Prompt courant
251 string defprompt; // Prompt par defaut
[2446]252
[2483]253 // Gestion d'historique, trace, timing des commandes
[2446]254 ofstream hist; // History file
255 bool histon; // True -> history file
256 bool trace; // Trace flag
257 bool timing; // Display CPU Time
258 Timer* gltimer; // pour Display CPU Time
[4063]259 bool varcexp; // true -> decodage nom de variables lors d'evaluation d'expression
[2483]260friend class CommanderBloc;
261friend class CommanderScript;
262
[2446]263};
264
[2483]265} // namespace SOPHYA
[2446]266
267/* end of ifdef COMMANDER_H_SEEN */
268#endif
269
Note: See TracBrowser for help on using the repository browser.