1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker
6*89c4ff92SAndroid Build Coastguard Worker #include "CmdArgsParser.hpp"
7*89c4ff92SAndroid Build Coastguard Worker #include <iostream>
8*89c4ff92SAndroid Build Coastguard Worker /*
9*89c4ff92SAndroid Build Coastguard Worker * Checks that a particular option was specified by the user
10*89c4ff92SAndroid Build Coastguard Worker */
CheckOptionSpecified(const std::map<std::string,std::string> & options,const std::string & option)11*89c4ff92SAndroid Build Coastguard Worker bool CheckOptionSpecified(const std::map<std::string, std::string>& options, const std::string& option)
12*89c4ff92SAndroid Build Coastguard Worker {
13*89c4ff92SAndroid Build Coastguard Worker auto it = options.find(option);
14*89c4ff92SAndroid Build Coastguard Worker return it!=options.end();
15*89c4ff92SAndroid Build Coastguard Worker }
16*89c4ff92SAndroid Build Coastguard Worker
17*89c4ff92SAndroid Build Coastguard Worker /*
18*89c4ff92SAndroid Build Coastguard Worker * Retrieves the user provided option
19*89c4ff92SAndroid Build Coastguard Worker */
GetSpecifiedOption(const std::map<std::string,std::string> & options,const std::string & option)20*89c4ff92SAndroid Build Coastguard Worker std::string GetSpecifiedOption(const std::map<std::string, std::string>& options, const std::string& option)
21*89c4ff92SAndroid Build Coastguard Worker {
22*89c4ff92SAndroid Build Coastguard Worker if (CheckOptionSpecified(options, option)){
23*89c4ff92SAndroid Build Coastguard Worker return options.at(option);
24*89c4ff92SAndroid Build Coastguard Worker }
25*89c4ff92SAndroid Build Coastguard Worker else
26*89c4ff92SAndroid Build Coastguard Worker {
27*89c4ff92SAndroid Build Coastguard Worker throw std::invalid_argument("Required option: " + option + " not defined.");
28*89c4ff92SAndroid Build Coastguard Worker }
29*89c4ff92SAndroid Build Coastguard Worker }
30*89c4ff92SAndroid Build Coastguard Worker
31*89c4ff92SAndroid Build Coastguard Worker /*
32*89c4ff92SAndroid Build Coastguard Worker * Parses all the command line options provided by the user and stores in a map.
33*89c4ff92SAndroid Build Coastguard Worker */
ParseOptions(std::map<std::string,std::string> & options,std::map<std::string,std::string> & acceptedOptions,char * argv[],int argc)34*89c4ff92SAndroid Build Coastguard Worker int ParseOptions(std::map<std::string, std::string>& options, std::map<std::string, std::string>& acceptedOptions,
35*89c4ff92SAndroid Build Coastguard Worker char *argv[], int argc)
36*89c4ff92SAndroid Build Coastguard Worker {
37*89c4ff92SAndroid Build Coastguard Worker for (int i = 1; i < argc; ++i)
38*89c4ff92SAndroid Build Coastguard Worker {
39*89c4ff92SAndroid Build Coastguard Worker std::string currentOption = std::string(argv[i]);
40*89c4ff92SAndroid Build Coastguard Worker auto it = acceptedOptions.find(currentOption);
41*89c4ff92SAndroid Build Coastguard Worker if (it != acceptedOptions.end())
42*89c4ff92SAndroid Build Coastguard Worker {
43*89c4ff92SAndroid Build Coastguard Worker if (i + 1 < argc && std::string(argv[i + 1]).rfind("--", 0) != 0)
44*89c4ff92SAndroid Build Coastguard Worker {
45*89c4ff92SAndroid Build Coastguard Worker std::string value = argv[++i];
46*89c4ff92SAndroid Build Coastguard Worker options.insert({it->first, value});
47*89c4ff92SAndroid Build Coastguard Worker }
48*89c4ff92SAndroid Build Coastguard Worker else if (std::string(argv[i]) == "HELP")
49*89c4ff92SAndroid Build Coastguard Worker {
50*89c4ff92SAndroid Build Coastguard Worker std::cout << "Available options" << std::endl;
51*89c4ff92SAndroid Build Coastguard Worker for (auto & acceptedOption : acceptedOptions)
52*89c4ff92SAndroid Build Coastguard Worker {
53*89c4ff92SAndroid Build Coastguard Worker std::cout << acceptedOption.first << " : " << acceptedOption.second << std::endl;
54*89c4ff92SAndroid Build Coastguard Worker }
55*89c4ff92SAndroid Build Coastguard Worker return 2;
56*89c4ff92SAndroid Build Coastguard Worker }
57*89c4ff92SAndroid Build Coastguard Worker else
58*89c4ff92SAndroid Build Coastguard Worker {
59*89c4ff92SAndroid Build Coastguard Worker std::cerr << std::string(argv[i]) << " option requires one argument." << std::endl;
60*89c4ff92SAndroid Build Coastguard Worker return 1;
61*89c4ff92SAndroid Build Coastguard Worker }
62*89c4ff92SAndroid Build Coastguard Worker }
63*89c4ff92SAndroid Build Coastguard Worker else
64*89c4ff92SAndroid Build Coastguard Worker {
65*89c4ff92SAndroid Build Coastguard Worker std::cerr << "Unrecognised option: " << std::string(argv[i]) << std::endl;
66*89c4ff92SAndroid Build Coastguard Worker return 1;
67*89c4ff92SAndroid Build Coastguard Worker }
68*89c4ff92SAndroid Build Coastguard Worker }
69*89c4ff92SAndroid Build Coastguard Worker return 0;
70*89c4ff92SAndroid Build Coastguard Worker }
71