diff --git a/tools/generate-wire.py b/tools/generate-wire.py index 97ceed393..6460dcaa9 100755 --- a/tools/generate-wire.py +++ b/tools/generate-wire.py @@ -271,7 +271,7 @@ fromwire_tlv_impl_templ = """static bool fromwire_{tlv_name}_{name}({ctx}{args}) }} """ -fromwire_subtype_impl_templ = """static bool fromwire_{name}({ctx}{args}) +fromwire_subtype_impl_templ = """{static}bool fromwire_{name}({ctx}{args}) {{ {fields} @@ -280,6 +280,8 @@ fromwire_subtype_impl_templ = """static bool fromwire_{name}({ctx}{args}) }} """ +fromwire_subtype_header_templ = """bool fromwire_{name}({ctx}{args});""" + fromwire_header_templ = """bool fromwire_{name}({ctx}const void *p{args}); """ @@ -887,6 +889,8 @@ class Subtype(Message): def print_towire(self): """ prints towire function definition for a subtype""" + template = subtype_towire_header_stub if options.header else subtype_towire_stub + field_decls = [] for f in self.fields: if f.optional: @@ -915,7 +919,8 @@ class Subtype(Message): else: ref = '&' if f.fieldtype.needs_ptr() else '' subcalls.append('towire_{}(p, {}{}->{});'.format(basetype, ref, self.name, f.name)) - return subtype_towire_stub.format( + return template.format( + static='' if options.subtypes else 'static ', name=self.name, field_decls='\n'.join(field_decls), subcalls=str(subcalls)) @@ -928,6 +933,7 @@ class Subtype(Message): ctx_arg = 'const tal_t *ctx, ' if self.has_variable_fields else '' args = 'const u8 **cursor, size_t *plen, struct {name} *{name}'.format(name=self.name) fields = ['\t{} {};\n'.format(f.fieldtype.name, f.name) for f in self.fields if f.is_len_var] + template = fromwire_subtype_header_templ if options.header else fromwire_subtype_impl_templ subcalls = CCode() for f in self.fields: basetype = f.fieldtype.base() @@ -970,7 +976,8 @@ class Subtype(Message): basetype, ref, self.name, f.name) subcalls.append(s) - return fromwire_subtype_impl_templ.format( + return template.format( + static='' if options.subtypes else 'static ', name=self.name, ctx=ctx_arg, args=''.join(args), @@ -985,12 +992,14 @@ tlv_message_towire_stub = """static void towire_{tlv_name}_{name}(u8 **p, struct }} """ -subtype_towire_stub = """static void towire_{name}(u8 **p, const struct {name} *{name}) {{ +subtype_towire_stub = """{static}void towire_{name}(u8 **p, const struct {name} *{name}) {{ {field_decls} {subcalls} }} """ +subtype_towire_header_stub = """void towire_{name}(u8 **p, const struct {name} *{name});""" + tlv_struct_template = """ struct {tlv_name} {{ {msg_type_structs} @@ -1193,6 +1202,7 @@ def find_message_with_option(messages, optional_messages, name, option): parser = argparse.ArgumentParser(description='Generate C from CSV') parser.add_argument('--header', action='store_true', help="Create wire header") +parser.add_argument('--subtypes', action='store_true', help="Include subtype parsing function delcarations in header definition. Only active if --header also declared.") parser.add_argument('--bolt', action='store_true', help="Generate wire-format for BOLT") parser.add_argument('--printwire', action='store_true', help="Create print routines") parser.add_argument('headerfilename', help='The filename of the header') @@ -1299,7 +1309,8 @@ def format_enums(template, enums, enumname): def build_hdr_enums(toplevel_enumname, toplevel_messages, tlv_fields): enum_set = "" - enum_set += enum_header(construct_hdr_enums(toplevel_messages), toplevel_enumname) + if len(toplevel_messages): + enum_set += enum_header(construct_hdr_enums(toplevel_messages), toplevel_enumname) for field_name, tlv_messages in tlv_fields.items(): enum_set += "\n" enum_set += enum_header(construct_hdr_enums(tlv_messages), field_name + '_type') @@ -1308,7 +1319,8 @@ def build_hdr_enums(toplevel_enumname, toplevel_messages, tlv_fields): def build_impl_enums(toplevel_enumname, toplevel_messages, tlv_fields): enum_set = "" - enum_set += enum_impl(construct_impl_enums(toplevel_messages), toplevel_enumname) + if len(toplevel_messages): + enum_set += enum_impl(construct_impl_enums(toplevel_messages), toplevel_enumname) for field_name, tlv_messages in tlv_fields.items(): enum_set += "\n" enum_set += enum_impl(construct_impl_enums(tlv_messages), field_name + '_type') @@ -1470,6 +1482,8 @@ else: if not options.header: towire_decls += build_tlv_towires(tlv_fields) fromwire_decls += build_tlv_fromwires(tlv_fields) + + if not options.header or options.header and options.subtypes: for subtype in subtypes: towire_decls.append(subtype.print_towire()) fromwire_decls.append(subtype.print_fromwire())