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