File indexing completed on 2026-05-04 08:07:10
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->GetDefaultOption() != "") {
0220 toPrint += " \"" + command->GetDefaultOption() + "\"";
0221 }
0222
0223 G4cout << toPrint;
0224
0225 G4cout << command->GetDescription() << G4endl;
0226 }
0227 }
0228 }
0229
0230
0231
0232 void CommandLineParser::CorrectRemainingOptions(int& argc, char** argv)
0233 {
0234
0235 int j = 0;
0236 for (int i = 0; i < argc; i++) {
0237 if (strcmp(argv[i], "")) {
0238 argv[j] = argv[i];
0239 j++;
0240 }
0241 }
0242 argc = j;
0243 }
0244
0245
0246
0247 void CommandLineParser::AddCommand(const G4String& marker, Command::Type type,
0248 const G4String& description, const G4String& defaultOption,
0249 const G4String& optionName)
0250 {
0251
0252
0253 Command* command = 0;
0254 switch (type) {
0255 case Command::WithoutOption:
0256 command = new Command(type, description);
0257 break;
0258
0259 default:
0260 command = new CommandWithOption(type, description, defaultOption, optionName);
0261 if ((int)defaultOption.length() > fMaxOptionNameLength)
0262 fMaxOptionNameLength = defaultOption.length();
0263 break;
0264 }
0265
0266 if ((int)marker.length() > fMaxMarkerLength) fMaxMarkerLength = marker.length();
0267 fCommandMap.insert(make_pair(marker, command));
0268 }
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 Command* CommandLineParser::FindCommand(const G4String& marker)
0299 {
0300 std::map<G4String, Command*>::iterator it = fCommandMap.find(marker);
0301 if (it == fCommandMap.end()) {
0302
0303 return 0;
0304 }
0305 return it->second;
0306 }
0307
0308
0309
0310 Command* CommandLineParser::GetCommandIfActive(const G4String& marker)
0311 {
0312 Command* command = FindCommand(marker);
0313 if (command) {
0314
0315
0316 if (command->fActive) {
0317
0318 return command;
0319 }
0320
0321
0322 }
0323 else {
0324 G4ExceptionDescription description;
0325 description << "You try to retrieve a command that was not registered : " << marker << G4endl;
0326 G4Exception("CommandLineParser::GetCommandIfActive", "COMMAND LINE NOT DEFINED", FatalException,
0327 description, "");
0328
0329
0330 }
0331 return 0;
0332 }
0333
0334
0335
0336 bool CommandLineParser::CheckIfNotHandledOptionsExists(int& argc, char** argv)
0337 {
0338 if (argc > 0) {
0339 G4bool kill = false;
0340 for (G4int i = 1; i < argc; i++) {
0341 if (strcmp(argv[i], "")) {
0342 kill = true;
0343 G4cerr << "Unknown argument : " << argv[i] << "\n";
0344 }
0345 }
0346 if (kill) {
0347 G4cerr << "The option " << argv[0] << " is not handled this programme." << G4endl;
0348 G4cout << "Usage : " << argv[0] << " [OPTIONS]" << G4endl;
0349 PrintHelp();
0350 return true;
0351 }
0352 }
0353 return false;
0354 }