From ef610dcab31e8f71f8b9f578cccf9359c8a261c6 Mon Sep 17 00:00:00 2001 From: lisa neigut Date: Thu, 28 Mar 2019 14:20:39 -0700 Subject: [PATCH] tlv: build tlv top-level structs construct structs for the TLV's. these will be the 'return type' for tlv fields in parent messages (so to speak) --- tools/generate-wire.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/tools/generate-wire.py b/tools/generate-wire.py index 02e5bc410..d849886ad 100755 --- a/tools/generate-wire.py +++ b/tools/generate-wire.py @@ -659,17 +659,39 @@ class Message(object): else: fmt_fields.append('{} {};'.format(f.fieldtype.name, f.name)) - return tlv_struct_template.format( - tlv_name=self.name, + return tlv_msg_struct_template.format( + msg_name=self.name, fields=str(fmt_fields)) -tlv_struct_template = """ -struct tlv_{tlv_name} {{ +tlv_msg_struct_template = """ +struct _tlv_msg_{msg_name} {{ {fields} }}; """ +tlv_struct_template = """ +struct _{tlv_name} {{ +{msg_type_structs} +}}; +""" + + +def build_tlv_type_struct(name, messages): + inner_structs = CCode() + for m in messages: + inner_structs.append('struct _tlv_msg_{} *{};'.format(m.name, m.name)) + return tlv_struct_template.format( + tlv_name=name, + msg_type_structs=str(inner_structs)) + + +def build_tlv_type_structs(tlv_fields): + structs = '' + for name, messages in tlv_fields.items(): + structs += build_tlv_type_struct(name, messages) + return structs + def find_message(messages, name): for m in messages: @@ -965,6 +987,7 @@ toplevel_messages = [m for m in messages if not m.is_tlv] built_hdr_enums = build_hdr_enums(options.enumname, toplevel_messages, tlv_fields) built_impl_enums = build_impl_enums(options.enumname, toplevel_messages, tlv_fields) tlv_structs = build_tlv_structs(tlv_fields) +tlv_structs += build_tlv_type_structs(tlv_fields) includes = '\n'.join(includes) printcases = ['case {enum.name}: printf("{enum.name}:\\n"); printwire_{name}("{name}", msg); return;'.format(enum=m.enum, name=m.name) for m in toplevel_messages]