Skip to content

Commit 694a835

Browse files
committed
fix(dbc): cleaning up magic numbers and short variable names in dbc.cpp
1 parent b138a2f commit 694a835

File tree

1 file changed

+96
-77
lines changed

1 file changed

+96
-77
lines changed

src/dbc.cpp

Lines changed: 96 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,33 @@ const auto byteOrderPattern = "([0-1])";
1717
const auto signPattern = "(\\+|\\-)";
1818
const auto scalePattern = "(\\d+\\.?(\\d+)?)"; // Non negative float
1919
const auto offsetPattern = floatPattern;
20+
// NOLINTNEXTLINE -- Disable warning for runtime initialization and can throw. Can't fix until newer c++ version with constexpr
2021
const auto offsetScalePattern = std::string("\\(") + scalePattern + "\\," + offsetPattern + "\\)";
2122
const auto minPattern = floatPattern;
2223
const auto maxPattern = floatPattern;
24+
// NOLINTNEXTLINE -- Disable warning for runtime initialization and can throw. Can't fix until newer c++ version with constexpr
2325
const auto minMaxPattern = std::string("\\[") + minPattern + "\\|" + maxPattern + "\\]";
2426
const auto unitPattern = "\"(.*)\""; // Random string
2527
const auto receiverPattern = "([\\w\\,]+|Vector__XXX)*";
2628
const auto whiteSpace = "\\s";
2729

30+
constexpr unsigned SIGNAL_NAME_GROUP = 2;
31+
constexpr unsigned SIGNAL_START_BIT_GROUP = 3;
32+
constexpr unsigned SIGNAL_SIZE_GROUP = 4;
33+
constexpr unsigned SIGNAL_ENDIAN_GROUP = 5;
34+
constexpr unsigned SIGNAL_SIGNED_GROUP = 6;
35+
constexpr unsigned SIGNAL_FACTOR_GROUP = 7;
36+
constexpr unsigned SIGNAL_OFFSET_GROUP = 9;
37+
constexpr unsigned SIGNAL_MIN_GROUP = 11;
38+
constexpr unsigned SIGNAL_MAX_GROUP = 13;
39+
constexpr unsigned SIGNAL_UNIT_GROUP = 15;
40+
constexpr unsigned SIGNAL_RECIEVER_GROUP = 16;
41+
42+
constexpr unsigned MESSAGE_ID_GROUP = 2;
43+
constexpr unsigned MESSAGE_NAME_GROUP = 3;
44+
constexpr unsigned MESSAGE_SIZE_GROUP = 4;
45+
constexpr unsigned MESSAGE_NODE_GROUP = 5;
46+
2847
enum VALToken { Identifier = 0, CANId, SignalName, Value, Description };
2948

