File indexing completed on 2026-09-13 08:29:40
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040 #include "CommandLineParser.hh"
0041
0042 #include <iomanip>
0043
0044 using namespace std;
0045 using namespace G4DNAPARSER;
0046
0047 CommandLineParser* CommandLineParser::fpInstance(0);
0048 G4String Command::fNoOption = "NoOption";
0049
0050
0051
0052 inline bool MATCH(const char* a, const char* b)
0053 {
0054 return strcmp(a, b) == 0;
0055 }
0056
0057
0058
0059 CommandLineParser::CommandLineParser()
0060 {
0061
0062 fpInstance = this;
0063 fOptionsWereSetup = false;
0064 fMaxMarkerLength = 0;
0065 fMaxOptionNameLength = 0;
0066 AddCommand("--help", Command::WithoutOption, "Print this help");
0067 AddCommand("-h", Command::WithoutOption, "Print this help");
0068 AddCommand("&", Command::WithoutOption);
0069
0070 fVerbose = 0;
0071 }
0072
0073
0074
0075 CommandLineParser* CommandLineParser::GetParser()
0076 {
0077 if (!fpInstance) new CommandLineParser;
0078 return fpInstance;
0079 }
0080
0081
0082
0083 CommandLineParser::~CommandLineParser()
0084 {
0085 std::map<G4String, Command*>::iterator it = fCommandMap.begin();
0086 for (; it != fCommandMap.end(); it++) {
0087 if (it->second) delete it->second;
0088 }
0089 }
0090
0091
0092
0093 void CommandLineParser::DeleteInstance()
0094 {
0095 if (fpInstance) {
0096 delete fpInstance;
0097 fpInstance = 0;
0098 }
0099 }
0100
0101
0102
0103 Command::Command(Command::Type commandType, const G4String& description)
0104 {
0105 fType = commandType;
0106 fDescription = description;
0107 fActive = false;
0108 }
0109
0110 CommandWithOption::CommandWithOption(Command::Type commandType, const G4String& description,
0111 const G4String& defaultOption, const G4String& optionName)
0112 : Command(commandType, description)
0113 {
0114 fDefaultOption = defaultOption;
0115 fOptionName = optionName;
0116 fOption = "";
0117 }
0118
0119
0120
0121 int CommandLineParser::Parse(int& argc, char** argv)
0122 {
0123
0124 static char null[1] = {""};
0125 int firstArgc = argc;
0126
0127 for (int i = 1; i < firstArgc; i++) {
0128 Command* command = FindCommand(argv[i]);
0129 if (command == 0) continue;
0130
0131 if (fVerbose) G4cout << "Command : " << argv[i] << G4endl;
0132
0133 fOptionsWereSetup = true;
0134 command->fActive = true;
0135
0136 G4String marker(argv[i]);
0137
0138 if (strcmp(argv[i], "-h") != 0 && strcmp(argv[i], "--help") != 0) {
0139 argv[i] = null;
0140 }
0141
0142 if (command->fType == Command::WithOption) {
0143 if (fVerbose) G4cout << "WithOption" << G4endl;
0144
0145 if (i + 1 > firstArgc || argv[i + 1] == 0 || argv[i + 1][0] == '-') {
0146 G4cerr << "An command line option is missing for " << marker << G4endl;
0147 abort();
0148 }
0149
0150 command->SetOption((const char*)strdup(argv[i + 1]));
0151 argv[i + 1] = null;
0152 i++;
0153 }
0154 else if (command->fType == Command::OptionNotCompulsory) {
0155 if (fVerbose) G4cout << "OptionNotCompulsory" << G4endl;
0156
0157 if (i + 1 < firstArgc) {
0158 G4String buffer = (const char*)strdup(argv[i + 1]);
0159
0160 if (buffer.empty() == false) {
0161 if (buffer.at(0) != '-' && buffer.at(0) != '&' && buffer.at(0) != '>'
0162 && buffer.at(0) != '|')
0163 {
0164 if (fVerbose) {
0165 G4cout << "facultative option is : " << buffer << G4endl;
0166 }
0167
0168 command->SetOption((const char*)strdup(argv[i + 1]));
0169 argv[i + 1] = null;
0170 i++;
0171 continue;
0172 }
0173 }
0174 }
0175
0176 if (fVerbose) G4cout << "Option not set" << G4endl;
0177
0178 command->SetOption("");
0179 }
0180 }
0181 CorrectRemainingOptions(argc, argv);
0182
0183 Command* commandLine(0);
0184 if ((commandLine = GetCommandIfActive("--help")) || (commandLine = GetCommandIfActive("-h"))) {
0185 G4cout << "Usage : " << argv[0] << " [OPTIONS]" << G4endl;
0186 PrintHelp();
0187 return 1;
0188 }
0189
0190 return 0;
0191 }
0192
0193
0194
0195 void CommandLineParser::PrintHelp()
0196 {
0197 std::map<G4String, Command*>::iterator it;
0198
0199 int maxFieldLength = fMaxMarkerLength + fMaxOptionNameLength + 4;
0200
0201 G4cout << "Options: " << G4endl;
0202
0203 for (it = fCommandMap.begin(); it != fCommandMap.end(); it++) {
0204 Command* command = it->second;
0205 if (command) {
0206 G4cout << setw(maxFieldLength) << left;
0207
0208 G4String toPrint = it->first;
0209
0210 if (toPrint == "&") {
0211 continue;
0212 }
0213 else if (toPrint == "-h")
0214 continue;
0215 else if (toPrint == "--help") {
0216 toPrint += ", -h";
0217 }
0218
0219 if (command->GetType() != Command::WithoutOption) {
0220 if (command->GetDefaultOption() != "") {
0221 toPrint += " \"" + command->GetDefaultOption() + "\"";
0222 }
0223 }
0224 G4cout << toPrint;
0225
0226 G4cout << command->GetDescription() << G4endl;
0227 }
0228 }
0229 }
0230
0231
0232
0233 void CommandLineParser::CorrectRemainingOptions(int& argc, char** argv)
0234 {
0235
0236 int j = 0;
0237 for (int i = 0; i < argc; i++) {
0238 if (strcmp(argv[i], "")) {
0239 argv[j] = argv[i];
0240 j++;
0241 }
0242 }
0243 argc = j;
0244 }
0245
0246
0247
0248 void CommandLineParser::AddCommand(const G4String& marker, Command::Type type,
0249 const G4String& description, const G4String& defaultOption,
0250 const G4String& optionName)
0251 {
0252
0253
0254 Command* command = 0;
0255 switch (type) {
0256 case Command::WithoutOption:
0257 command = new Command(type, description);
0258 break;
0259
0260 default:
0261 command = new CommandWithOption(type, description, defaultOption, optionName);
0262 if ((int)defaultOption.length() > fMaxOptionNameLength)
0263 fMaxOptionNameLength = defaultOption.length();
0264 break;
0265 }
0266
0267 if ((int)marker.length() > fMaxMarkerLength) fMaxMarkerLength = marker.length();
0268 fCommandMap.insert(make_pair(marker, command));
0269 }
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299 Command* CommandLineParser::FindCommand(const G4String& marker)
0300 {
0301 std::map<G4String, Command*>::iterator it = fCommandMap.find(marker);
0302 if (it == fCommandMap.end()) {
0303
0304 return 0;
0305 }
0306 return it->second;
0307 }
0308
0309
0310
0311 Command* CommandLineParser::GetCommandIfActive(const G4String& marker)
0312 {
0313 Command* command = FindCommand(marker);
0314 if (command) {
0315
0316
0317 if (command->fActive) {
0318
0319 return command;
0320 }
0321
0322
0323 }
0324 else {
0325 G4ExceptionDescription description;
0326 description << "You try to retrieve a command that was not registered : " << marker << G4endl;
0327 G4Exception("CommandLineParser::GetCommandIfActive", "COMMAND LINE NOT DEFINED", FatalException,
0328 description, "");
0329
0330
0331 }
0332 return 0;
0333 }
0334
0335
0336
0337 bool CommandLineParser::CheckIfNotHandledOptionsExists(int& argc, char** argv)
0338 {
0339 if (argc > 0) {
0340 G4bool kill = false;
0341 for (G4int i = 1; i < argc; i++) {
0342 if (strcmp(argv[i], "")) {
0343 kill = true;
0344 G4cerr << "Unknown argument : " << argv[i] << "\n";
0345 }
0346 }
0347 if (kill) {
0348 G4cerr << "The option " << argv[0] << " is not handled this programme." << G4endl;
0349 G4cout << "Usage : " << argv[0] << " [OPTIONS]" << G4endl;
0350 PrintHelp();
0351 return true;
0352 }
0353 }
0354 return false;
0355 }