@@ -169,22 +169,100 @@ std::string WiresharkBitfieldField::wiresharkMembersDissectCodeImpl() const
169169 return util::genStrListToString (elems, " \n " , " \n " );
170170}
171171
172- std::string WiresharkBitfieldField::wiresharkDissectBodyImpl (const WiresharkField* refField) const
172+ std::string WiresharkBitfieldField::wiresharkDissectBodyImpl ([[maybe_unused]] const WiresharkField* refField) const
173173{
174- // TODO
175- static_cast <void >(refField);
176- return " -- TODO: bitfield dissect body not implemented\n " ;
174+ auto & wiresharkGenerator = WiresharkGenerator::wiresharkCast (genGenerator ());
175+ util::GenStringsList members;
176+ for (auto * f : m_wiresharkFields) {
177+ static const std::string MemTempl =
178+ " #^#RESULT#$#, #^#NEXT_OFFSET#$# = #^#DISSECT#$#(#^#TVB#$#, #^#SUBTREE#$#, #^#OFFSET#$#, #^#LIMIT#$#)\n "
179+ " if #^#RESULT#$# ~= #^#SUCCESS#$# then\n "
180+ " return #^#RESULT#$#, #^#OFFSET#$#\n "
181+ " end\n "
182+ ;
183+
184+ util::GenReplacementMap memRepl = {
185+ {" RESULT" , wiresharkResultStr ()},
186+ {" NEXT_OFFSET" , wiresharkNextOffsetStr ()},
187+ {" DISSECT" , f->wiresharkDissectName ()},
188+ {" TVB" , wiresharkTvbStr ()},
189+ {" SUBTREE" , wiresharkFieldSubtreeStr ()},
190+ {" OFFSET" , wiresharkOffsetStr ()},
191+ {" LIMIT" , wiresharkOffsetLimitStr ()},
192+ {" SUCCESS" , Wireshark::wiresharkStatusCodeStr (wiresharkGenerator, Wireshark::StatusCode::Success)},
193+ };
194+
195+ members.push_back (util::genProcessTemplate (MemTempl, memRepl));
196+ }
197+
198+ static const std::string Templ =
199+ " local #^#RANGE#$# = tvb(#^#OFFSET#$#, #^#LEN#$#)\n "
200+ " local #^#SUBTREE#$# = tree:add#^#SUFFIX#$#(field, #^#RANGE#$#)\n "
201+ " #^#MEMBERS#$#\n "
202+ " #^#NEXT_OFFSET#$# = #^#OFFSET#$# + #^#LEN#$#\n "
203+ ;
204+
205+ auto parseObj = genBitfieldFieldParseObj ();
206+ util::GenReplacementMap repl = {
207+ {" RANGE" , wiresharkRangeStr ()},
208+ {" LEN" , std::to_string (parseObj.parseMaxLength ())},
209+ {" SUBTREE" , wiresharkFieldSubtreeStr ()},
210+ {" OFFSET" , wiresharkOffsetStr ()},
211+ {" NEXT_OFFSET" , wiresharkNextOffsetStr ()},
212+ {" MEMBERS" , util::genStrListToString (members, " \n " , " " )},
213+ };
214+
215+ if (parseObj.parseEndian () == commsdsl::parse::ParseEndian_Little) {
216+ repl[" SUFFIX" ] = strings::genLittleEndianSuffixStr ();
217+ }
218+
219+ return util::genProcessTemplate (Templ, repl);
177220}
178221
179222std::string WiresharkBitfieldField::wiresharkValidFuncBodyImpl (const WiresharkField* refField) const
180223{
181- // TODO
182- static_cast <void >(refField);
183- return " -- TODO: bitfield valid body not implemented\n " ;
224+ util::GenStringsList members;
225+ for (auto * f : m_wiresharkFields) {
226+ if (f->wiresharkHasTrivialValid ()) {
227+ continue ;
228+ }
229+
230+ static const std::string MemTempl =
231+ " if not #^#FUNC#$#(#^#FIELD#$#) then\n "
232+ " return false\n "
233+ " endif\n "
234+ ;
235+
236+ util::GenReplacementMap memRepl = {
237+ {" FUNC" , f->wiresharkValidFuncName ()},
238+ {" FIELD" , f->wiresharkFieldObjName (refField)},
239+ };
240+
241+ members.push_back (util::genProcessTemplate (MemTempl, memRepl));
242+ }
243+
244+ static const std::string Templ =
245+ " #^#MEMBERS#$#\n "
246+ " #^#CONDS#$#\n "
247+ " return true\n "
248+ ;
249+
250+ util::GenReplacementMap repl = {
251+ {" MEMBERS" , util::genStrListToString (members, " \n " , " " )},
252+ {" CONDS" , wiresharkExtraValidCondsCodeInternal ()},
253+ };
254+
255+ return util::genProcessTemplate (Templ, repl);
184256}
185257
186258bool WiresharkBitfieldField::wiresharkHasTrivialValidImpl () const
187259{
260+ auto parseObj = genBitfieldFieldParseObj ();
261+ auto validCond = parseObj.parseValidCond ();
262+ if (validCond.parseValid ()) {
263+ return false ;
264+ }
265+
188266 return
189267 std::all_of (
190268 m_wiresharkFields.begin (), m_wiresharkFields.end (),
@@ -194,4 +272,16 @@ bool WiresharkBitfieldField::wiresharkHasTrivialValidImpl() const
194272 });
195273}
196274
275+ std::string WiresharkBitfieldField::wiresharkExtraValidCondsCodeInternal () const
276+ {
277+ auto parseObj = genBitfieldFieldParseObj ();
278+ auto validCond = parseObj.parseValidCond ();
279+ if (!validCond.parseValid ()) {
280+ return strings::genEmptyString ();
281+ }
282+
283+ // TODO:
284+ return " --TODO: implement check of extra conditions\n " ;
285+ }
286+
197287} // namespace commsdsl2wireshark
0 commit comments