Skip to content

Commit 7d30335

Browse files
Merge pull request #5442 from thomasspriggs/tas/goto-cc-refactoring
Refactoring around the goto-cc entry point.
2 parents 7d8a6f7 + f7787c8 commit 7d30335

8 files changed

+87
-49
lines changed

src/goto-cc/armcc_cmdline.cpp

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,14 @@ Author: Daniel Kroening
1111

1212
#include "armcc_cmdline.h"
1313

14+
#include <util/optional.h>
15+
#include <util/prefix.h>
16+
17+
#include <algorithm>
1418
#include <cstring>
1519
#include <iostream>
20+
#include <string>
21+
#include <vector>
1622

1723
/// parses the command line options into a cmdlinet
1824
/// \par parameters: argument count, argument strings
@@ -195,7 +201,8 @@ static const char *options_no_arg[]=
195201
nullptr
196202
};
197203

198-
static const char *options_with_prefix[]=
204+
// clang-format off
205+
static const std::vector<std::string> options_with_prefix
199206
{
200207
"--project=",
201208
"--workdir=",
@@ -241,11 +248,10 @@ static const char *options_with_prefix[]=
241248
"--configure_sysroot=",
242249
"--configure_cpp_headers=",
243250
"--configure_extra_includes=",
244-
"--configure_extra_libraries=",
245-
nullptr
251+
"--configure_extra_libraries="
246252
};
247253

248-
static const char *options_with_arg[]=
254+
static const std::vector<std::string> options_with_arg
249255
{
250256
// goto-cc specific
251257
"--verbosity",
@@ -261,9 +267,21 @@ static const char *options_with_arg[]=
261267
"-Warmcc,",
262268
"-o",
263269
"--cpu",
264-
"--apcs",
265-
nullptr
270+
"--apcs"
266271
};
272+
// clang-format on
273+
274+
optionalt<std::string>
275+
prefix_in_list(const std::string &option, const std::vector<std::string> &list)
276+
{
277+
const auto found =
278+
std::find_if(list.cbegin(), list.cend(), [&](const std::string &argument) {
279+
return has_prefix(argument, option);
280+
});
281+
if(found == list.cend())
282+
return {};
283+
return {*found};
284+
}
267285

268286
bool armcc_cmdlinet::parse(int argc, const char **argv)
269287
{
@@ -277,35 +295,34 @@ bool armcc_cmdlinet::parse(int argc, const char **argv)
277295
}
278296

279297
// it starts with - and it isn't "-"
280-
281-
std::string prefix;
298+
optionalt<std::string> prefix;
282299

283300
if(in_list(argv[i], options_no_arg))
284301
{
285302
// options that don't have any arguments
286303
set(argv[i]);
287304
}
288-
else if(prefix_in_list(argv[i], options_with_arg, prefix))
305+
else if((prefix = prefix_in_list(argv[i], options_with_arg)))
289306
{
290307
// options that have a separated _or_ concatenated argument
291-
if(strlen(argv[i])>prefix.size()) // concatenated?
292-
set(prefix, std::string(argv[i], prefix.size(), std::string::npos));
308+
if(strlen(argv[i]) > prefix->size()) // Concatenated.
309+
set(*prefix, std::string(argv[i], prefix->size(), std::string::npos));
293310
else
294311
{
295312
// Separated.
296313
if(i!=argc-1) // Guard against end of command line.
297314
{
298-
set(prefix, argv[i+1]);
315+
set(*prefix, argv[i + 1]);
299316
i++;
300317
}
301318
else
302-
set(prefix, "");
319+
set(*prefix, "");
303320
}
304321
}
305-
else if(prefix_in_list(argv[i], options_with_prefix, prefix))
322+
else if((prefix = prefix_in_list(argv[i], options_with_prefix)))
306323
{
307324
// options that have a concatenated argument
308-
set(prefix, std::string(argv[i], prefix.size(), std::string::npos));
325+
set(*prefix, std::string(argv[i], prefix->size(), std::string::npos));
309326
}
310327
else
311328
{ // unrecognized option

src/goto-cc/goto_cc_cmdline.cpp

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ Date: April 2010
1313

1414
#include "goto_cc_cmdline.h"
1515

16-
#include <cstring>
16+
#include <algorithm>
1717
#include <cassert>
18-
#include <iostream>
1918
#include <cstdio>
19+
#include <cstring>
20+
#include <iostream>
2021

2122
#include <util/invariant.h>
2223
#include <util/prefix.h>
@@ -46,23 +47,6 @@ bool goto_cc_cmdlinet::in_list(const char *option, const char **list)
4647
return false;
4748
}
4849

