Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4VBasicShell.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// $Id$
28//
29
30#include "G4VBasicShell.hh"
31#include "G4StateManager.hh"
32#include "G4UIcommandTree.hh"
33#include "G4UIcommand.hh"
34#include "G4UIcommandStatus.hh"
35#include "G4UImanager.hh"
36#include <vector>
37#include <sstream>
38
40:currentDirectory("/")
41{
42}
43
45{
46}
47
48G4String G4VBasicShell::ModifyToFullPathCommand(const char* aCommandLine) const
49{
50 G4String rawCommandLine = aCommandLine;
51 if(rawCommandLine.isNull()||rawCommandLine(0)=='\0') return rawCommandLine;
52 G4String commandLine = rawCommandLine.strip(G4String::both);
53 G4String commandString;
54 G4String parameterString;
55 size_t i = commandLine.index(" ");
56 if( i != std::string::npos )
57 {
58 commandString = commandLine(0,i);
59 parameterString = " ";
60 parameterString += commandLine(i+1,commandLine.length()-(i+1));
61 }
62 else
63 { commandString = commandLine; }
64
65 G4String fullPathCommandLine
66 = ModifyPath( commandString )+parameterString;
67 return fullPathCommandLine;
68}
69
71{
72 return currentDirectory;
73}
74
76{
77 G4String aNewPrefix = newDir;
78 G4String newPrefix = aNewPrefix.strip(G4String::both);
79 G4String newDirectory = ModifyPath( newPrefix );
80 if( newDirectory( newDirectory.length() - 1 ) != '/' )
81 { newDirectory += "/"; }
82 if( FindDirectory( newDirectory.c_str() ) == NULL )
83 { return false; }
84 currentDirectory = newDirectory;
85 return true;
86}
87
89{
90 G4String aDirName = dirName;
91 G4String theDir = aDirName.strip(G4String::both);
92 G4String targetDir = ModifyPath( theDir );
93 if( targetDir( targetDir.length()-1 ) != '/' )
94 { targetDir += "/"; }
96 if( targetDir == "/" )
97 { return comTree; }
98 size_t idx = 1;
99 while( idx < targetDir.length()-1 )
100 {
101 size_t i = targetDir.index("/",idx);
102 comTree = comTree->GetTree(targetDir.substr(0,i+1).c_str());
103 if( comTree == NULL )
104 { return NULL; }
105 idx = i+1;
106 }
107 return comTree;
108}
109
110G4UIcommand* G4VBasicShell::FindCommand(const char* commandName) const
111{
112 G4String rawCommandLine = commandName;
113 G4String commandLine = rawCommandLine.strip(G4String::both);
114 G4String commandString;
115 size_t i = commandLine.index(" ");
116 if( i != std::string::npos )
117 { commandString = commandLine(0,i); }
118 else
119 { commandString = commandLine; }
120
121 G4String targetCom = ModifyPath(commandString);
122 return G4UImanager::GetUIpointer()->GetTree()->FindPath(targetCom);
123}
124
125G4String G4VBasicShell::ModifyPath(const G4String& tempPath) const
126{
127 if( tempPath.length() == 0 ) return tempPath;
128
129 G4String newPath = "";
130
131 // temporal full path
132 if( tempPath(0) == '/') newPath = tempPath;
133 else newPath = currentDirectory + tempPath;
134
135 // body of path...
136 while(1){
137 size_t idx = newPath.find("/./");
138 if( idx == G4String::npos) break;
139 newPath.erase(idx,2);
140 }
141
142 while(1) {
143 size_t idx = newPath.find("/../");
144 if( idx == G4String::npos) break;
145 if( idx == 0) {
146 newPath.erase(1,3);
147 continue;
148 }
149 size_t idx2 = newPath.find_last_of('/', idx-1);
150 if(idx2 != G4String::npos) newPath.erase(idx2, idx-idx2+3);
151 }
152
153 // end of path...
154 if(newPath(newPath.size()-3,3) == "/..") {
155 if( newPath.size() == 3) {
156 newPath = "/";
157 } else {
158 size_t idx = newPath.find_last_of('/', newPath.size()-4);
159 if(idx != G4String::npos) newPath.erase(idx+1);
160 }
161 }
162 if(newPath(newPath.size()-2,2) == "/.") newPath.erase(newPath.size()-1,1);
163
164 // truncate "/////" to "/"
165 while(1) {
166 size_t idx = newPath.find("//");
167 if( idx == G4String::npos) break;
168 newPath.erase(idx,1);
169 }
170
171 return newPath;
172}
173////////////////////////////////////////////
174// Method used for command completion //////
175////////////////////////////////////////////
177{
178 G4String rawCommandLine = commandName;
179 G4String commandLine = rawCommandLine.strip(G4String::both);
180 size_t i = commandLine.index(" ");
181 if( i != std::string::npos ) return rawCommandLine; // Already entering parameters,
182 // assume command path is correct.
183 G4String commandString = commandLine;
184 G4String targetCom = ModifyPath(commandString);
186 G4String value = FindMatchingPath(tree,targetCom);
187 if(value=="") return rawCommandLine;
188 return value;
189}
190
192 const G4String& aCommandPath)
193{
194 return aTree-> CompleteCommandPath(aCommandPath);
195}
196
197////////////////////////////////////////////
198// Method involving an interactive G4cout //
199////////////////////////////////////////////
200/***************************************************************************/
202/***************************************************************************/
203// Should be put in G4VBasicShell.
204/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
205{
206 if(aCommand.length()<2) return;
208 if(UI==NULL) return;
209 G4int commandStatus = UI->ApplyCommand(aCommand);
210 switch(commandStatus) {
212 break;
213 case fCommandNotFound:
214 G4cerr << "command not found" << G4endl;
215 break;
217 G4cerr << "illegal application state -- command refused" << G4endl;
218 break;
222 default:
223 G4cerr << "command refused (" << commandStatus << ")" << G4endl;
224 }
225}
226/***************************************************************************/
228 G4bool& exitSession, G4bool& exitPause
229)
230/***************************************************************************/
231/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
232{
234 if(UI==NULL) return;
235
236 G4String command = a_string;
237 command.strip(G4String::leading);
238
239 if( command(0) == '#' ) {
240
241 G4cout << command << G4endl;
242
243 } else if( command == "ls" || command(0,3) == "ls " ) {
244
245 ListDirectory( command );
246
247 } else if( command == "pwd" ) {
248
249 G4cout << "Current Working Directory : "
251
252 } else if( command == "cd" || command(0,3) == "cd ") {
253
254 ChangeDirectoryCommand ( command );
255
256 } else if( command == "help" || command(0,5) == "help ") {
257
258 TerminalHelp( command );
259
260 } else if( command(0) == '?' ) {
261
262 ShowCurrent( command );
263
264 } else if( command == "hist" || command == "history") {
265
266 G4int nh = UI->GetNumberOfHistory();
267 for(G4int i=0;i<nh;i++) {
268 G4cout << i << ": " << UI->GetPreviousCommand(i) << G4endl;
269 }
270
271 } else if( command(0) == '!' ) {
272
273 G4String ss = command(1,command.length()-1);
274 G4int vl;
275 const char* tt = ss;
276 std::istringstream is(tt);
277 is >> vl;
278 G4int nh = UI->GetNumberOfHistory();
279 if(vl>=0 && vl<nh) {
280 G4String prev = UI->GetPreviousCommand(vl);
281 G4cout << prev << G4endl;
283 } else {
284 G4cerr << "history " << vl << " is not found." << G4endl;
285 }
286
287 } else if( command == "exit" ) {
288
289 if( exitPause == false) { //In a secondary loop.
290 G4cout << "You are now processing RUN." << G4endl;
291 G4cout << "Please abort it using \"/run/abort\" command first" << G4endl;
292 G4cout << " and use \"continue\" command until the application" << G4endl;
293 G4cout << " becomes to Idle." << G4endl;
294 } else {
295 exitSession = true;
296 }
297
298 } else if( command == "cont" || command == "continue"){
299
300 exitPause = true;
301
302 } else {
303
305
306 }
307}
308
309void G4VBasicShell::ShowCurrent(const G4String& newCommand) const
310{
312 if(UI==NULL) return;
313 G4String comString = newCommand.substr(1,newCommand.length()-1);
314 G4String theCommand = ModifyToFullPathCommand(comString);
315 G4String curV = UI->GetCurrentValues(theCommand);
316 if( ! curV.isNull() ) {
317 G4cout << "Current value(s) of the parameter(s) : " << curV << G4endl;
318 }
319}
320
322{
324 if( newCommand.length() <= 3 ) {
325 prefix = "/";
326 } else {
327 G4String aNewPrefix = newCommand.substr(3, newCommand.length()-3);
328 prefix = aNewPrefix.strip(G4String::both);
329 }
330 if(!ChangeDirectory(prefix)) {
331 G4cout << "directory <" << prefix << "> not found." << G4endl;
332 }
333}
334
335void G4VBasicShell::ListDirectory(const G4String& newCommand) const
336{
337 G4String targetDir;
338 if( newCommand.length() <= 3 ) {
339 targetDir = GetCurrentWorkingDirectory();
340 } else {
341 G4String newPrefix = newCommand.substr(3, newCommand.length()-3);
342 targetDir = newPrefix.strip(G4String::both);
343 }
344 G4UIcommandTree* commandTree = FindDirectory( targetDir );
345 if( commandTree == NULL ) {
346 G4cout << "Directory <" << targetDir << "> is not found." << G4endl;
347 } else {
348 commandTree->ListCurrent();
349 }
350}
352{
354 if(UI==NULL) return;
355 G4UIcommandTree * treeTop = UI->GetTree();
356 size_t i = newCommand.index(" ");
357 if( i != std::string::npos )
358 {
359 G4String newValue = newCommand.substr(i+1, newCommand.length()-(i+1));
360 newValue.strip(G4String::both);
361 G4String targetCom = ModifyToFullPathCommand(newValue);
362 G4UIcommand* theCommand = treeTop->FindPath(targetCom);
363 if( theCommand != NULL )
364 {
365 theCommand->List();
366 return;
367 }
368 else
369 {
370 G4cout << "Command <" << newValue << " is not found." << G4endl;
371 return;
372 }
373 }
374
375 G4UIcommandTree * floor[10];
376 floor[0] = treeTop;
377 size_t iFloor = 0;
378 size_t prefixIndex = 1;
380 while( prefixIndex < prefix.length()-1 )
381 {
382 size_t ii = prefix.index("/",prefixIndex);
383 floor[iFloor+1] =
384 floor[iFloor]->GetTree(G4String(prefix(0,ii+1)));
385 prefixIndex = ii+1;
386 iFloor++;
387 }
388 floor[iFloor]->ListCurrentWithNum();
389 // 1998 Oct 2 non-number input
390 while(1){
391 //G4cout << G4endl << "Type the number ( 0:end, -n:n level back ) : "<<std::flush;
392 G4cout << G4endl << "Type the number ( 0:end, -n:n level back ) : "<<G4endl;
393 G4int j;
394 if(!GetHelpChoice(j)){
395 G4cout << G4endl << "Not a number, once more" << G4endl;
396 continue;
397 } else if( j < 0 ){
398 if( iFloor < (size_t)-j ) iFloor = 0;
399 else iFloor += j;
400 //iFloor += j;
401 //if( iFloor < 0 ) iFloor = 0;
402 floor[iFloor]->ListCurrentWithNum();
403 continue;
404 } else if(j == 0) {
405 break;
406 } else if( j > 0 ) {
407 G4int n_tree = floor[iFloor]->GetTreeEntry();
408 if( j > n_tree )
409 {
410 if( j <= n_tree + floor[iFloor]->GetCommandEntry() )
411 {
412 floor[iFloor]->GetCommand(j-n_tree)->List();
413 }
414 }
415 else
416 {
417 floor[iFloor+1] = floor[iFloor]->GetTree(j);
418 iFloor++;
419 floor[iFloor]->ListCurrentWithNum();
420 }
421 }
422 }
423 G4cout << "Exit from HELP." << G4endl << G4endl;
424 //G4cout << G4endl;
425 ExitHelp();
426}
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
@ fParameterOutOfCandidates
@ fCommandNotFound
@ fIllegalApplicationState
@ fParameterUnreadable
@ fCommandSucceeded
@ fParameterOutOfRange
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
str_size index(const char *, G4int pos=0) const
G4bool isNull() const
G4String strip(G4int strip_Type=trailing, char c=' ')
G4UIcommand * GetCommand(G4int i)
G4int GetTreeEntry() const
G4UIcommandTree * GetTree(G4int i)
void ListCurrentWithNum() const
G4UIcommand * FindPath(const char *commandPath) const
void ListCurrent() const
virtual void List()
Definition: G4UIcommand.cc:328
G4UIcommandTree * GetTree() const
Definition: G4UImanager.hh:197
G4int ApplyCommand(const char *aCommand)
Definition: G4UImanager.cc:369
G4int GetNumberOfHistory() const
Definition: G4UImanager.hh:220
G4String GetPreviousCommand(G4int i) const
Definition: G4UImanager.hh:222
G4String GetCurrentValues(const char *aCommand)
Definition: G4UImanager.cc:122
static G4UImanager * GetUIpointer()
Definition: G4UImanager.cc:51
G4UIcommand * FindCommand(const char *commandName) const
G4String FindMatchingPath(G4UIcommandTree *, const G4String &)
G4String ModifyToFullPathCommand(const char *aCommandLine) const
virtual ~G4VBasicShell()
G4String Complete(const G4String &)
void ShowCurrent(const G4String &) const
void TerminalHelp(const G4String &)
virtual void ExecuteCommand(const G4String &)
void ListDirectory(const G4String &) const
void ApplyShellCommand(const G4String &, G4bool &, G4bool &)
virtual void ExitHelp() const =0
G4String GetCurrentWorkingDirectory() const
G4bool ChangeDirectory(const char *newDir)
void ChangeDirectoryCommand(const G4String &)
G4UIcommandTree * FindDirectory(const char *dirName) const
virtual G4bool GetHelpChoice(G4int &)=0