diff --git a/tools/gen/header_template b/tools/gen/header_template index 4b7188555..bbfe0df97 100644 --- a/tools/gen/header_template +++ b/tools/gen/header_template @@ -37,28 +37,6 @@ const char *${enum_set['name']}_name(int e); bool ${enum_set['name']}_is_defined(u16 type); % endfor -## Structs for subtypes + tlv messages -% for struct in structs: -struct ${struct.struct_name()} { - % for f in struct.fields.values(): - % for c in f.field_comments: - /* ${c} */ - % endfor - % if bool(f.len_field_of): -<% continue %> - % endif - % if f.is_varlen() and f.type_obj.is_varsize(): - ${f.type_obj.type_name()} **${f.name}; - % elif f.is_varlen() or f.type_obj.is_varsize(): - ${f.type_obj.type_name()} *${f.name}; - % elif f.is_array(): - ${f.type_obj.type_name()} ${f.name}[${f.count}]; - % else: - ${f.type_obj.type_name()} ${f.name}; - % endif - % endfor -}; -% endfor ## Structs for TLVs % for tlv in tlvs.values(): struct ${tlv.struct_name()} { @@ -82,6 +60,29 @@ struct ${tlv.struct_name()} { }; % endfor +## Structs for subtypes + tlv messages +% for struct in structs: +struct ${struct.struct_name()} { + % for f in struct.fields.values(): + % for c in f.field_comments: + /* ${c} */ + % endfor + % if bool(f.len_field_of): +<% continue %> + % endif + % if f.is_varlen() and f.type_obj.is_varsize(): + ${f.type_obj.type_name()} **${f.name}; + % elif f.is_varlen() or f.type_obj.is_varsize(): + ${f.type_obj.type_name()} *${f.name}; + % elif f.is_array(): + ${f.type_obj.type_name()} ${f.name}[${f.count}]; + % else: + ${f.type_obj.type_name()} ${f.name}; + % endif + % endfor +}; +% endfor + % for tlv in tlvs.values(): struct ${tlv.struct_name()} *${tlv.struct_name()}_new(const tal_t *ctx); diff --git a/tools/gen/impl_template b/tools/gen/impl_template index 4ce2dcb37..7b9011e1d 100644 --- a/tools/gen/impl_template +++ b/tools/gen/impl_template @@ -66,6 +66,8 @@ towire_${type_obj.name}_array(${ptr}, ${fieldname}, ${f.size('tal_count(' + fiel towire_${type_obj.name}(${ptr}, ${f.name}); % elif is_single_ptr: towire_${type_obj.name}(${ptr}, ${'*' if type_obj.is_assignable() else ''}${fieldname}); +%elif f.type_obj.is_tlv(): +towire_tlv_${type_obj.name}(${ptr}, ${'' if type_obj.is_assignable() or type_obj.is_varsize() else '&'}${fieldname}); % else: towire_${type_obj.name}(${ptr}, ${'' if type_obj.is_assignable() or type_obj.is_varsize() else '&'}${fieldname}); % endif @@ -74,6 +76,8 @@ towire_${type_obj.name}(${ptr}, ${'' if type_obj.is_assignable() or type_obj.is_ <%def name="fromwire_subtype_field(fieldname, f, ctx, is_ptr)">\ <% type_ = f.type_obj.name + if f.type_obj.is_tlv(): + type_ = 'tlv_' + type_ typename = f.type_obj.type_name() if f.type_obj.is_varsize(): typename += ' *' diff --git a/tools/generate-wire.py b/tools/generate-wire.py index ebf7614d5..dfd3b11a4 100755 --- a/tools/generate-wire.py +++ b/tools/generate-wire.py @@ -590,6 +590,9 @@ def main(options, args=None, output=sys.stdout, lines=None): else: count = tokens[4] + if tokens[3] in master.tlvs: + type_obj.tlv = master.tlvs[tokens[3]] + subtype.add_data_field(tokens[2], type_obj, count, comments=list(comment_set), optional=optional) comment_set = []