CBMC
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
bcc_cmdline.cpp
Go to the documentation of this file.
1/*******************************************************************\
2
3Module: A special command line object for Bruce's C Compiler
4
5Author: Michael Tautschnig
6
7\*******************************************************************/
8
11
12#include "bcc_cmdline.h"
13
14#include <util/invariant.h>
15#include <util/prefix.h>
16
17#include <iostream>
18
19// non-bcc options
21{
22 "--verbosity",
23 "--function",
24 "--native-compiler",
25 "--native-linker",
26 "--print-rejected-preprocessed-source",
27 nullptr
28};
29
31{
32 "-0",
33 "-3",
34 "-E",
35 "-G",
36 "-N",
37 "-O",
38 "-P",
39 "-S",
40 "-V",
41 "-c",
42 "-e",
43 "-g",
44 "-v",
45 "-w",
46 "-x",
47 "-W",
48 "-ansi",
49 nullptr
50};
51
53{
54 "-A",
55 "-B",
56 "-D",
57 "-U",
58 "-M",
59 "-o",
60 "-C",
61 "-P",
62 "-I",
63 "-L",
64 "-T",
65 "-Q",
66 "-t",
67 nullptr
68};
69
70bool bcc_cmdlinet::parse(int argc, const char **argv)
71{
72 PRECONDITION(argc > 0);
73 add_arg(argv[0]);
74
75 for(int i=1; i<argc; i++)
76 {
77 std::string argv_i=argv[i];
78
79 // file?
80 if(argv_i=="-" || !has_prefix(argv_i, "-"))
81 {
83 continue;
84 }
85
86 bool found=false;
87
88 // separated only, and also allow concatenation with "="
89 for(const char **o=goto_bcc_options_with_argument;
90 *o!=nullptr && !found;
91 ++o)
92 {
93 std::string os(*o);
94
95 if(argv_i==os) // separated
96 {
97 found=true;
98 if(i!=argc-1)
99 {
100 set(argv_i, argv[i+1]);
101 ++i;
102 }
103 else
104 set(argv_i, "");
105 }
106 else if(has_prefix(argv_i, os+"=")) // concatenated with "="
107 {
108 found=true;
109 set(os, argv_i.substr(os.size()+1));
110 }
111 }
112
113 // goto-bcc-only command line argument found
114 if(found)
115 continue;
116
117 // add to new_argv
119
120 // without argument; also store in cmdlinet
122 {
123 set(argv_i);
124 continue;
125 }
126
127 for(const char **o=bcc_options_with_argument;
128 *o!=nullptr && !found;
129 ++o)
130 {
131 std::string os(*o);
132
133 if(argv_i==os) // separated
134 {
135 found=true;
136 if(i!=argc-1)
137 {
138 set(argv_i, argv[i+1]);
139 add_arg(argv[i+1]);
140 ++i;
141 }
142 else
143 set(argv_i, "");
144 }
145 else if(has_prefix(argv_i, os))
146 {
147 found=true;
148 set(os, argv[i]+os.size());
149 }
150 }
151
152 if(!found)
153 {
154 // unrecognized option
155 std::cerr << "Warning: uninterpreted bcc option '" << argv_i
156 << "'\n";
157 }
158 }
159
160 return false;
161}
const char * goto_bcc_options_with_argument[]
const char * bcc_options_with_argument[]
const char * bcc_options_without_argument[]
A special command line object for Bruce's C Compiler Author: Michael Tautschnig Date: July 2016.
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:562
virtual bool parse(int, const char **)
void set(const std::string &opt, const char *value) override
Set option option to value.
void add_infile_arg(const std::string &arg)
static bool in_list(const char *option, const char **list)
void add_arg(const std::string &arg)
bool has_prefix(const std::string &s, const std::string &prefix)
Definition converter.cpp:13
#define PRECONDITION(CONDITION)
Definition invariant.h:463