Browse Source

print_wire: hand field names to print routines.

This lets us override how we print them.

Also, add dependency on header for devtools/Makefile.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 7 years ago
committed by Christian Decker
parent
commit
c02ff11506
  1. 2
      devtools/Makefile
  2. 12
      devtools/print_wire.c
  3. 26
      devtools/print_wire.h
  4. 21
      tools/generate-wire.py

2
devtools/Makefile

@ -29,7 +29,7 @@ devtools/onion.c: ccan/config.h
devtools/onion: $(DEVTOOLS_OBJS) $(DEVTOOLS_COMMON_OBJS) $(JSMN_OBJS) $(CCAN_OBJS) $(BITCOIN_OBJS) wire/fromwire.o wire/towire.o devtools/onion.o common/sphinx.o devtools/onion: $(DEVTOOLS_OBJS) $(DEVTOOLS_COMMON_OBJS) $(JSMN_OBJS) $(CCAN_OBJS) $(BITCOIN_OBJS) wire/fromwire.o wire/towire.o devtools/onion.o common/sphinx.o
$(DEVTOOLS_OBJS) $(DEVTOOLS_TOOL_OBJS): wire/wire.h devtools/gen_print_wire.h $(DEVTOOLS_OBJS) $(DEVTOOLS_TOOL_OBJS): wire/wire.h devtools/gen_print_wire.h
devtools/gen_print_wire.o: devtools/gen_print_wire.h wire/gen_peer_wire.h devtools/gen_print_wire.o: devtools/gen_print_wire.h wire/gen_peer_wire.h devtools/print_wire.h
# Make sure these depend on everything. # Make sure these depend on everything.
ALL_PROGRAMS += devtools/bolt11-cli devtools/decodemsg devtools/onion ALL_PROGRAMS += devtools/bolt11-cli devtools/decodemsg devtools/onion

12
devtools/print_wire.c

