Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // This example is provided by the Geant4-DNA 26 // This example is provided by the Geant4-DNA collaboration 27 // Any report or published results obtained us 27 // Any report or published results obtained using the Geant4-DNA software 28 // shall cite the following Geant4-DNA collabo 28 // shall cite the following Geant4-DNA collaboration publication: 29 // Med. Phys. 37 (2010) 4692-4708 29 // Med. Phys. 37 (2010) 4692-4708 30 // J. Comput. Phys. 274 (2014) 841-882 30 // J. Comput. Phys. 274 (2014) 841-882 31 // The Geant4-DNA web site is available at htt 31 // The Geant4-DNA web site is available at http://geant4-dna.org 32 // 32 // 33 // Author: Mathieu Karamitros 33 // Author: Mathieu Karamitros 34 // 34 // >> 35 // $Id$ 35 // 36 // 36 /// \file CommandLineParser.cc << 37 /// \file CommandLineParser 37 /// \brief Implementation of the CommandLinePa 38 /// \brief Implementation of the CommandLineParser class 38 39 39 #include "CommandLineParser.hh" << 40 << 41 #include <iomanip> 40 #include <iomanip> >> 41 #include "CommandLineParser.hh" 42 42 43 using namespace std; 43 using namespace std; 44 using namespace G4DNAPARSER; 44 using namespace G4DNAPARSER; 45 45 46 CommandLineParser* CommandLineParser::fpInstan 46 CommandLineParser* CommandLineParser::fpInstance(0); 47 G4String Command::fNoOption = "NoOption"; 47 G4String Command::fNoOption = "NoOption"; 48 48 >> 49 49 //....oooOO0OOooo........oooOO0OOooo........oo 50 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 50 51 51 inline bool MATCH(const char* a, const char* b << 52 inline bool MATCH(const char *a, const char *b) 52 { 53 { 53 return strcmp(a, b) == 0; 54 return strcmp(a, b) == 0; 54 } 55 } 55 56 56 //....oooOO0OOooo........oooOO0OOooo........oo 57 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 57 58 58 CommandLineParser::CommandLineParser() 59 CommandLineParser::CommandLineParser() 59 { 60 { 60 // G4cout << "############ NEW PARSE ####### 61 // G4cout << "############ NEW PARSE ##########" << G4endl; 61 fpInstance = this; 62 fpInstance = this; 62 fOptionsWereSetup = false; 63 fOptionsWereSetup = false; 63 fMaxMarkerLength = 0; 64 fMaxMarkerLength = 0; 64 fMaxOptionNameLength = 0; 65 fMaxOptionNameLength = 0; 65 AddCommand("--help", Command::WithoutOption, 66 AddCommand("--help", Command::WithoutOption, "Print this help"); 66 AddCommand("-h", Command::WithoutOption, "Pr 67 AddCommand("-h", Command::WithoutOption, "Print this help"); 67 AddCommand("&", Command::WithoutOption); 68 AddCommand("&", Command::WithoutOption); 68 69 69 fVerbose = 0; 70 fVerbose = 0; 70 } 71 } 71 72 72 //....oooOO0OOooo........oooOO0OOooo........oo 73 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 73 74 74 CommandLineParser* CommandLineParser::GetParse 75 CommandLineParser* CommandLineParser::GetParser() 75 { 76 { 76 if (!fpInstance) new CommandLineParser; 77 if (!fpInstance) new CommandLineParser; 77 return fpInstance; 78 return fpInstance; 78 } 79 } 79 80 80 //....oooOO0OOooo........oooOO0OOooo........oo 81 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 81 82 82 CommandLineParser::~CommandLineParser() 83 CommandLineParser::~CommandLineParser() 83 { 84 { 84 std::map<G4String, Command*>::iterator it = 85 std::map<G4String, Command*>::iterator it = fCommandMap.begin(); 85 for (; it != fCommandMap.end(); it++) { << 86 for (; it != fCommandMap.end(); it++) >> 87 { 86 if (it->second) delete it->second; 88 if (it->second) delete it->second; 87 } 89 } 88 } 90 } 89 91 90 //....oooOO0OOooo........oooOO0OOooo........oo 92 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 91 93 92 void CommandLineParser::DeleteInstance() 94 void CommandLineParser::DeleteInstance() 93 { 95 { 94 if (fpInstance) { << 96 if (fpInstance) >> 97 { 95 delete fpInstance; 98 delete fpInstance; 96 fpInstance = 0; 99 fpInstance = 0; 97 } 100 } 98 } 101 } 99 102 100 //....oooOO0OOooo........oooOO0OOooo........oo 103 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 101 104 102 Command::Command(Command::Type commandType, co << 105 Command::Command(Command::Type commandType, >> 106 const G4String& description) 103 { 107 { 104 fType = commandType; 108 fType = commandType; 105 fDescription = description; 109 fDescription = description; 106 fActive = false; 110 fActive = false; 107 } 111 } 108 112 109 CommandWithOption::CommandWithOption(Command:: << 113 CommandWithOption::CommandWithOption(Command::Type commandType, 110 const G4S << 114 const G4String& description, 111 : Command(commandType, description) << 115 const G4String& defaultOption, >> 116 const G4String& optionName) : >> 117 Command(commandType, description) 112 { 118 { 113 fDefaultOption = defaultOption; 119 fDefaultOption = defaultOption; 114 fOptionName = optionName; 120 fOptionName = optionName; 115 fOption = ""; 121 fOption = ""; 116 } 122 } 117 123 >> 124 118 //....oooOO0OOooo........oooOO0OOooo........oo 125 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 119 126 120 int CommandLineParser::Parse(int& argc, char** << 127 int CommandLineParser::Parse(int& argc, char **argv) 121 { 128 { 122 // G4cout << "Parse " << G4endl; 129 // G4cout << "Parse " << G4endl; 123 static char null[1] = {""}; << 130 static char null[1] = { "" }; 124 int firstArgc = argc; 131 int firstArgc = argc; 125 132 126 for (int i = 1; i < firstArgc; i++) { << 133 for (int i = 1; i < firstArgc; i++) >> 134 { 127 Command* command = FindCommand(argv[i]); 135 Command* command = FindCommand(argv[i]); 128 if (command == 0) continue; 136 if (command == 0) continue; 129 137 130 if (fVerbose) G4cout << "Command : " << ar 138 if (fVerbose) G4cout << "Command : " << argv[i] << G4endl; 131 139 132 fOptionsWereSetup = true; 140 fOptionsWereSetup = true; 133 command->fActive = true; 141 command->fActive = true; 134 142 135 G4String marker(argv[i]); 143 G4String marker(argv[i]); 136 144 137 if (strcmp(argv[i], "-h") != 0 && strcmp(a << 145 if (strcmp(argv[i], "-h") != 0 && strcmp(argv[i], "--help") != 0) >> 146 { 138 argv[i] = null; 147 argv[i] = null; 139 } 148 } 140 149 141 if (command->fType == Command::WithOption) << 150 if (command->fType == Command::WithOption) >> 151 { 142 if (fVerbose) G4cout << "WithOption" << 152 if (fVerbose) G4cout << "WithOption" << G4endl; 143 153 144 if (i + 1 > firstArgc || argv[i + 1] == << 154 if(i+1 > firstArgc || argv[i+1]==0 || argv[i+1][0]=='-') 145 G4cerr << "An command line option is m << 155 { >> 156 G4cerr << "An command line option is missing for " >> 157 << marker << G4endl; 146 abort(); 158 abort(); 147 } 159 } 148 160 149 command->SetOption((const char*)strdup(a << 161 command->SetOption( (const char*) strdup(argv[i+1]) ); 150 argv[i + 1] = null; << 162 argv[i+1] = null; 151 i++; 163 i++; 152 } 164 } 153 else if (command->fType == Command::Option << 165 else if(command->fType == Command::OptionNotCompulsory) 154 if (fVerbose) G4cout << "OptionNotCompul << 166 { 155 << 167 if(fVerbose) 156 if (i + 1 < firstArgc) { << 168 G4cout <<"OptionNotCompulsory"<<G4endl; 157 G4String buffer = (const char*)strdup( << 158 169 159 if (buffer.empty() == false) { << 170 if(i+1 < firstArgc) 160 if (buffer.at(0) != '-' && buffer.at << 171 { 161 && buffer.at(0) != '|') << 172 G4String buffer = (const char*) strdup(argv[i+1]); >> 173 >> 174 if(buffer.empty() == false) >> 175 { >> 176 if(buffer.at(0) != '-' >> 177 && buffer.at(0) != '&' >> 178 && buffer.at(0) != '>' >> 179 && buffer.at(0) != '|') 162 { 180 { 163 if (fVerbose) { << 181 if(fVerbose) >> 182 { 164 G4cout << "facultative option is 183 G4cout << "facultative option is : " << buffer << G4endl; 165 } 184 } 166 185 167 command->SetOption((const char*)st << 186 command->SetOption( (const char*) strdup(argv[i+1]) ); 168 argv[i + 1] = null; << 187 argv[i+1] = null; 169 i++; 188 i++; 170 continue; 189 continue; 171 } 190 } 172 } 191 } 173 } 192 } 174 193 175 if (fVerbose) G4cout << "Option not set" << 194 if(fVerbose) >> 195 G4cout << "Option not set" << G4endl; 176 196 177 command->SetOption(""); 197 command->SetOption(""); 178 } 198 } 179 } 199 } 180 CorrectRemainingOptions(argc, argv); 200 CorrectRemainingOptions(argc, argv); 181 201 182 Command* commandLine(0); 202 Command* commandLine(0); 183 if ((commandLine = GetCommandIfActive("--hel << 203 if ((commandLine = GetCommandIfActive("--help")) || (commandLine = >> 204 GetCommandIfActive("-h"))) >> 205 { 184 G4cout << "Usage : " << argv[0] << " [OPTI 206 G4cout << "Usage : " << argv[0] << " [OPTIONS]" << G4endl; 185 PrintHelp(); 207 PrintHelp(); 186 return 1; 208 return 1; 187 } 209 } 188 210 189 return 0; 211 return 0; 190 } 212 } 191 213 192 //....oooOO0OOooo........oooOO0OOooo........oo 214 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 193 215 194 void CommandLineParser::PrintHelp() 216 void CommandLineParser::PrintHelp() 195 { 217 { 196 std::map<G4String, Command*>::iterator it; 218 std::map<G4String, Command*>::iterator it; 197 219 198 int maxFieldLength = fMaxMarkerLength + fMax 220 int maxFieldLength = fMaxMarkerLength + fMaxOptionNameLength + 4; 199 221 200 G4cout << "Options: " << G4endl; 222 G4cout << "Options: " << G4endl; 201 223 202 for (it = fCommandMap.begin(); it != fComman << 224 for (it = fCommandMap.begin(); it != fCommandMap.end(); it++) >> 225 { 203 Command* command = it->second; 226 Command* command = it->second; 204 if (command) { << 227 if (command) >> 228 { 205 G4cout << setw(maxFieldLength) << left; 229 G4cout << setw(maxFieldLength) << left; 206 230 207 G4String toPrint = it->first; 231 G4String toPrint = it->first; 208 232 209 if (toPrint == "&") { << 233 if (toPrint == "&") >> 234 { 210 continue; 235 continue; 211 } 236 } 212 else if (toPrint == "-h") << 237 else if (toPrint == "-h") continue; 213 continue; << 238 else if (toPrint == "--help") 214 else if (toPrint == "--help") { << 239 { 215 toPrint += ", -h"; 240 toPrint += ", -h"; 216 } 241 } 217 242 218 if (command->GetType() != Command::Witho << 243 if(command->GetType() != Command::WithoutOption) 219 if (command->GetDefaultOption() != "") << 244 { >> 245 if (command->GetDefaultOption() != "") >> 246 { 220 toPrint += " \"" + command->GetDefau 247 toPrint += " \"" + command->GetDefaultOption() + "\""; 221 } 248 } 222 } 249 } 223 G4cout << toPrint; 250 G4cout << toPrint; 224 251 225 G4cout << command->GetDescription() << G 252 G4cout << command->GetDescription() << G4endl; 226 } 253 } 227 } 254 } 228 } 255 } 229 256 230 //....oooOO0OOooo........oooOO0OOooo........oo 257 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 231 258 232 void CommandLineParser::CorrectRemainingOption << 259 void CommandLineParser::CorrectRemainingOptions(int& argc, char **argv) 233 { 260 { 234 // remove handled arguments from argument ar 261 // remove handled arguments from argument array 235 int j = 0; 262 int j = 0; 236 for (int i = 0; i < argc; i++) { << 263 for (int i = 0; i < argc; i++) 237 if (strcmp(argv[i], "")) { << 264 { >> 265 if (strcmp(argv[i], "")) >> 266 { 238 argv[j] = argv[i]; 267 argv[j] = argv[i]; 239 j++; 268 j++; 240 } 269 } 241 } 270 } 242 argc = j; 271 argc = j; 243 } 272 } 244 273 245 //....oooOO0OOooo........oooOO0OOooo........oo 274 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 246 275 247 void CommandLineParser::AddCommand(const G4Str << 276 void CommandLineParser::AddCommand(const G4String& marker, 248 const G4Str << 277 Command::Type type, >> 278 const G4String& description, >> 279 const G4String& defaultOption, 249 const G4Str 280 const G4String& optionName) 250 { 281 { 251 // G4cout << "Add command : "<< marker << G4 282 // G4cout << "Add command : "<< marker << G4endl; 252 << 283 253 Command* command = 0; 284 Command* command = 0; 254 switch (type) { << 285 switch(type) 255 case Command::WithoutOption: << 286 { 256 command = new Command(type, description) << 287 case Command::WithoutOption: 257 break; << 288 command = new Command(type, description); 258 << 289 break; 259 default: << 290 260 command = new CommandWithOption(type, de << 291 default: 261 if ((int)defaultOption.length() > fMaxOp << 292 command = new CommandWithOption(type, 262 fMaxOptionNameLength = defaultOption.l << 293 description, 263 break; << 294 defaultOption, >> 295 optionName); >> 296 if ((int) defaultOption.length() > fMaxOptionNameLength) >> 297 fMaxOptionNameLength = defaultOption.length(); >> 298 break; 264 } 299 } 265 300 266 if ((int)marker.length() > fMaxMarkerLength) << 301 if ((int) marker.length() > fMaxMarkerLength) fMaxMarkerLength = >> 302 marker.length(); 267 fCommandMap.insert(make_pair(marker, command 303 fCommandMap.insert(make_pair(marker, command)); 268 } 304 } 269 305 270 /* 306 /* 271 // Add one command but multiple markers 307 // Add one command but multiple markers 272 void Parser::AddCommand(vector<G4String> marke 308 void Parser::AddCommand(vector<G4String> markers, 273 CommandType type, 309 CommandType type, 274 const G4String& descri 310 const G4String& description, 275 const G4String& option 311 const G4String& optionName) 276 { 312 { 277 // G4cout << "Add command : "<< marker << G4 313 // G4cout << "Add command : "<< marker << G4endl; 278 Command* command = new Command(type, descrip 314 Command* command = new Command(type, description, optionName); 279 315 280 for (size_t i = 0; i < markers.size; i++) 316 for (size_t i = 0; i < markers.size; i++) 281 { 317 { 282 G4String marker = markers[i]; 318 G4String marker = markers[i]; 283 if ((int) marker.length() > fMaxMarkerLeng 319 if ((int) marker.length() > fMaxMarkerLength) 284 { 320 { 285 fMaxMarkerLength = marker.length(); 321 fMaxMarkerLength = marker.length(); 286 } 322 } 287 if ((int) optionName.length() > fMaxOption 323 if ((int) optionName.length() > fMaxOptionNameLength) 288 { 324 { 289 fMaxOptionNameLength = optionName.length 325 fMaxOptionNameLength = optionName.length(); 290 } 326 } 291 fCommandMap.insert(make_pair(marker, comma 327 fCommandMap.insert(make_pair(marker, command)); 292 } 328 } 293 } 329 } 294 */ 330 */ 295 331 296 //....oooOO0OOooo........oooOO0OOooo........oo 332 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 297 333 298 Command* CommandLineParser::FindCommand(const 334 Command* CommandLineParser::FindCommand(const G4String& marker) 299 { 335 { 300 std::map<G4String, Command*>::iterator it = 336 std::map<G4String, Command*>::iterator it = fCommandMap.find(marker); 301 if (it == fCommandMap.end()) { << 337 if (it == fCommandMap.end()) >> 338 { 302 // G4cerr << "command not found" << G4endl 339 // G4cerr << "command not found" << G4endl; 303 return 0; 340 return 0; 304 } 341 } 305 return it->second; 342 return it->second; 306 } 343 } 307 344 308 //....oooOO0OOooo........oooOO0OOooo........oo 345 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 309 346 310 Command* CommandLineParser::GetCommandIfActive << 347 Command* CommandLineParser::GetCommandIfActive(const G4String &marker) 311 { 348 { 312 Command* command = FindCommand(marker); 349 Command* command = FindCommand(marker); 313 if (command) { << 350 if (command) >> 351 { 314 // G4cout << "Command found : "<< marker < 352 // G4cout << "Command found : "<< marker << G4endl; 315 353 316 if (command->fActive) { << 354 if (command->fActive) >> 355 { 317 // G4cout << "Command Active" << G4endl; 356 // G4cout << "Command Active" << G4endl; 318 return command; 357 return command; 319 } 358 } 320 // else 359 // else 321 // G4cout <<"Command not active" << G4end 360 // G4cout <<"Command not active" << G4endl; 322 } 361 } 323 else { << 362 else >> 363 { 324 G4ExceptionDescription description; 364 G4ExceptionDescription description; 325 description << "You try to retrieve a comm << 365 description << "You try to retrieve a command that was not registered : " 326 G4Exception("CommandLineParser::GetCommand << 366 << marker << G4endl; 327 description, ""); << 367 G4Exception("CommandLineParser::GetCommandIfActive", >> 368 "COMMAND LINE NOT DEFINED", FatalException, description, ""); 328 // If you are using this class outside of 369 // If you are using this class outside of Geant4, use exit(-1) instead 329 // exit(-1); << 370 //exit(-1); 330 } 371 } 331 return 0; 372 return 0; 332 } 373 } 333 374 334 //....oooOO0OOooo........oooOO0OOooo........oo 375 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 335 376 336 bool CommandLineParser::CheckIfNotHandledOptio 377 bool CommandLineParser::CheckIfNotHandledOptionsExists(int& argc, char** argv) 337 { 378 { 338 if (argc > 0) { << 379 if (argc > 0) >> 380 { 339 G4bool kill = false; 381 G4bool kill = false; 340 for (G4int i = 1; i < argc; i++) { << 382 for (G4int i = 1; i < argc; i++) 341 if (strcmp(argv[i], "")) { << 383 { >> 384 if (strcmp(argv[i], "")) >> 385 { 342 kill = true; 386 kill = true; 343 G4cerr << "Unknown argument : " << arg 387 G4cerr << "Unknown argument : " << argv[i] << "\n"; 344 } 388 } 345 } 389 } 346 if (kill) { << 390 if (kill) 347 G4cerr << "The option " << argv[0] << " << 391 { >> 392 G4cerr << "The option " << argv[0] >> 393 << " is not handled this programme." << G4endl; 348 G4cout << "Usage : " << argv[0] << " [OP 394 G4cout << "Usage : " << argv[0] << " [OPTIONS]" << G4endl; 349 PrintHelp(); 395 PrintHelp(); 350 return true; // KILL APPLICATION << 396 return true; // KILL APPLICATION 351 } 397 } 352 } 398 } 353 return false; 399 return false; 354 } 400 } 355 401