From bafda5ce02b010399fc1337f01a30b0d7c34cce0 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Thu, 14 Aug 2025 10:57:54 +0930 Subject: [PATCH] common: mvt_tag parsing routine. Rather than open-coding in json_parse. Signed-off-by: Rusty Russell --- common/coin_mvt.c | 16 ++++++++++++++++ common/coin_mvt.h | 3 +++ common/json_parse.c | 11 +---------- common/test/run-bigsize.c | 6 +++--- common/test/run-bolt12-offer-decode.c | 6 +++--- common/test/run-bolt12_decode.c | 6 +++--- common/test/run-bolt12_merkle-json.c | 6 +++--- common/test/run-bolt12_period.c | 6 +++--- common/test/run-codex32.c | 6 +++--- common/test/run-json_scan.c | 6 +++--- common/test/run-onion-test-vector.c | 6 +++--- common/test/run-route_blinding_onion_test.c | 6 +++--- common/test/run-splice_script.c | 6 +++--- 13 files changed, 50 insertions(+), 40 deletions(-) diff --git a/common/coin_mvt.c b/common/coin_mvt.c index 34c74dd0c..5c7142fde 100644 --- a/common/coin_mvt.c +++ b/common/coin_mvt.c @@ -496,6 +496,22 @@ const char **mvt_tag_strs(const tal_t *ctx, const enum mvt_tag *tags) tal_arr_expand(&strs, mvt_tag_str(tags[i])); return strs; } + + +/* Parse a single mvt tag. Returns false or populates *tag */ +bool mvt_tag_parse(const char *buf, size_t len, enum mvt_tag *tag) +{ + for (size_t i = 0; i < NUM_MVT_TAGS; i++) { + const char *name = mvt_tag_str(i); + if (strlen(name) == len && memcmp(buf, name, len) == 0) { + *tag = i; + return true; + } + } + + return false; +} + /* This is used solely by onchaind. It always uses alt_account, with "" meaning * the channel itself. */ void towire_chain_coin_mvt(u8 **pptr, const struct chain_coin_mvt *mvt) diff --git a/common/coin_mvt.h b/common/coin_mvt.h index 9b34496c9..821333d97 100644 --- a/common/coin_mvt.h +++ b/common/coin_mvt.h @@ -258,6 +258,9 @@ bool chain_mvt_is_external(const struct chain_coin_mvt *mvt); const char *mvt_tag_str(enum mvt_tag tag); const char **mvt_tag_strs(const tal_t *ctx, const enum mvt_tag *tags); +/* Parse a single mvt tag. Returns false or populates *tag */ +bool mvt_tag_parse(const char *buf, size_t len, enum mvt_tag *tag); + void towire_chain_coin_mvt(u8 **pptr, const struct chain_coin_mvt *mvt); void fromwire_chain_coin_mvt(const u8 **cursor, size_t *max, struct chain_coin_mvt *mvt); diff --git a/common/json_parse.c b/common/json_parse.c index 1d272b1f0..1fb1fa97b 100644 --- a/common/json_parse.c +++ b/common/json_parse.c @@ -630,16 +630,7 @@ bool json_to_channel_id(const char *buffer, const jsmntok_t *tok, bool json_to_coin_mvt_tag(const char *buffer, const jsmntok_t *tok, enum mvt_tag *tag) { - enum mvt_tag i_tag; - for (size_t i = 0; i < NUM_MVT_TAGS; i++) { - i_tag = (enum mvt_tag) i; - if (json_tok_streq(buffer, tok, mvt_tag_str(i_tag))) { - *tag = i_tag; - return true; - } - } - - return false; + return mvt_tag_parse(buffer + tok->start, tok->end - tok->start, tag); } bool split_tok(const char *buffer, const jsmntok_t *tok, diff --git a/common/test/run-bigsize.c b/common/test/run-bigsize.c index bd709317e..9b181261e 100644 --- a/common/test/run-bigsize.c +++ b/common/test/run-bigsize.c @@ -78,9 +78,9 @@ u8 fromwire_u8(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) /* Generated stub for fromwire_u8_array */ void fromwire_u8_array(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, u8 *arr UNNEEDED, size_t num UNNEEDED) { fprintf(stderr, "fromwire_u8_array called!\n"); abort(); } -/* Generated stub for mvt_tag_str */ -const char *mvt_tag_str(enum mvt_tag tag UNNEEDED) -{ fprintf(stderr, "mvt_tag_str called!\n"); abort(); } +/* Generated stub for mvt_tag_parse */ +bool mvt_tag_parse(const char *buf UNNEEDED, size_t len UNNEEDED, enum mvt_tag *tag UNNEEDED) +{ fprintf(stderr, "mvt_tag_parse called!\n"); abort(); } /* Generated stub for node_id_from_hexstr */ bool node_id_from_hexstr(const char *str UNNEEDED, size_t slen UNNEEDED, struct node_id *id UNNEEDED) { fprintf(stderr, "node_id_from_hexstr called!\n"); abort(); } diff --git a/common/test/run-bolt12-offer-decode.c b/common/test/run-bolt12-offer-decode.c index c88a4afdf..5296e8fd6 100644 --- a/common/test/run-bolt12-offer-decode.c +++ b/common/test/run-bolt12-offer-decode.c @@ -57,9 +57,9 @@ struct amount_msat fromwire_amount_msat(const u8 **cursor UNNEEDED, size_t *max /* Generated stub for merkle_tlv */ void merkle_tlv(const struct tlv_field *fields UNNEEDED, struct sha256 *merkle UNNEEDED) { fprintf(stderr, "merkle_tlv called!\n"); abort(); } -/* Generated stub for mvt_tag_str */ -const char *mvt_tag_str(enum mvt_tag tag UNNEEDED) -{ fprintf(stderr, "mvt_tag_str called!\n"); abort(); } +/* Generated stub for mvt_tag_parse */ +bool mvt_tag_parse(const char *buf UNNEEDED, size_t len UNNEEDED, enum mvt_tag *tag UNNEEDED) +{ fprintf(stderr, "mvt_tag_parse called!\n"); abort(); } /* Generated stub for node_id_from_hexstr */ bool node_id_from_hexstr(const char *str UNNEEDED, size_t slen UNNEEDED, struct node_id *id UNNEEDED) { fprintf(stderr, "node_id_from_hexstr called!\n"); abort(); } diff --git a/common/test/run-bolt12_decode.c b/common/test/run-bolt12_decode.c index 0faa8ccef..ae4cd8b42 100644 --- a/common/test/run-bolt12_decode.c +++ b/common/test/run-bolt12_decode.c @@ -102,9 +102,9 @@ void fromwire_u8_array(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, u8 *arr /* Generated stub for merkle_tlv */ void merkle_tlv(const struct tlv_field *fields UNNEEDED, struct sha256 *merkle UNNEEDED) { fprintf(stderr, "merkle_tlv called!\n"); abort(); } -/* Generated stub for mvt_tag_str */ -const char *mvt_tag_str(enum mvt_tag tag UNNEEDED) -{ fprintf(stderr, "mvt_tag_str called!\n"); abort(); } +/* Generated stub for mvt_tag_parse */ +bool mvt_tag_parse(const char *buf UNNEEDED, size_t len UNNEEDED, enum mvt_tag *tag UNNEEDED) +{ fprintf(stderr, "mvt_tag_parse called!\n"); abort(); } /* Generated stub for node_id_from_hexstr */ bool node_id_from_hexstr(const char *str UNNEEDED, size_t slen UNNEEDED, struct node_id *id UNNEEDED) { fprintf(stderr, "node_id_from_hexstr called!\n"); abort(); } diff --git a/common/test/run-bolt12_merkle-json.c b/common/test/run-bolt12_merkle-json.c index bf6131ec9..4c0910d3f 100644 --- a/common/test/run-bolt12_merkle-json.c +++ b/common/test/run-bolt12_merkle-json.c @@ -24,9 +24,9 @@ bool fromwire_channel_id(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, /* Generated stub for fromwire_node_id */ void fromwire_node_id(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct node_id *id UNNEEDED) { fprintf(stderr, "fromwire_node_id called!\n"); abort(); } -/* Generated stub for mvt_tag_str */ -const char *mvt_tag_str(enum mvt_tag tag UNNEEDED) -{ fprintf(stderr, "mvt_tag_str called!\n"); abort(); } +/* Generated stub for mvt_tag_parse */ +bool mvt_tag_parse(const char *buf UNNEEDED, size_t len UNNEEDED, enum mvt_tag *tag UNNEEDED) +{ fprintf(stderr, "mvt_tag_parse called!\n"); abort(); } /* Generated stub for node_id_from_hexstr */ bool node_id_from_hexstr(const char *str UNNEEDED, size_t slen UNNEEDED, struct node_id *id UNNEEDED) { fprintf(stderr, "node_id_from_hexstr called!\n"); abort(); } diff --git a/common/test/run-bolt12_period.c b/common/test/run-bolt12_period.c index a87ecb169..514e47fe7 100644 --- a/common/test/run-bolt12_period.c +++ b/common/test/run-bolt12_period.c @@ -105,9 +105,9 @@ void fromwire_u8_array(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, u8 *arr /* Generated stub for merkle_tlv */ void merkle_tlv(const struct tlv_field *fields UNNEEDED, struct sha256 *merkle UNNEEDED) { fprintf(stderr, "merkle_tlv called!\n"); abort(); } -/* Generated stub for mvt_tag_str */ -const char *mvt_tag_str(enum mvt_tag tag UNNEEDED) -{ fprintf(stderr, "mvt_tag_str called!\n"); abort(); } +/* Generated stub for mvt_tag_parse */ +bool mvt_tag_parse(const char *buf UNNEEDED, size_t len UNNEEDED, enum mvt_tag *tag UNNEEDED) +{ fprintf(stderr, "mvt_tag_parse called!\n"); abort(); } /* Generated stub for node_id_from_hexstr */ bool node_id_from_hexstr(const char *str UNNEEDED, size_t slen UNNEEDED, struct node_id *id UNNEEDED) { fprintf(stderr, "node_id_from_hexstr called!\n"); abort(); } diff --git a/common/test/run-codex32.c b/common/test/run-codex32.c index 78a18da76..2aed32315 100644 --- a/common/test/run-codex32.c +++ b/common/test/run-codex32.c @@ -77,9 +77,9 @@ u8 fromwire_u8(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) /* Generated stub for fromwire_u8_array */ void fromwire_u8_array(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, u8 *arr UNNEEDED, size_t num UNNEEDED) { fprintf(stderr, "fromwire_u8_array called!\n"); abort(); } -/* Generated stub for mvt_tag_str */ -const char *mvt_tag_str(enum mvt_tag tag UNNEEDED) -{ fprintf(stderr, "mvt_tag_str called!\n"); abort(); } +/* Generated stub for mvt_tag_parse */ +bool mvt_tag_parse(const char *buf UNNEEDED, size_t len UNNEEDED, enum mvt_tag *tag UNNEEDED) +{ fprintf(stderr, "mvt_tag_parse called!\n"); abort(); } /* Generated stub for node_id_from_hexstr */ bool node_id_from_hexstr(const char *str UNNEEDED, size_t slen UNNEEDED, struct node_id *id UNNEEDED) { fprintf(stderr, "node_id_from_hexstr called!\n"); abort(); } diff --git a/common/test/run-json_scan.c b/common/test/run-json_scan.c index 46ccee8e9..a80dad990 100644 --- a/common/test/run-json_scan.c +++ b/common/test/run-json_scan.c @@ -72,9 +72,9 @@ u8 fromwire_u8(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) /* Generated stub for fromwire_u8_array */ void fromwire_u8_array(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, u8 *arr UNNEEDED, size_t num UNNEEDED) { fprintf(stderr, "fromwire_u8_array called!\n"); abort(); } -/* Generated stub for mvt_tag_str */ -const char *mvt_tag_str(enum mvt_tag tag UNNEEDED) -{ fprintf(stderr, "mvt_tag_str called!\n"); abort(); } +/* Generated stub for mvt_tag_parse */ +bool mvt_tag_parse(const char *buf UNNEEDED, size_t len UNNEEDED, enum mvt_tag *tag UNNEEDED) +{ fprintf(stderr, "mvt_tag_parse called!\n"); abort(); } /* Generated stub for node_id_from_hexstr */ bool node_id_from_hexstr(const char *str UNNEEDED, size_t slen UNNEEDED, struct node_id *id UNNEEDED) { fprintf(stderr, "node_id_from_hexstr called!\n"); abort(); } diff --git a/common/test/run-onion-test-vector.c b/common/test/run-onion-test-vector.c index 130de79bb..064537109 100644 --- a/common/test/run-onion-test-vector.c +++ b/common/test/run-onion-test-vector.c @@ -82,9 +82,9 @@ bool fromwire_tlv(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, void *record UNNEEDED, struct tlv_field **fields UNNEEDED, const u64 *extra_types UNNEEDED, size_t *err_off UNNEEDED, u64 *err_type UNNEEDED) { fprintf(stderr, "fromwire_tlv called!\n"); abort(); } -/* Generated stub for mvt_tag_str */ -const char *mvt_tag_str(enum mvt_tag tag UNNEEDED) -{ fprintf(stderr, "mvt_tag_str called!\n"); abort(); } +/* Generated stub for mvt_tag_parse */ +bool mvt_tag_parse(const char *buf UNNEEDED, size_t len UNNEEDED, enum mvt_tag *tag UNNEEDED) +{ fprintf(stderr, "mvt_tag_parse called!\n"); abort(); } /* Generated stub for new_onionreply */ struct onionreply *new_onionreply(const tal_t *ctx UNNEEDED, const u8 *contents TAKES UNNEEDED) { fprintf(stderr, "new_onionreply called!\n"); abort(); } diff --git a/common/test/run-route_blinding_onion_test.c b/common/test/run-route_blinding_onion_test.c index 9c554ebd1..0dfc0d23e 100644 --- a/common/test/run-route_blinding_onion_test.c +++ b/common/test/run-route_blinding_onion_test.c @@ -29,9 +29,9 @@ void fromwire_sciddir_or_pubkey(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct sciddir_or_pubkey *sciddpk UNNEEDED) { fprintf(stderr, "fromwire_sciddir_or_pubkey called!\n"); abort(); } -/* Generated stub for mvt_tag_str */ -const char *mvt_tag_str(enum mvt_tag tag UNNEEDED) -{ fprintf(stderr, "mvt_tag_str called!\n"); abort(); } +/* Generated stub for mvt_tag_parse */ +bool mvt_tag_parse(const char *buf UNNEEDED, size_t len UNNEEDED, enum mvt_tag *tag UNNEEDED) +{ fprintf(stderr, "mvt_tag_parse called!\n"); abort(); } /* Generated stub for new_onionreply */ struct onionreply *new_onionreply(const tal_t *ctx UNNEEDED, const u8 *contents TAKES UNNEEDED) { fprintf(stderr, "new_onionreply called!\n"); abort(); } diff --git a/common/test/run-splice_script.c b/common/test/run-splice_script.c index 0494adc86..c3bd63fcb 100644 --- a/common/test/run-splice_script.c +++ b/common/test/run-splice_script.c @@ -35,9 +35,9 @@ void command_log(struct command *cmd UNNEEDED, enum log_level level UNNEEDED, const char *fmt UNNEEDED, ...) { fprintf(stderr, "command_log called!\n"); abort(); } -/* Generated stub for mvt_tag_str */ -const char *mvt_tag_str(enum mvt_tag tag UNNEEDED) -{ fprintf(stderr, "mvt_tag_str called!\n"); abort(); } +/* Generated stub for mvt_tag_parse */ +bool mvt_tag_parse(const char *buf UNNEEDED, size_t len UNNEEDED, enum mvt_tag *tag UNNEEDED) +{ fprintf(stderr, "mvt_tag_parse called!\n"); abort(); } /* AUTOGENERATED MOCKS END */ static void set_node_id(struct splice_script_chan *chan, const char *hexstr)