@ -3,27 +3,27 @@
#include <inttypes.h> #include <inttypes.h>
#include <stdio.h> #include <stdio.h>
void printwire_u8(const u8 *v) void printwire_u8(const char *fieldname, const u8 *v)
{ {
printf("%u\n", *v); printf("%u\n", *v);
} }
void printwire_u16(const u16 *v) void printwire_u16(const char *fieldname, const u16 *v)
{ {
printf("%u\n", *v); printf("%u\n", *v);
} }
void printwire_u32(const u32 *v) void printwire_u32(const char *fieldname, const u32 *v)
{ {
printf("%u\n", *v); printf("%u\n", *v);
} }
void printwire_u64(const u64 *v) void printwire_u64(const char *fieldname, const u64 *v)
{ {
printf("%"PRIu64"\n", *v); printf("%"PRIu64"\n", *v);
} }
void printwire_u8_array(const u8 **cursor, size_t *plen, size_t len) void printwire_u8_array(const char *fieldname, const u8 **cursor, size_t *plen, size_t len)
{ {
printf("["); printf("[");
while (len) { while (len) {
@ -40,7 +40,7 @@ void printwire_u8_array(const u8 **cursor, size_t *plen, size_t len)
} }
#define PRINTWIRE_TYPE_TO_STRING(T, N) \ #define PRINTWIRE_TYPE_TO_STRING(T, N) \
void printwire_##N(const T *v) \ void printwire_##N(const char *fieldname, const T *v) \
{ \ { \
const char *s = type_to_string(NULL, T, v); \ const char *s = type_to_string(NULL, T, v); \
printf("%s\n", s); \ printf("%s\n", s); \

26
devtools/print_wire.h

@ -4,19 +4,19 @@
#include <bitcoin/tx.h> #include <bitcoin/tx.h>
#include <wire/gen_peer_wire.h> #include <wire/gen_peer_wire.h>
void printwire_u8(const u8 *v); void printwire_u8(const char *fieldname, const u8 *v);
void printwire_u16(const u16 *v); void printwire_u16(const char *fieldname, const u16 *v);
void printwire_u32(const u32 *v); void printwire_u32(const char *fieldname, const u32 *v);
void printwire_u64(const u64 *v); void printwire_u64(const char *fieldname, const u64 *v);
void printwire_u8_array(const u8 **cursor, size_t *plen, size_t len); void printwire_u8_array(const char *fieldname, const u8 **cursor, size_t *plen, size_t len);
void printwire_bitcoin_blkid(const struct bitcoin_blkid *bitcoin_blkid); void printwire_bitcoin_blkid(const char *fieldname, const struct bitcoin_blkid *bitcoin_blkid);
void printwire_bitcoin_txid(const struct bitcoin_txid *bitcoin_txid); void printwire_bitcoin_txid(const char *fieldname, const struct bitcoin_txid *bitcoin_txid);
void printwire_channel_id(const struct channel_id *channel_id); void printwire_channel_id(const char *fieldname, const struct channel_id *channel_id);
void printwire_preimage(const struct preimage *preimage); void printwire_preimage(const char *fieldname, const struct preimage *preimage);
void printwire_pubkey(const struct pubkey *pubkey); void printwire_pubkey(const char *fieldname, const struct pubkey *pubkey);
void printwire_secp256k1_ecdsa_signature(const secp256k1_ecdsa_signature *); void printwire_secp256k1_ecdsa_signature(const char *fieldname, const secp256k1_ecdsa_signature *);
void printwire_sha256(const struct sha256 *sha256); void printwire_sha256(const char *fieldname, const struct sha256 *sha256);
void printwire_short_channel_id(const struct short_channel_id *short_channel_id); void printwire_short_channel_id(const char *fieldname, const struct short_channel_id *short_channel_id);
#endif /* LIGHTNING_DEVTOOLS_PRINT_WIRE_H */ #endif /* LIGHTNING_DEVTOOLS_PRINT_WIRE_H */

21
tools/generate-wire.py

@ -220,9 +220,9 @@ towire_impl_templ = """u8 *towire_{name}(const tal_t *ctx{args})
}} }}
""" """
printwire_header_templ = """void printwire_{name}(const u8 *cursor); printwire_header_templ = """void printwire_{name}(const char *fieldname, const u8 *cursor);
""" """
printwire_impl_templ = """void printwire_{name}(const u8 *cursor) printwire_impl_templ = """void printwire_{name}(const char *fieldname, const u8 *cursor)
{{ {{
\tsize_t plen = tal_len(cursor); \tsize_t plen = tal_len(cursor);
@ -437,8 +437,8 @@ class Message(object):
def print_printwire_array(self, subcalls, basetype, f, num_elems): def print_printwire_array(self, subcalls, basetype, f, num_elems):
if f.has_array_helper(): if f.has_array_helper():
subcalls.append('\tprintwire_{}_array(&cursor, &plen, {});' subcalls.append('\tprintwire_{}_array(tal_fmt(NULL, "%s.{}", fieldname), &cursor, &plen, {});'
.format(basetype, num_elems)) .format(basetype, f.name, num_elems))
else: else:
subcalls.append('\tprintf("[");') subcalls.append('\tprintf("[");')
subcalls.append('\tfor (size_t i = 0; i < {}; i++) {{' subcalls.append('\tfor (size_t i = 0; i < {}; i++) {{'
@ -456,7 +456,8 @@ class Message(object):
self.add_truncate_check(subcalls, indent='\t\t') self.add_truncate_check(subcalls, indent='\t\t')
subcalls.append('\t\tprintwire_{}(&v);'.format(basetype)) subcalls.append('\t\tprintwire_{}(tal_fmt(NULL, "%s.{}", fieldname), &v);'
.format(basetype, f.name))
subcalls.append('\t}') subcalls.append('\t}')
subcalls.append('\tprintf("]");') subcalls.append('\tprintf("]");')
@ -479,8 +480,8 @@ class Message(object):
subcalls.append('\tprintf("{}=");'.format(f.name)) subcalls.append('\tprintf("{}=");'.format(f.name))
if f.is_padding(): if f.is_padding():
subcalls.append('\tprintwire_pad(&cursor, &plen, {});' subcalls.append('\tprintwire_pad(tal_fmt(NULL, "%s.{}", fieldname), &cursor, &plen, {});'
.format(f.num_elems)) .format(f.name, f.num_elems))
self.add_truncate_check(subcalls) self.add_truncate_check(subcalls)
elif f.is_array(): elif f.is_array():
self.print_printwire_array(subcalls, basetype, f, f.num_elems) self.print_printwire_array(subcalls, basetype, f, f.num_elems)
@ -501,8 +502,8 @@ class Message(object):
.format(basetype, f.name)) .format(basetype, f.name))
self.add_truncate_check(subcalls) self.add_truncate_check(subcalls)
subcalls.append('\tprintwire_{}(&{});' subcalls.append('\tprintwire_{}(tal_fmt(NULL, "%s.{}", fieldname), &{});'
.format(basetype, f.name)) .format(basetype, f.name, f.name))
return template.format( return template.format(
name=self.name, name=self.name,
@ -686,7 +687,7 @@ for m in messages:
enums += '\t{} = {},\n'.format(m.enum.name, m.enum.value) enums += '\t{} = {},\n'.format(m.enum.name, m.enum.value)
includes = '\n'.join(includes) includes = '\n'.join(includes)
cases = ['case {enum.name}: return "{enum.name}";'.format(enum=m.enum) for m in messages] 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}(msg); return;'.format(enum=m.enum, name=m.name) 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: if options.printwire:
decls = [m.print_printwire(options.header) for m in messages + messages_with_option] decls = [m.print_printwire(options.header) for m in messages + messages_with_option]

Loading…
Cancel
Save