tools: abort at unknown cmdline parameters

This change makes all C++-based tools in tools/ abort when they
encounter an unknown commandline parameter (both option or
non-option).  This has already caused some confusion, as in some cases
unexpected behaviour can be the result.  For example, "prune-trace -t
mytrace.tc -d database" up to now ignored the "-t" parameter, took
"mytrace.tc" as the first non-option parameter (and ignored it); as no
option parameter may follow the non-option parameters, all other
options were ignored as well.

Change-Id: Ia0812a518c4760fa28ed54979c81f43fa7aa096e
This commit is contained in:
Horst Schirmeier
2014-09-18 15:07:05 +02:00
parent 3fd94abcd3
commit b0e13b17c9
6 changed files with 56 additions and 15 deletions

View File

@ -40,7 +40,7 @@ int main(int argc, char *argv[])
// Manually fill the command line option parser
CommandLine &cmd = CommandLine::Inst();
cmd.addOption("", "", Arg::None, "USAGE: compute-hops [options]");
CommandLine::option_handle UNKNOWN = cmd.addOption("", "", Arg::None, "USAGE: compute-hops [options]");
CommandLine::option_handle HELP = cmd.addOption("h", "help", Arg::None, "-h,--help \tPrint usage and exit");
CommandLine::option_handle ALGORITHM =
@ -99,7 +99,13 @@ int main(int argc, char *argv[])
return 1;
}
if (cmd[HELP]) {
if (cmd[HELP] || cmd[UNKNOWN] || cmd.parser()->nonOptionsCount() > 0) {
for (option::Option* opt = cmd[UNKNOWN]; opt; opt = opt->next()) {
std::cerr << "Unknown option: " << opt->name << "\n";
}
for (int i = 0; i < cmd.parser()->nonOptionsCount(); ++i) {
std::cerr << "Unknown non-option: " << cmd.parser()->nonOption(i) << "\n";
}
cmd.printUsage();
if (cmd[HELP]) {
exit(0);

View File

@ -17,7 +17,8 @@ static Logger LOG("convert-trace", true);
int main(int argc, char *argv[]) {
CommandLine &cmd = CommandLine::Inst();
cmd.addOption("", "", Arg::None, "usage: convert-trace -f dump|gem5 -t tracefile.tc");
CommandLine::option_handle UNKNOWN =
cmd.addOption("", "", Arg::None, "usage: convert-trace -f dump|gem5 -t tracefile.tc");
CommandLine::option_handle HELP =
cmd.addOption("h", "help", Arg::None, "-h/--help \tPrint usage and exit");
CommandLine::option_handle FORMAT =
@ -28,11 +29,17 @@ int main(int argc, char *argv[]) {
cmd.add_args(argv[i]);
}
if (!cmd.parse()) {
LOG << "Error parsing arguments." << endl;
std::cerr << "Error parsing arguments." << endl;
return 1;
}
if (cmd[HELP] || !cmd[OUTFILE] || !cmd[FORMAT] || cmd.parser()->nonOptionsCount() != 0) {
if (cmd[HELP] || !cmd[OUTFILE] || !cmd[FORMAT] || cmd[UNKNOWN] || cmd.parser()->nonOptionsCount() != 0) {
for (option::Option* opt = cmd[UNKNOWN]; opt; opt = opt->next()) {
std::cerr << "Unknown option: " << opt->name << "\n";
}
for (int i = 0; i < cmd.parser()->nonOptionsCount(); ++i) {
std::cerr << "Unknown non-option: " << cmd.parser()->nonOption(i) << "\n";
}
cmd.printUsage();
if (cmd[HELP]) {
exit(0);

View File

@ -49,7 +49,8 @@ int main(int argc, char *argv[])
InjectionPointMessage ev;
CommandLine &cmd = CommandLine::Inst();
cmd.addOption("", "", Arg::None, "usage: dump-hops [options] hopfile.hp");
CommandLine::option_handle UNKNOWN =
cmd.addOption("", "", Arg::None, "usage: dump-hops [options] hopfile.hp");
CommandLine::option_handle HELP =
cmd.addOption("h", "help", Arg::None, "-h/--help \tPrint usage and exit");
// CommandLine::option_handle STATS =
@ -64,7 +65,13 @@ int main(int argc, char *argv[])
return 1;
}
if (cmd[HELP] || cmd.parser()->nonOptionsCount() != 1) {
if (cmd[HELP] || cmd[UNKNOWN] || cmd.parser()->nonOptionsCount() != 1) {
for (option::Option* opt = cmd[UNKNOWN]; opt; opt = opt->next()) {
std::cerr << "Unknown option: " << opt->name << "\n";
}
for (int i = 1; i < cmd.parser()->nonOptionsCount(); ++i) {
std::cerr << "Unknown non-option: " << cmd.parser()->nonOption(i) << "\n";
}
cmd.printUsage();
if (cmd[HELP]) {
exit(0);

View File

@ -49,7 +49,8 @@ int main(int argc, char *argv[])
Trace_Event ev;
CommandLine &cmd = CommandLine::Inst();
cmd.addOption("", "", Arg::None, "usage: dump-trace [options] tracefile.tc");
CommandLine::option_handle UNKNOWN =
cmd.addOption("", "", Arg::None, "usage: dump-trace [options] tracefile.tc");
CommandLine::option_handle HELP =
cmd.addOption("h", "help", Arg::None, "-h/--help \tPrint usage and exit");
CommandLine::option_handle STATS =
@ -67,7 +68,13 @@ int main(int argc, char *argv[])
return 1;
}
if (cmd[HELP] || cmd.parser()->nonOptionsCount() != 1) {
if (cmd[HELP] || cmd[UNKNOWN] || cmd.parser()->nonOptionsCount() != 1) {
for (option::Option* opt = cmd[UNKNOWN]; opt; opt = opt->next()) {
std::cerr << "Unknown option: " << opt->name << "\n";
}
for (int i = 1; i < cmd.parser()->nonOptionsCount(); ++i) {
std::cerr << "Unknown non-option: " << cmd.parser()->nonOption(i) << "\n";
}
cmd.printUsage();
if (cmd[HELP]) {
exit(0);

View File

@ -85,7 +85,8 @@ int main(int argc, char *argv[]) {
for (int i = 1; i < argc; ++i)
cmd.add_args(argv[i]);
cmd.addOption("", "", Arg::None, "USAGE: import-trace [options]");
CommandLine::option_handle UNKNOWN =
cmd.addOption("", "", Arg::None, "USAGE: import-trace [options]");
CommandLine::option_handle HELP =
cmd.addOption("h", "help", Arg::None, "-h/--help \tPrint usage and exit");
CommandLine::option_handle TRACE_FILE =
@ -176,9 +177,15 @@ int main(int argc, char *argv[]) {
// reparse all arguments.
cmd.parse();
if (cmd[HELP]) {
if (cmd[HELP] || cmd[UNKNOWN] || cmd.parser()->nonOptionsCount() > 0) {
for (option::Option* opt = cmd[UNKNOWN]; opt; opt = opt->next()) {
std::cerr << "Unknown option: " << opt->name << "\n";
}
for (int i = 0; i < cmd.parser()->nonOptionsCount(); ++i) {
std::cerr << "Unknown non-option: " << cmd.parser()->nonOption(i) << "\n";
}
cmd.printUsage();
exit(0);
exit(!cmd[HELP]);
}
if (cmd[TRACE_FILE]) {

View File

@ -35,7 +35,8 @@ int main(int argc, char *argv[]) {
cmd.add_args(argv[i]);
}
cmd.addOption("", "", Arg::None, "USAGE: prune-trace [options]");
CommandLine::option_handle UNKNOWN =
cmd.addOption("", "", Arg::None, "USAGE: prune-trace [options]");
CommandLine::option_handle HELP = cmd.addOption("h", "help", Arg::None, "-h,--help \tPrint usage and exit");
Database::cmdline_setup();
@ -112,9 +113,15 @@ int main(int argc, char *argv[]) {
// reparse all arguments.
cmd.parse();
if (cmd[HELP]) {
if (cmd[HELP] || cmd[UNKNOWN] || cmd.parser()->nonOptionsCount() > 0) {
for (option::Option* opt = cmd[UNKNOWN]; opt; opt = opt->next()) {
std::cerr << "Unknown option: " << opt->name << "\n";
}
for (int i = 0; i < cmd.parser()->nonOptionsCount(); ++i) {
std::cerr << "Unknown non-option: " << cmd.parser()->nonOption(i) << "\n";
}
cmd.printUsage();
exit(0);
exit(!cmd[HELP]);
}
Database *db = Database::cmdline_connect();