1 #ifndef COMMAND_LINE_ARGS_H
2 #define COMMAND_LINE_ARGS_H
3
4 /******************************************************************************
5 * Command-line parsing
6 ******************************************************************************/
7 #include <map>
8 #include <algorithm>
9 #include <string>
10 #include <cstring>
11 #include <sstream>
12 class b3CommandLineArgs
13 {
14 protected:
15 std::map<std::string, std::string> pairs;
16
17 public:
18 // Constructor
b3CommandLineArgs(int argc,char ** argv)19 b3CommandLineArgs(int argc, char **argv)
20 {
21 addArgs(argc, argv);
22 }
23
addArgs(int argc,char ** argv)24 void addArgs(int argc, char **argv)
25 {
26 for (int i = 1; i < argc; i++)
27 {
28 std::string arg = argv[i];
29
30 if ((arg.length() < 2) || (arg[0] != '-') || (arg[1] != '-'))
31 {
32 continue;
33 }
34
35 std::string::size_type pos;
36 std::string key, val;
37 if ((pos = arg.find('=')) == std::string::npos)
38 {
39 key = std::string(arg, 2, arg.length() - 2);
40 val = "";
41 }
42 else
43 {
44 key = std::string(arg, 2, pos - 2);
45 val = std::string(arg, pos + 1, arg.length() - 1);
46 }
47
48 //only add new keys, don't replace existing
49 if (pairs.find(key) == pairs.end())
50 {
51 pairs[key] = val;
52 }
53 }
54 }
55
CheckCmdLineFlag(const char * arg_name)56 bool CheckCmdLineFlag(const char *arg_name)
57 {
58 std::map<std::string, std::string>::iterator itr;
59 if ((itr = pairs.find(arg_name)) != pairs.end())
60 {
61 return true;
62 }
63 return false;
64 }
65
66 template <typename T>
67 bool GetCmdLineArgument(const char *arg_name, T &val);
68
ParsedArgc()69 int ParsedArgc()
70 {
71 return pairs.size();
72 }
73 };
74
75 template <typename T>
GetCmdLineArgument(const char * arg_name,T & val)76 inline bool b3CommandLineArgs::GetCmdLineArgument(const char *arg_name, T &val)
77 {
78 std::map<std::string, std::string>::iterator itr;
79 if ((itr = pairs.find(arg_name)) != pairs.end())
80 {
81 std::istringstream strstream(itr->second);
82 strstream >> val;
83 return true;
84 }
85 return false;
86 }
87
88 template <>
89 inline bool b3CommandLineArgs::GetCmdLineArgument<char *>(const char *arg_name, char *&val)
90 {
91 std::map<std::string, std::string>::iterator itr;
92 if ((itr = pairs.find(arg_name)) != pairs.end())
93 {
94 std::string s = itr->second;
95 val = (char *)malloc(sizeof(char) * (s.length() + 1));
96 std::strcpy(val, s.c_str());
97 return true;
98 }
99 else
100 {
101 val = NULL;
102 }
103 return false;
104 }
105
106 #endif //COMMAND_LINE_ARGS_H
107