@@ -17,14 +17,33 @@ const auto byteOrderPattern = "([0-1])";
1717const auto signPattern = " (\\ +|\\ -)" ;
1818const auto scalePattern = " (\\ d+\\ .?(\\ d+)?)" ; // Non negative float
1919const auto offsetPattern = floatPattern;
20+ // NOLINTNEXTLINE -- Disable warning for runtime initialization and can throw. Can't fix until newer c++ version with constexpr
2021const auto offsetScalePattern = std::string(" \\ (" ) + scalePattern + " \\ ," + offsetPattern + " \\ )" ;
2122const auto minPattern = floatPattern;
2223const auto maxPattern = floatPattern;
24+ // NOLINTNEXTLINE -- Disable warning for runtime initialization and can throw. Can't fix until newer c++ version with constexpr
2325const auto minMaxPattern = std::string(" \\ [" ) + minPattern + " \\ |" + maxPattern + " \\ ]" ;
2426const auto unitPattern = " \" (.*)\" " ; // Random string
2527const auto receiverPattern = " ([\\ w\\ ,]+|Vector__XXX)*" ;
2628const 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+
2847enum VALToken { Identifier = 0 , CANId, SignalName, Value, Description };
2948
3049struct 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
158179DbcParser::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
173192void 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
250269void 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