49-
bool goto_cc_cmdlinet::prefix_in_list(
50-
const char *option,
51-
const char **list,
52-
std::string &prefix)
53-
{
54-
for(std::size_t i=0; list[i]!=nullptr; i++)
55-
{
56-
if(strncmp(option, list[i], strlen(list[i]))==0)
57-
{
58-
prefix=std::string(list[i]);
59-
return true;
60-
}
61-
}
62-
63-
return false;
64-
}
65-
6650
std::size_t goto_cc_cmdlinet::get_optnr(const std::string &opt_string)
6751
{
6852
optionalt<std::size_t> optnr;
@@ -134,3 +118,11 @@ void goto_cc_cmdlinet::add_infile_arg(const std::string &arg)
134118
fclose(tmp);
135119
}
136120
}
121+
122+
bool goto_cc_cmdlinet::have_infile_arg() const
123+
{
124+
return std::any_of(
125+
parsed_argv.cbegin(), parsed_argv.cend(), [](const argt &arg) {
126+
return arg.is_infile_name;
127+
});
128+
}

src/goto-cc/goto_cc_cmdline.h

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,6 @@ class goto_cc_cmdlinet:public cmdlinet
2626

2727
static bool in_list(const char *option, const char **list);
2828

29-
static bool prefix_in_list(
30-
const char *option,
31-
const char **list,
32-
std::string &prefix);
33-
3429
// never fails, will add if not found
3530
std::size_t get_optnr(const std::string &option);
3631

@@ -68,14 +63,7 @@ class goto_cc_cmdlinet:public cmdlinet
6863
typedef std::list<argt> parsed_argvt;
6964
parsed_argvt parsed_argv;
7065

71-
bool have_infile_arg() const
72-
{
73-
for(parsed_argvt::const_iterator
74-
it=parsed_argv.begin(); it!=parsed_argv.end(); it++)
75-
if(it->is_infile_name)
76-
return true;
77-
return false;
78-
}
66+
bool have_infile_arg() const;
7967

8068
std::string stdin_file;
8169

src/goto-cc/goto_cc_mode.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ Date: June 2006
2121
class goto_cc_modet:public messaget
2222
{
2323
public:
24-
virtual int main(int argc, const char **argv);
24+
int main(int argc, const char **argv);
2525
virtual int doit()=0;
2626
virtual void help_mode()=0;
27-
virtual void help();
27+
void help();
2828
virtual void usage_error();
2929

3030
goto_cc_modet(

unit/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ target_link_libraries(
5151
testing-utils
5252
ansi-c
5353
solvers
54+
goto-cc-lib
5455
goto-checker
5556
goto-programs
5657
goto-instrument-lib

unit/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ SRC += analyses/ai/ai.cpp \
1919
big-int/big-int.cpp \
2020
compound_block_locations.cpp \
2121
get_goto_model_from_c_test.cpp \
22+
goto-cc/armcc_cmdline.cpp \
2223
goto-checker/report_util/is_property_less_than.cpp \
2324
goto-instrument/cover_instrument.cpp \
2425
goto-instrument/cover/cover_only.cpp \
@@ -162,6 +163,8 @@ testing-utils-clean:
162163
BMC_DEPS =../src/cbmc/c_test_input_generator$(OBJEXT) \
163164
../src/cbmc/cbmc_languages$(OBJEXT) \
164165
../src/cbmc/cbmc_parse_options$(OBJEXT) \
166+
../src/goto-cc/armcc_cmdline$(OBJEXT) \
167+
../src/goto-cc/goto_cc_cmdline$(OBJEXT) \
165168
../src/goto-instrument/source_lines$(OBJEXT) \
166169
../src/goto-instrument/cover$(OBJEXT) \
167170
../src/goto-instrument/cover_basic_blocks$(OBJEXT) \

unit/goto-cc/armcc_cmdline.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/// \file
2+
/// Unit tests of src/goto-cc/armcc_cmdline.cpp
3+
/// \author Diffblue Ltd.
4+
5+
#include <testing-utils/use_catch.h>
6+
7+
#include <util/optional.h>
8+
9+
#include <string>
10+
#include <vector>
11+
12+
optionalt<std::string>
13+
prefix_in_list(const std::string &option, const std::vector<std::string> &list);
14+
15+
static const std::vector<std::string> test_list{"spam", "eggs", "and", "ham"};
16+
17+
TEST_CASE("prefix_in_list exact match", "[core][armcc_cmdline][prefix_in_list]")
18+
{
19+
REQUIRE(*prefix_in_list("spam", test_list) == "spam");
20+
REQUIRE(*prefix_in_list("ham", test_list) == "ham");
21+
}
22+
23+
TEST_CASE(
24+
"prefix_in_list match prefix",
25+
"[core][armcc_cmdline][prefix_in_list]")
26+
{
27+
REQUIRE(*prefix_in_list("sp", test_list) == "spam");
28+
REQUIRE(*prefix_in_list("ha", test_list) == "ham");
29+
}
30+
31+
TEST_CASE("prefix_in_list unmatched", "[core][armcc_cmdline][prefix_in_list]")
32+
{
33+
REQUIRE_FALSE(prefix_in_list("foobar", test_list));
34+
}

unit/goto-cc/module_dependencies.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
goto-cc
2+
testing-utils
3+
util

0 commit comments

Comments
 (0)