Skip to content

Commit a20503f

Browse files
committed
refactor: Make add_to_list non-recursive.
1 parent a1e999f commit a20503f

File tree

1 file changed

+28
-13
lines changed

1 file changed

+28
-13
lines changed

toxcore/DHT.c

+28-13
Original file line numberDiff line numberDiff line change
@@ -615,27 +615,42 @@ bool add_to_list(
615615
Node_format *nodes_list, uint32_t length, const uint8_t pk[CRYPTO_PUBLIC_KEY_SIZE],
616616
const IP_Port *ip_port, const uint8_t cmp_pk[CRYPTO_PUBLIC_KEY_SIZE])
617617
{
618-
for (uint32_t i = 0; i < length; ++i) {
619-
Node_format *node = &nodes_list[i];
618+
uint8_t pk_cur[CRYPTO_PUBLIC_KEY_SIZE];
619+
memcpy(pk_cur, pk, CRYPTO_PUBLIC_KEY_SIZE);
620+
IP_Port ip_port_cur = *ip_port;
620621

621-
if (id_closest(cmp_pk, node->public_key, pk) == 2) {
622-
uint8_t pk_bak[CRYPTO_PUBLIC_KEY_SIZE];
623-
memcpy(pk_bak, node->public_key, CRYPTO_PUBLIC_KEY_SIZE);
622+
bool inserted = false;
623+
bool done = false;
624624

625-
const IP_Port ip_port_bak = node->ip_port;
626-
memcpy(node->public_key, pk, CRYPTO_PUBLIC_KEY_SIZE);
625+
while (!done) {
626+
done = true;
627627

628-
node->ip_port = *ip_port;
628+
for (uint32_t i = 0; i < length; ++i) {
629+
Node_format *node = &nodes_list[i];
629630

630-
if (i != length - 1) {
631-
add_to_list(nodes_list, length, pk_bak, &ip_port_bak, cmp_pk);
632-
}
631+
if (id_closest(cmp_pk, node->public_key, pk_cur) == 2) {
632+
uint8_t pk_bak[CRYPTO_PUBLIC_KEY_SIZE];
633+
memcpy(pk_bak, node->public_key, CRYPTO_PUBLIC_KEY_SIZE);
633634

634-
return true;
635+
const IP_Port ip_port_bak = node->ip_port;
636+
memcpy(node->public_key, pk_cur, CRYPTO_PUBLIC_KEY_SIZE);
637+
638+
node->ip_port = ip_port_cur;
639+
640+
if (i == length - 1) {
641+
return true;
642+
}
643+
644+
memcpy(pk_cur, pk_bak, CRYPTO_PUBLIC_KEY_SIZE);
645+
ip_port_cur = ip_port_bak;
646+
done = false;
647+
inserted = true;
648+
break;
649+
}
635650
}
636651
}
637652

638-
return false;
653+
return inserted;
639654
}
640655

641656
/**

0 commit comments

Comments
 (0)