From d9904c95abd24bddafce053785d465c2b599c9f5 Mon Sep 17 00:00:00 2001 From: lisa neigut Date: Thu, 28 Mar 2019 14:17:07 -0700 Subject: [PATCH] tlv: add tlv fields to enum declarations in implementation file '.c' wire format files include case statements to print the names of enums. Include such methods for the enums pertaining to tlv's as well. --- tools/generate-wire.py | 97 +++++++++++++++++++++++++++++++----------- 1 file changed, 71 insertions(+), 26 deletions(-) diff --git a/tools/generate-wire.py b/tools/generate-wire.py index ee0a5ce95..e5489ea7f 100755 --- a/tools/generate-wire.py +++ b/tools/generate-wire.py @@ -248,6 +248,31 @@ towire_impl_templ = """u8 *towire_{name}(const tal_t *ctx{args}) }} """ +towire_tlv_templ = """u8 *towire_{name}(const tal_t *ctx{args}) +{{ +{field_decls} +\tu8 *p = tal_arr(ctx, u8, 0); +\ttowire_u16(&p, {enumname}); +\ttowire_u16(&p, {len}); +{subcalls} + +\treturn memcheck(p, tal_count(p)); +}} +""" + +fromwire_tlv_templ = """bool frowire_{name}({ctx}const void *p{args}) +{{ +{fields} +\tconst u8 *cursor = p; +\tsize_t plen = tal_count(p); + +\tif (frmwire_u16(&cursor, &plen) != {enum.name}) +\t\treturn false; +{subcalls} +\treturn cursor != NULL; +}} +""" + printwire_header_templ = """void printwire_{name}(const char *fieldname, const u8 *cursor); """ printwire_impl_templ = """void printwire_{name}(const char *fieldname, const u8 *cursor) @@ -739,7 +764,7 @@ for line in fileinput.input(options.files): comments = [] -def construct_enums(msgs): +def construct_hdr_enums(msgs): enums = "" for m in msgs: for c in m.comments: @@ -748,19 +773,39 @@ def construct_enums(msgs): return enums +def construct_impl_enums(msgs): + return '\n\t'.join(['case {enum.name}: return "{enum.name}";'.format(enum=m.enum) for m in msgs]) + + def enum_header(enums, enumname): - return enum_header_template.format( + return format_enums(enum_header_template, enums, enumname) + + +def enum_impl(enums, enumname): + return format_enums(enum_impl_template, enums, enumname) + + +def format_enums(template, enums, enumname): + return template.format( enums=enums, enumname=enumname) -def build_enums(toplevel_enumname, toplevel_enums, tlv_fields): +def build_hdr_enums(toplevel_enumname, messages, tlv_fields): enum_set = "" - enum_set += enum_header(toplevel_enums, toplevel_enumname) + enum_set += enum_header(construct_hdr_enums(messages), toplevel_enumname) for field_name, messages in tlv_fields.items(): enum_set += "\n" - enums = construct_enums(messages) - enum_set += enum_header(enums, field_name + '_type') + enum_set += enum_header(construct_hdr_enums(messages), field_name + '_type') + return enum_set + + +def build_impl_enums(toplevel_enumname, messages, tlv_fields): + enum_set = "" + enum_set += enum_impl(construct_impl_enums(messages), toplevel_enumname) + for field_name, messages in tlv_fields.items(): + enum_set += "\n" + enum_set += enum_impl(construct_impl_enums(messages), field_name + '_type') return enum_set @@ -770,6 +815,20 @@ enum_header_template = """enum {enumname} {{ const char *{enumname}_name(int e); """ +enum_impl_template = """ +const char *{enumname}_name(int e) +{{ +\tstatic char invalidbuf[sizeof("INVALID ") + STR_MAX_CHARS(e)]; + +\tswitch ((enum {enumname})e) {{ +\t{enums} +\t}} + +\tsnprintf(invalidbuf, sizeof(invalidbuf), "INVALID %i", e); +\treturn invalidbuf; +}} +""" + header_template = """/* This file was generated by generate-wire.py */ /* Do not modify this file! Modify the _csv file it was generated from. */ #ifndef LIGHTNING_{idem} @@ -777,7 +836,7 @@ header_template = """/* This file was generated by generate-wire.py */ #include #include {includes} -{formatted_enums} +{formatted_hdr_enums} {func_decls} #endif /* LIGHTNING_{idem} */ """ @@ -788,19 +847,7 @@ impl_template = """/* This file was generated by generate-wire.py */ #include #include #include - -const char *{enumname}_name(int e) -{{ -\tstatic char invalidbuf[sizeof("INVALID ") + STR_MAX_CHARS(e)]; - -\tswitch ((enum {enumname})e) {{ -\t{cases} -\t}} - -\tsnprintf(invalidbuf, sizeof(invalidbuf), "INVALID %i", e); -\treturn invalidbuf; -}} - +{formatted_impl_enums} {func_decls} """ @@ -850,10 +897,9 @@ else: template = impl_template # Dump out enum, sorted by value order. -enums = construct_enums(messages) -built_enums = build_enums(options.enumname, enums, tlv_fields) +built_hdr_enums = build_hdr_enums(options.enumname, messages, tlv_fields) +built_impl_enums = build_impl_enums(options.enumname, messages, tlv_fields) includes = '\n'.join(includes) -cases = ['case {enum.name}: return "{enum.name}";'.format(enum=m.enum) for m in messages] printcases = ['case {enum.name}: printf("{enum.name}:\\n"); printwire_{name}("{name}", msg); return;'.format(enum=m.enum, name=m.name) for m in messages] if options.printwire: @@ -865,11 +911,10 @@ else: print(template.format( headerfilename=options.headerfilename, - cases='\n\t'.join(cases), printcases='\n\t'.join(printcases), idem=idem, includes=includes, enumname=options.enumname, - enums=enums, - formatted_enums=built_enums, + formatted_hdr_enums=built_hdr_enums, + formatted_impl_enums=built_impl_enums, func_decls='\n'.join(decls)))