diff --git a/src/goto-cc/armcc_cmdline.cpp b/src/goto-cc/armcc_cmdline.cpp index d0a16ac95a0..be1d2c19c67 100644 --- a/src/goto-cc/armcc_cmdline.cpp +++ b/src/goto-cc/armcc_cmdline.cpp @@ -11,8 +11,14 @@ Author: Daniel Kroening #include "armcc_cmdline.h" +#include +#include + +#include #include #include +#include +#include /// parses the command line options into a cmdlinet /// \par parameters: argument count, argument strings @@ -195,7 +201,8 @@ static const char *options_no_arg[]= nullptr }; -static const char *options_with_prefix[]= +// clang-format off +static const std::vector options_with_prefix { "--project=", "--workdir=", @@ -241,11 +248,10 @@ static const char *options_with_prefix[]= "--configure_sysroot=", "--configure_cpp_headers=", "--configure_extra_includes=", - "--configure_extra_libraries=", - nullptr + "--configure_extra_libraries=" }; -static const char *options_with_arg[]= +static const std::vector options_with_arg { // goto-cc specific "--verbosity", @@ -261,9 +267,21 @@ static const char *options_with_arg[]= "-Warmcc,", "-o", "--cpu", - "--apcs", - nullptr + "--apcs" }; +// clang-format on + +optionalt +prefix_in_list(const std::string &option, const std::vector &list) +{ + const auto found = + std::find_if(list.cbegin(), list.cend(), [&](const std::string &argument) { + return has_prefix(argument, option); + }); + if(found == list.cend()) + return {}; + return {*found}; +} bool armcc_cmdlinet::parse(int argc, const char **argv) { @@ -277,35 +295,34 @@ bool armcc_cmdlinet::parse(int argc, const char **argv) } // it starts with - and it isn't "-" - - std::string prefix; + optionalt prefix; if(in_list(argv[i], options_no_arg)) { // options that don't have any arguments set(argv[i]); } - else if(prefix_in_list(argv[i], options_with_arg, prefix)) + else if((prefix = prefix_in_list(argv[i], options_with_arg))) { // options that have a separated _or_ concatenated argument - if(strlen(argv[i])>prefix.size()) // concatenated? - set(prefix, std::string(argv[i], prefix.size(), std::string::npos)); + if(strlen(argv[i]) > prefix->size()) // Concatenated. + set(*prefix, std::string(argv[i], prefix->size(), std::string::npos)); else { // Separated. if(i!=argc-1) // Guard against end of command line. { - set(prefix, argv[i+1]); + set(*prefix, argv[i + 1]); i++; } else - set(prefix, ""); + set(*prefix, ""); } } - else if(prefix_in_list(argv[i], options_with_prefix, prefix)) + else if((prefix = prefix_in_list(argv[i], options_with_prefix))) { // options that have a concatenated argument - set(prefix, std::string(argv[i], prefix.size(), std::string::npos)); + set(*prefix, std::string(argv[i], prefix->size(), std::string::npos)); } else { // unrecognized option diff --git a/src/goto-cc/goto_cc_cmdline.cpp b/src/goto-cc/goto_cc_cmdline.cpp index 52fd45b5d7e..e10469e33f9 100644 --- a/src/goto-cc/goto_cc_cmdline.cpp +++ b/src/goto-cc/goto_cc_cmdline.cpp @@ -13,10 +13,11 @@ Date: April 2010 #include "goto_cc_cmdline.h" -#include +#include #include -#include #include +#include +#include #include #include @@ -46,23 +47,6 @@ bool goto_cc_cmdlinet::in_list(const char *option, const char **list) return false; } -bool goto_cc_cmdlinet::prefix_in_list( - const char *option, - const char **list, - std::string &prefix) -{ - for(std::size_t i=0; list[i]!=nullptr; i++) - { - if(strncmp(option, list[i], strlen(list[i]))==0) - { - prefix=std::string(list[i]); - return true; - } - } - - return false; -} - std::size_t goto_cc_cmdlinet::get_optnr(const std::string &opt_string) { optionalt optnr; @@ -134,3 +118,11 @@ void goto_cc_cmdlinet::add_infile_arg(const std::string &arg) fclose(tmp); } } + +bool goto_cc_cmdlinet::have_infile_arg() const +{ + return std::any_of( + parsed_argv.cbegin(), parsed_argv.cend(), [](const argt &arg) { + return arg.is_infile_name; + }); +} diff --git a/src/goto-cc/goto_cc_cmdline.h b/src/goto-cc/goto_cc_cmdline.h index 65faa1d413b..e446de32352 100644 --- a/src/goto-cc/goto_cc_cmdline.h +++ b/src/goto-cc/goto_cc_cmdline.h @@ -26,11 +26,6 @@ class goto_cc_cmdlinet:public cmdlinet static bool in_list(const char *option, const char **list); - static bool prefix_in_list( - const char *option, - const char **list, - std::string &prefix); - // never fails, will add if not found std::size_t get_optnr(const std::string &option); @@ -68,14 +63,7 @@ class goto_cc_cmdlinet:public cmdlinet typedef std::list parsed_argvt; parsed_argvt parsed_argv; - bool have_infile_arg() const - { - for(parsed_argvt::const_iterator - it=parsed_argv.begin(); it!=parsed_argv.end(); it++) - if(it->is_infile_name) - return true; - return false; - } + bool have_infile_arg() const; std::string stdin_file; diff --git a/src/goto-cc/goto_cc_mode.h b/src/goto-cc/goto_cc_mode.h index 6dbad84d3ce..1bf2b9dd6b7 100644 --- a/src/goto-cc/goto_cc_mode.h +++ b/src/goto-cc/goto_cc_mode.h @@ -21,10 +21,10 @@ Date: June 2006 class goto_cc_modet:public messaget { public: - virtual int main(int argc, const char **argv); + int main(int argc, const char **argv); virtual int doit()=0; virtual void help_mode()=0; - virtual void help(); + void help(); virtual void usage_error(); goto_cc_modet( diff --git a/unit/CMakeLists.txt b/unit/CMakeLists.txt index 6372702081a..bcc7f37fc08 100644 --- a/unit/CMakeLists.txt +++ b/unit/CMakeLists.txt @@ -51,6 +51,7 @@ target_link_libraries( testing-utils ansi-c solvers + goto-cc-lib goto-checker goto-programs goto-instrument-lib diff --git a/unit/Makefile b/unit/Makefile index d3625d05fa8..246c090bca7 100644 --- a/unit/Makefile +++ b/unit/Makefile @@ -19,6 +19,7 @@ SRC += analyses/ai/ai.cpp \ big-int/big-int.cpp \ compound_block_locations.cpp \ get_goto_model_from_c_test.cpp \ + goto-cc/armcc_cmdline.cpp \ goto-checker/report_util/is_property_less_than.cpp \ goto-instrument/cover_instrument.cpp \ goto-instrument/cover/cover_only.cpp \ @@ -162,6 +163,8 @@ testing-utils-clean: BMC_DEPS =../src/cbmc/c_test_input_generator$(OBJEXT) \ ../src/cbmc/cbmc_languages$(OBJEXT) \ ../src/cbmc/cbmc_parse_options$(OBJEXT) \ + ../src/goto-cc/armcc_cmdline$(OBJEXT) \ + ../src/goto-cc/goto_cc_cmdline$(OBJEXT) \ ../src/goto-instrument/source_lines$(OBJEXT) \ ../src/goto-instrument/cover$(OBJEXT) \ ../src/goto-instrument/cover_basic_blocks$(OBJEXT) \ diff --git a/unit/goto-cc/armcc_cmdline.cpp b/unit/goto-cc/armcc_cmdline.cpp new file mode 100644 index 00000000000..e9d9ec4f154 --- /dev/null +++ b/unit/goto-cc/armcc_cmdline.cpp @@ -0,0 +1,34 @@ +/// \file +/// Unit tests of src/goto-cc/armcc_cmdline.cpp +/// \author Diffblue Ltd. + +#include + +#include + +#include +#include + +optionalt +prefix_in_list(const std::string &option, const std::vector &list); + +static const std::vector test_list{"spam", "eggs", "and", "ham"}; + +TEST_CASE("prefix_in_list exact match", "[core][armcc_cmdline][prefix_in_list]") +{ + REQUIRE(*prefix_in_list("spam", test_list) == "spam"); + REQUIRE(*prefix_in_list("ham", test_list) == "ham"); +} + +TEST_CASE( + "prefix_in_list match prefix", + "[core][armcc_cmdline][prefix_in_list]") +{ + REQUIRE(*prefix_in_list("sp", test_list) == "spam"); + REQUIRE(*prefix_in_list("ha", test_list) == "ham"); +} + +TEST_CASE("prefix_in_list unmatched", "[core][armcc_cmdline][prefix_in_list]") +{ + REQUIRE_FALSE(prefix_in_list("foobar", test_list)); +} diff --git a/unit/goto-cc/module_dependencies.txt b/unit/goto-cc/module_dependencies.txt new file mode 100644 index 00000000000..d670dd22445 --- /dev/null +++ b/unit/goto-cc/module_dependencies.txt @@ -0,0 +1,3 @@ +goto-cc +testing-utils +util