3049
struct VALObject {
@@ -33,81 +52,83 @@ struct VALObject {
3352
std::vector<Signal::SignalValueDescriptions> vd;
3453
};
3554

36-
static bool parseVal(const std::string& str, VALObject& obj);
37-
bool parseVal(const std::string& str, VALObject& obj) {
55+
static bool parse_value(const std::string& str, VALObject& obj);
56+
57+
bool parse_value(const std::string& str, VALObject& obj) {
3858
obj.signal_name = "";
3959
obj.vd.clear();
4060
auto state = Identifier;
41-
const char* a = str.data();
42-
Signal::SignalValueDescriptions vd;
61+
const char* value_data = str.data();
62+
Signal::SignalValueDescriptions value_description;
4363
for (;;) {
4464
switch (state) {
4565
case Identifier: {
46-
if (*a != 'V') {
66+
if (*value_data != 'V') {
4767
return false;
4868
}
49-
a++;
50-
if (*a != 'A') {
69+
value_data++;
70+
if (*value_data != 'A') {
5171
return false;
5272
}
53-
a++;
54-
if (*a != 'L') {
73+
value_data++;
74+
if (*value_data != 'L') {
5575
return false;
5676
}
57-
a++;
58-
if (*a != '_') {
77+
value_data++;
78+
if (*value_data != '_') {
5979
return false;
6080
}
61-
a++;
62-
if (*a != ' ') {
81+
value_data++;
82+
if (*value_data != ' ') {
6383
return false;
6484
}
65-
a++; // skip whitespace
85+
value_data++; // skip whitespace
6686
state = CANId;
6787
break;
6888
}
6989
case CANId: {
7090
std::string can_id_str;
71-
while (*a >= '0' && *a <= '9') {
72-
can_id_str += *a;
73-
a++;
91+
while (*value_data >= '0' && *value_data <= '9') {
92+
can_id_str += *value_data;
93+
value_data++;
7494
}
7595
if (can_id_str.empty()) {
7696
return false;
7797
}
7898
obj.can_id = static_cast<uint32_t>(std::stoul(can_id_str));
79-
if (*a != ' ') {
99+
if (*value_data != ' ') {
80100
return false;
81101
}
82-
a++; // skip whitespace
102+
value_data++; // skip whitespace
83103
state = SignalName;
84104
break;
85105
}
86106
case SignalName: {
87-
if ((*a >= 'a' && *a <= 'z') || (*a >= 'A' && *a <= 'Z') || *a == '_') {
88-
obj.signal_name += *a;
107+
if ((*value_data >= 'a' && *value_data <= 'z') || (*value_data >= 'A' && *value_data <= 'Z') || *value_data == '_') {
108+
obj.signal_name += *value_data;
89109
} else {
90110
return false;
91111
}
92-
a++;
93-
while ((*a >= 'a' && *a <= 'z') || (*a >= 'A' && *a <= 'Z') || *a == '_' || (*a >= '0' && *a <= '9')) {
94-
obj.signal_name += *a;
95-
a++;
112+
value_data++;
113+
while ((*value_data >= 'a' && *value_data <= 'z') || (*value_data >= 'A' && *value_data <= 'Z') || *value_data == '_'
114+
|| (*value_data >= '0' && *value_data <= '9')) {
115+
obj.signal_name += *value_data;
116+
value_data++;
96117
}
97-
if (*a != ' ') {
118+
if (*value_data != ' ') {
98119
return false;
99120
}
100-
a++; // skip whitespace
121+
value_data++; // skip whitespace
101122
state = Value;
102123
break;
103124
}
104125
case Value: {
105126
std::string value_str;
106-
while (*a >= '0' && *a <= '9') {
107-
value_str += *a;
108-
a++;
127+
while (*value_data >= '0' && *value_data <= '9') {
128+
value_str += *value_data;
129+
value_data++;
109130
}
110-
if (*a == ';') {
131+
if (*value_data == ';') {
111132
if (value_str.empty()) {
112133
return true;
113134
}
@@ -117,35 +138,35 @@ bool parseVal(const std::string& str, VALObject& obj) {
117138
return false;
118139
}
119140

120-
if (*a != ' ') {
141+
if (*value_data != ' ') {
121142
return false;
122143
}
123-
a++; // skip whitespace
124-
vd.value = (uint32_t)std::stoul(value_str);
144+
value_data++; // skip whitespace
145+
value_description.value = (uint32_t)std::stoul(value_str);
125146
state = Description;
126147
break;
127148
}
128149
case Description: {
129150
std::string desc;
130-
if (*a != '"') {
151+
if (*value_data != '"') {
131152
return false;
132153
}
133-
a++;
134-
while (*a != '"' && *a != 0) {
135-
desc += *a;
136-
a++;
154+
value_data++;
155+
while (*value_data != '"' && *value_data != 0) {
156+
desc += *value_data;
157+
value_data++;
137158
}
138-
if (*a == 0) {
159+
if (*value_data == 0) {
139160
return false;
140161
}
141-
a++;
142-
if (*a != ' ') {
162+
value_data++;
163+
if (*value_data != ' ') {
143164
return false;
144165
}
145-
a++; // skip whitespace
166+
value_data++; // skip whitespace
146167

147-
vd.description = desc;
148-
obj.vd.push_back(vd);
168+
value_description.description = desc;
169+
obj.vd.push_back(value_description);
149170

150171
state = Value;
151172
break;
@@ -156,9 +177,7 @@ bool parseVal(const std::string& str, VALObject& obj) {
156177
}
157178

158179
DbcParser::DbcParser()
159-
: version("")
160-
, nodes()
161-
, version_re("^(VERSION)\\s\"(.*)\"")
180+
: version_re("^(VERSION)\\s\"(.*)\"")
162181
, bit_timing_re("^(BS_:)")
163182
, name_space_re("^(NS_)\\s\\:")
164183
, node_re("^(BU_:)\\s((?:[\\w]+?\\s?)*)")
@@ -171,18 +190,18 @@ DbcParser::DbcParser()
171190
}
172191

173192
void DbcParser::parse_file(const std::string& file) {
174-
std::ifstream s(file.c_str());
193+
std::ifstream stream(file.c_str());
175194
std::string line;
176195
std::vector<std::string> lines;
177196

178197
messages.clear();
179198

180-
parse_dbc_header(s);
199+
parse_dbc_header(stream);
181200

182-
parse_dbc_nodes(s);
201+
parse_dbc_nodes(stream);
183202

184-
while (!s.eof()) {
185-
utils::StreamHandler::get_next_non_blank_line(s, line);
203+
while (!stream.eof()) {
204+
utils::StreamHandler::get_next_non_blank_line(stream, line);
186205
lines.push_back(line);
187206
}
188207

@@ -201,9 +220,9 @@ std::vector<libdbc::Message> DbcParser::get_messages() const {
201220
return messages;
202221
}
203222

204-
Message::ParseSignalsStatus DbcParser::parseMessage(const uint32_t id, const std::vector<uint8_t>& data, std::vector<double>& out_values) {
223+
Message::ParseSignalsStatus DbcParser::parseMessage(const uint32_t message_id, const std::vector<uint8_t>& data, std::vector<double>& out_values) {
205224
for (const auto& message : messages) {
206-
if (message.id() == id) {
225+
if (message.id() == message_id) {
207226
return message.parseSignals(data, out_values);
208227
}
209228
}
@@ -242,60 +261,60 @@ void DbcParser::parse_dbc_nodes(std::istream& file_stream) {
242261
}
243262

244263
if (match.length() > 2) {
245-
std::string n = match.str(2);
246-
utils::String::split(n, nodes);
264+
std::string node = match.str(2);
265+
utils::String::split(node, nodes);
247266
}
248267
}
249268

250269
void DbcParser::parse_dbc_messages(const std::vector<std::string>& lines) {
251270
std::smatch match;
252271

253-
std::vector<VALObject> sv;
272+
std::vector<VALObject> signal_value;
254273

255274
VALObject obj{};
256275
for (const auto& line : lines) {
257276
if (std::regex_search(line, match, message_re)) {
258-
uint32_t id = static_cast<uint32_t>(std::stoul(match.str(2)));
259-
std::string name = match.str(3);
260-
uint8_t size = static_cast<uint8_t>(std::stoul(match.str(4)));
261-
std::string node = match.str(5);
277+
uint32_t message_id = static_cast<uint32_t>(std::stoul(match.str(MESSAGE_ID_GROUP)));
278+
std::string name = match.str(MESSAGE_NAME_GROUP);
279+
uint8_t size = static_cast<uint8_t>(std::stoul(match.str(MESSAGE_SIZE_GROUP)));
280+
std::string node = match.str(MESSAGE_NODE_GROUP);
262281

263-
Message msg(id, name, size, node);
282+
Message msg(message_id, name, size, node);
264283

265284
messages.push_back(msg);
266285
continue;
267286
}
268287

269288
if (std::regex_search(line, match, signal_re)) {
270-
std::string name = match.str(2);
289+
std::string name = match.str(SIGNAL_NAME_GROUP);
271290
bool is_multiplexed = false; // No support yet
272-
uint32_t start_bit = static_cast<uint32_t>(std::stoul(match.str(3)));
273-
uint32_t size = static_cast<uint32_t>(std::stoul(match.str(4)));
274-
bool is_bigendian = (std::stoul(match.str(5)) == 0);
275-
bool is_signed = (match.str(6) == "-");
291+
uint32_t start_bit = static_cast<uint32_t>(std::stoul(match.str(SIGNAL_START_BIT_GROUP)));
292+
uint32_t size = static_cast<uint32_t>(std::stoul(match.str(SIGNAL_SIZE_GROUP)));
293+
bool is_bigendian = (std::stoul(match.str(SIGNAL_ENDIAN_GROUP)) == 0);
294+
bool is_signed = (match.str(SIGNAL_SIGNED_GROUP) == "-");
276295

277-
double factor = utils::String::convert_to_double(match.str(7).data());
278-
double offset = utils::String::convert_to_double(match.str(9).data());
279-
double min = utils::String::convert_to_double(match.str(11).data());
280-
double max = utils::String::convert_to_double(match.str(13).data());
296+
double factor = utils::String::convert_to_double(match.str(SIGNAL_FACTOR_GROUP));
297+
double offset = utils::String::convert_to_double(match.str(SIGNAL_OFFSET_GROUP));
298+
double min = utils::String::convert_to_double(match.str(SIGNAL_MIN_GROUP));
299+
double max = utils::String::convert_to_double(match.str(SIGNAL_MAX_GROUP));
281300

282-
std::string unit = match.str(15);
301+
std::string unit = match.str(SIGNAL_UNIT_GROUP);
283302

284303
std::vector<std::string> receivers;
285-
utils::String::split(match.str(16), receivers, ',');
304+
utils::String::split(match.str(SIGNAL_RECIEVER_GROUP), receivers, ',');
286305

287306
Signal sig(name, is_multiplexed, start_bit, size, is_bigendian, is_signed, factor, offset, min, max, unit, receivers);
288307
messages.back().appendSignal(sig);
289308
continue;
290309
}
291310

292-
if (parseVal(line, obj)) {
293-
sv.push_back(obj);
311+
if (parse_value(line, obj)) {
312+
signal_value.push_back(obj);
294313
continue;
295314
}
296315
}
297316

298-
for (const auto& signal : sv) {
317+
for (const auto& signal : signal_value) {
299318
for (auto& msg : messages) {
300319
if (msg.id() == signal.can_id) {
301320
msg.addValueDescription(signal.signal_name, signal.vd);

0 commit comments

Comments
 (0)