From 899e461e547a7a736f903de5283d22eb71b2077b Mon Sep 17 00:00:00 2001 From: iphydf Date: Wed, 14 Feb 2024 21:53:26 +0000 Subject: [PATCH] refactor: Make add_to_list non-recursive. --- toxcore/DHT.c | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/toxcore/DHT.c b/toxcore/DHT.c index 0dc49008e4..54561766b5 100644 --- a/toxcore/DHT.c +++ b/toxcore/DHT.c @@ -620,27 +620,42 @@ bool add_to_list( Node_format *nodes_list, uint32_t length, const uint8_t pk[CRYPTO_PUBLIC_KEY_SIZE], const IP_Port *ip_port, const uint8_t cmp_pk[CRYPTO_PUBLIC_KEY_SIZE]) { - for (uint32_t i = 0; i < length; ++i) { - Node_format *node = &nodes_list[i]; + uint8_t pk_cur[CRYPTO_PUBLIC_KEY_SIZE]; + memcpy(pk_cur, pk, CRYPTO_PUBLIC_KEY_SIZE); + IP_Port ip_port_cur = *ip_port; - if (id_closest(cmp_pk, node->public_key, pk) == 2) { - uint8_t pk_bak[CRYPTO_PUBLIC_KEY_SIZE]; - memcpy(pk_bak, node->public_key, CRYPTO_PUBLIC_KEY_SIZE); + bool inserted = false; + bool done = false; - const IP_Port ip_port_bak = node->ip_port; - memcpy(node->public_key, pk, CRYPTO_PUBLIC_KEY_SIZE); + while (!done) { + done = true; - node->ip_port = *ip_port; + for (uint32_t i = 0; i < length; ++i) { + Node_format *node = &nodes_list[i]; - if (i != length - 1) { - add_to_list(nodes_list, length, pk_bak, &ip_port_bak, cmp_pk); - } + if (id_closest(cmp_pk, node->public_key, pk_cur) == 2) { + uint8_t pk_bak[CRYPTO_PUBLIC_KEY_SIZE]; + memcpy(pk_bak, node->public_key, CRYPTO_PUBLIC_KEY_SIZE); - return true; + const IP_Port ip_port_bak = node->ip_port; + memcpy(node->public_key, pk_cur, CRYPTO_PUBLIC_KEY_SIZE); + + node->ip_port = ip_port_cur; + + if (i == length - 1) { + return true; + } + + memcpy(pk_cur, pk_bak, CRYPTO_PUBLIC_KEY_SIZE); + ip_port_cur = ip_port_bak; + done = false; + inserted = true; + break; + } } } - return false; + return inserted; } /**