| // |
| // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. |
| // SPDX-License-Identifier: MIT |
| // |
| |
| #include "CmdArgsParser.hpp" |
| #include <iostream> |
| /* |
| * Checks that a particular option was specified by the user |
| */ |
| bool CheckOptionSpecified(const std::map<std::string, std::string>& options, const std::string& option) |
| { |
| auto it = options.find(option); |
| return it!=options.end(); |
| } |
| |
| /* |
| * Retrieves the user provided option |
| */ |
| std::string GetSpecifiedOption(const std::map<std::string, std::string>& options, const std::string& option) |
| { |
| if (CheckOptionSpecified(options, option)){ |
| return options.at(option); |
| } |
| else |
| { |
| throw std::invalid_argument("Required option: " + option + " not defined."); |
| } |
| } |
| |
| /* |
| * Parses all the command line options provided by the user and stores in a map. |
| */ |
| int ParseOptions(std::map<std::string, std::string>& options, std::map<std::string, std::string>& acceptedOptions, |
| char *argv[], int argc) |
| { |
| for (int i = 1; i < argc; ++i) |
| { |
| std::string currentOption = std::string(argv[i]); |
| auto it = acceptedOptions.find(currentOption); |
| if (it != acceptedOptions.end()) |
| { |
| if (i + 1 < argc && std::string(argv[i + 1]).rfind("--", 0) != 0) |
| { |
| std::string value = argv[++i]; |
| options.insert({it->first, value}); |
| } |
| else if (std::string(argv[i]) == HELP) |
| { |
| std::cout << "Available options" << std::endl; |
| for (auto & acceptedOption : acceptedOptions) |
| { |
| std::cout << acceptedOption.first << " : " << acceptedOption.second << std::endl; |
| } |
| return 2; |
| } |
| else |
| { |
| std::cerr << std::string(argv[i]) << " option requires one argument." << std::endl; |
| return 1; |
| } |
| } |
| else |
| { |
| std::cerr << "Unrecognised option: " << std::string(argv[i]) << std::endl; |
| return 1; |
| } |
| } |
| return 0; |
| } |