From 8f7d9f0baaf10ee549fc875e8a9009d109aaba82 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Thu, 26 Apr 2018 16:05:47 +0100 Subject: [PATCH] use optional instead of -1 in cmdlinet --- src/goto-cc/goto_cc_cmdline.cpp | 6 +- src/goto-cc/ms_cl_cmdline.cpp | 14 ++-- src/util/cmdline.cpp | 110 +++++++++++++++++++------------- src/util/cmdline.h | 8 ++- 4 files changed, 82 insertions(+), 56 deletions(-) diff --git a/src/goto-cc/goto_cc_cmdline.cpp b/src/goto-cc/goto_cc_cmdline.cpp index ac86ee38551..f1b933a2847 100644 --- a/src/goto-cc/goto_cc_cmdline.cpp +++ b/src/goto-cc/goto_cc_cmdline.cpp @@ -65,7 +65,7 @@ bool goto_cc_cmdlinet::prefix_in_list( std::size_t goto_cc_cmdlinet::get_optnr(const std::string &opt_string) { - int optnr; + optionalt optnr; cmdlinet::optiont option; if(has_prefix(opt_string, "--")) // starts with -- ? @@ -107,13 +107,13 @@ std::size_t goto_cc_cmdlinet::get_optnr(const std::string &opt_string) } // new? - if(optnr==-1) + if(!optnr.has_value()) { options.push_back(option); return options.size()-1; } - return optnr; + return *optnr; } void goto_cc_cmdlinet::add_infile_arg(const std::string &arg) diff --git a/src/goto-cc/ms_cl_cmdline.cpp b/src/goto-cc/ms_cl_cmdline.cpp index cdc9458bb0c..7364beca6ba 100644 --- a/src/goto-cc/ms_cl_cmdline.cpp +++ b/src/goto-cc/ms_cl_cmdline.cpp @@ -425,7 +425,7 @@ void ms_cl_cmdlinet::process_cl_option(const std::string &s) if(std::string(s, 1, std::string::npos)==ms_cl_flags[j]) { cmdlinet::optiont option; - int optnr; + optionalt optnr; if(s.size()==2) { @@ -442,13 +442,13 @@ void ms_cl_cmdlinet::process_cl_option(const std::string &s) optnr=getoptnr(option.optstring); } - if(optnr==-1) + if(!optnr.has_value()) { options.push_back(option); optnr=options.size()-1; } - options[optnr].isset=true; + options[*optnr].isset=true; return; } } @@ -461,7 +461,7 @@ void ms_cl_cmdlinet::process_cl_option(const std::string &s) { cmdlinet::optiont option; - int optnr; + optionalt optnr; if(ms_cl_prefix.size()==1) { @@ -478,14 +478,14 @@ void ms_cl_cmdlinet::process_cl_option(const std::string &s) optnr=getoptnr(option.optstring); } - if(optnr==-1) + if(!optnr.has_value()) { options.push_back(option); optnr=options.size()-1; } - options[optnr].isset=true; - options[optnr].values.push_back( + options[*optnr].isset=true; + options[*optnr].values.push_back( std::string(s, ms_cl_prefix.size()+1, std::string::npos)); return; diff --git a/src/util/cmdline.cpp b/src/util/cmdline.cpp index 9477d8d4a6c..b022fdce78d 100644 --- a/src/util/cmdline.cpp +++ b/src/util/cmdline.cpp @@ -26,92 +26,114 @@ void cmdlinet::clear() bool cmdlinet::isset(char option) const { - int i=getoptnr(option); - if(i<0) + auto i=getoptnr(option); + if(i.has_value()) + return options[*i].isset; + else return false; - return options[i].isset; } bool cmdlinet::isset(const char *option) const { - int i=getoptnr(option); - if(i<0) + auto i=getoptnr(option); + if(i.has_value()) + return options[*i].isset; + else return false; - return options[i].isset; } std::string cmdlinet::get_value(char option) const { - int i=getoptnr(option); - if(i<0) - return ""; - if(options[i].values.empty()) + auto i=getoptnr(option); + + if(i.has_value()) + { + if(options[*i].values.empty()) + return ""; + else + return options[*i].values.front(); + } + else return ""; - return options[i].values.front(); } void cmdlinet::set(const std::string &option) { - int i=getoptnr(option); - if(i<0) - return; // ignore - options[i].isset=true; + auto i=getoptnr(option); + + if(i.has_value()) + options[*i].isset=true; + + // otherwise ignore } void cmdlinet::set(const std::string &option, const std::string &value) { - int i=getoptnr(option); - if(i<0) - return; // ignore - options[i].isset=true; - options[i].values.push_back(value); + auto i=getoptnr(option); + + if(i.has_value()) + { + options[*i].isset=true; + options[*i].values.push_back(value); + } + + // otherwise ignore } static std::list immutable_empty_list; const std::list &cmdlinet::get_values(char option) const { - int i=getoptnr(option); - if(i<0) + auto i=getoptnr(option); + + if(i.has_value()) + return options[*i].values; + else return immutable_empty_list; - return options[i].values; } std::string cmdlinet::get_value(const char *option) const { - int i=getoptnr(option); - if(i<0) - return ""; - if(options[i].values.empty()) + auto i=getoptnr(option); + + if(i.has_value()) + { + if(options[*i].values.empty()) + return ""; + else + return options[*i].values.front(); + } + else return ""; - return options[i].values.front(); } const std::list &cmdlinet::get_values( const std::string &option) const { - int i=getoptnr(option); - if(i<0) + auto i=getoptnr(option); + + if(i.has_value()) + return options[*i].values; + else return immutable_empty_list; - return options[i].values; } -int cmdlinet::getoptnr(char option) const +optionalt cmdlinet::getoptnr(char option) const { for(std::size_t i=0; i(); } -int cmdlinet::getoptnr(const std::string &option) const +optionalt cmdlinet::getoptnr(const std::string &option) const { for(std::size_t i=0; i(); } bool cmdlinet::parse(int argc, const char **argv, const char *optstring) @@ -165,7 +187,7 @@ bool cmdlinet::parse(int argc, const char **argv, const char *optstring) args.push_back(argv[i]); else { - int optnr; + optionalt optnr; if(argv[i][1]!=0 && argv[i][2]==0) optnr=getoptnr(argv[i][1]); // single-letter option -X @@ -177,29 +199,31 @@ bool cmdlinet::parse(int argc, const char **argv, const char *optstring) // We first try single-letter. optnr=getoptnr(argv[i][1]); - if(optnr<0) // try multi-letter + if(!optnr.has_value()) // try multi-letter optnr=getoptnr(argv[i]+1); } - if(optnr<0) + if(!optnr.has_value()) { unknown_arg=argv[i]; return true; } - options[optnr].isset=true; - if(options[optnr].hasval) + + options[*optnr].isset=true; + + if(options[*optnr].hasval) { - if(argv[i][2]==0 || options[optnr].islong) + if(argv[i][2]==0 || options[*optnr].islong) { i++; if(i==argc) return true; if(argv[i][0]=='-' && argv[i][1]!=0) return true; - options[optnr].values.push_back(argv[i]); + options[*optnr].values.push_back(argv[i]); } else - options[optnr].values.push_back(argv[i]+2); + options[*optnr].values.push_back(argv[i]+2); } } } diff --git a/src/util/cmdline.h b/src/util/cmdline.h index 2d58daa8d44..b395e024f7f 100644 --- a/src/util/cmdline.h +++ b/src/util/cmdline.h @@ -14,6 +14,8 @@ Author: Daniel Kroening, kroening@kroening.com #include #include +#include "optional.h" + class cmdlinet { public: @@ -53,13 +55,13 @@ class cmdlinet hasval(false), islong(false), optchar(0) - {} + {} }; std::vector options; - int getoptnr(char option) const; - int getoptnr(const std::string &option) const; + optionalt getoptnr(char option) const; + optionalt getoptnr(const std::string &option) const; }; #endif // CPROVER_UTIL_CMDLINE_H