BUG: Appl::parseArgs searching for '-' in argument reduced to first character; Appl::printSettings added.

This commit is contained in:
Roland Jax
2014-05-05 22:48:58 +02:00
parent 60cfff6738
commit e302ce4745
4 changed files with 72 additions and 33 deletions
+13 -6
View File
@@ -85,7 +85,7 @@ void define_args()
Appl::type_int, Appl::opt_mandatory);
A.addItem("p_level", Appl::Param(trace), "", "loglevel",
"\tlogging level (error=1, event=2, default: trace=3, debug=4)\n",
"\tlogging level (error=0, event=1, default: trace=2, debug=3)\n",
Appl::type_int, Appl::opt_mandatory);
A.addItem("p_dump", Appl::Param(false), "D", "dump",
@@ -100,6 +100,10 @@ void define_args()
"\tmax size for dump file in kB (default: 100)\n",
Appl::type_long, Appl::opt_mandatory);
A.addItem("p_settings", Appl::Param(false), "", "settings",
"\tprint daemon settings\n",
Appl::type_bool, Appl::opt_none);
A.addItem("p_help", Appl::Param(false), "h", "help",
"\tprint this message",
Appl::type_bool, Appl::opt_none);
@@ -171,7 +175,7 @@ int main(int argc, char* argv[])
define_args();
// parse Arguments
if (A.parse(argc, argv) == false) {
if (A.parseArgs(argc, argv) == false) {
A.printArgs();
exit(EXIT_FAILURE);
}
@@ -182,6 +186,10 @@ int main(int argc, char* argv[])
exit(EXIT_SUCCESS);
}
// print Daemon settings
if (A.getParam<bool>("p_settings") == true)
A.printSettings();
// make me Daemon
if (A.getParam<bool>("p_foreground") == true) {
L += new LogConsole(A.getParam<int>("p_area"),
@@ -201,14 +209,13 @@ int main(int argc, char* argv[])
// start Logger
L.start("logInstance");
// wait for Logger be ready
usleep(100000);
L.log(bas, event, "ebus-daemon started");
// print Daemon status
if (D.status() == true)
L.log(bas, event, "change to daemon");
// create Commands DB
commands = ConfigCommands(A.getParam<const char*>("p_ebusconfdir"), CSV).getCommands();
L.log(bas, debug, "ebus configuration dir: %s", A.getParam<const char*>("p_ebusconfdir"));
L.log(bas, event, "commands DB with %d entries created", commands->size());
// create EBusLoop
+1 -1
View File
@@ -55,7 +55,7 @@ int main(int argc, char* argv[])
define_args();
// parse Arguments
if (A.parse(argc, argv) == false) {
if (A.parseArgs(argc, argv) == false) {
A.printArgs();
exit(EXIT_FAILURE);
}
+37 -6
View File
@@ -70,7 +70,7 @@ void Appl::printArgs()
std::cerr << std::endl;
}
bool Appl::parse(int argc, char* argv[])
bool Appl::parseArgs(int argc, char* argv[])
{
std::vector<std::string> _argv(argv, argv + argc);
m_argc = argc;
@@ -80,9 +80,8 @@ bool Appl::parse(int argc, char* argv[])
// find option with long format '--'
if (m_argv[i].rfind("--") == 0 && m_argv[i].size() > 2) {
// is next item an added argument?
if (i+1 < m_argc && m_argv[i+1].rfind("-") == std::string::npos) {
if (i+1 < m_argc && m_argv[i+1].rfind("-", 0) == std::string::npos) {
if (checkArg(m_argv[i].substr(2), m_argv[i+1]) == false)
return false;
} else {
@@ -97,7 +96,7 @@ bool Appl::parse(int argc, char* argv[])
for (size_t j = 1; j < m_argv[i].size(); j++) {
// only last charater could have an argument
if (i+1 < m_argc && m_argv[i+1].rfind("-") == std::string::npos
if (i+1 < m_argc && m_argv[i+1].rfind("-", 0) == std::string::npos
&& j+1 == m_argv[i].size()) {
if (checkArg(m_argv[i].substr(j,1), m_argv[i+1]) == false)
return false;
@@ -112,11 +111,43 @@ bool Appl::parse(int argc, char* argv[])
return true;
}
bool Appl::checkArg(const std::string name, const std::string arg)
void Appl::printSettings()
{
std::cerr << std::endl << "Settings:" << std::endl;
for (a_it = m_args.begin(); a_it < m_args.end(); a_it++) {
const char* c = (strlen(a_it->shortname) == 1) ? a_it->shortname : " ";
std::cerr << ((strcmp(c, " ") == 0) ? " " : "-") << c
<< " | --" << a_it->longname
<< " = ";
if (a_it->datatype == type_bool) {
if (getParam<bool>(a_it->name) == true)
std::cerr << "yes" << std::endl;
else
std::cerr << "no" << std::endl;
}
else if (a_it->datatype == type_int) {
std::cerr << getParam<int>(a_it->name) << std::endl;
}
else if (a_it->datatype == type_long) {
std::cerr << getParam<long>(a_it->name) << std::endl;
}
else if (a_it->datatype == type_float) {
std::cerr << getParam<float>(a_it->name) << std::endl;
}
else if (a_it->datatype == type_string) {
std::cerr << getParam<const char*>(a_it->name) << std::endl;
}
}
std::cerr << std::endl;
}
bool Appl::checkArg(const std::string& name, const std::string& arg)
{
for (a_it = m_args.begin(); a_it < m_args.end(); a_it++) {
if (a_it->shortname == name || a_it->longname == name) {
if (a_it->optiontype == opt_mandatory && arg.size() == 0) {
std::cerr << std::endl << "option requires an argument '"
<< name << "'" << std::endl;
+3 -2
View File
@@ -67,7 +67,8 @@ public:
void printArgs();
bool parse(int argc, char* argv[]);
bool parseArgs(int argc, char* argv[]);
void printSettings();
private:
Appl() {}
@@ -92,7 +93,7 @@ private:
std::map<const char*, Param> m_params;
std::map<const char*, Param>::iterator p_it;
bool checkArg(const std::string name, const std::string arg);
bool checkArg(const std::string& name, const std::string& arg);
void addParam(const char* name, Param param) { m_params[name] = param; }