|
|
|
@ -3,29 +3,19 @@
|
|
|
|
|
#include <llarp/exit_info.h>
|
|
|
|
|
#include <llarp/mem.h>
|
|
|
|
|
#include <llarp/string.h>
|
|
|
|
|
|
|
|
|
|
struct llarp_xi_list_node
|
|
|
|
|
{
|
|
|
|
|
struct llarp_xi data;
|
|
|
|
|
struct llarp_xi_list_node *next;
|
|
|
|
|
};
|
|
|
|
|
#include <list>
|
|
|
|
|
|
|
|
|
|
struct llarp_xi_list
|
|
|
|
|
{
|
|
|
|
|
struct llarp_alloc *mem;
|
|
|
|
|
struct llarp_xi_list_node *root;
|
|
|
|
|
std::list< llarp_xi > list;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
|
|
|
|
|
|
struct llarp_xi_list *
|
|
|
|
|
llarp_xi_list_new(struct llarp_alloc *mem)
|
|
|
|
|
llarp_xi_list_new()
|
|
|
|
|
{
|
|
|
|
|
struct llarp_xi_list *l = mem->alloc(mem, sizeof(struct llarp_xi_list), 8);
|
|
|
|
|
if(l)
|
|
|
|
|
{
|
|
|
|
|
l->mem = mem;
|
|
|
|
|
l->root = NULL;
|
|
|
|
|
}
|
|
|
|
|
return l;
|
|
|
|
|
return new llarp_xi_list;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
@ -33,22 +23,15 @@ llarp_xi_list_free(struct llarp_xi_list *l)
|
|
|
|
|
{
|
|
|
|
|
if(l)
|
|
|
|
|
{
|
|
|
|
|
struct llarp_alloc *mem = l->mem;
|
|
|
|
|
struct llarp_xi_list_node *current = l->root;
|
|
|
|
|
while(current)
|
|
|
|
|
{
|
|
|
|
|
struct llarp_xi_list_node *tmp = current->next;
|
|
|
|
|
mem->free(mem, current);
|
|
|
|
|
current = tmp;
|
|
|
|
|
}
|
|
|
|
|
mem->free(mem, l);
|
|
|
|
|
l->list.clear();
|
|
|
|
|
delete l;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool
|
|
|
|
|
llarp_xi_iter_bencode(struct llarp_xi_list_iter *iter, struct llarp_xi *xi)
|
|
|
|
|
{
|
|
|
|
|
return llarp_xi_bencode(xi, iter->user);
|
|
|
|
|
return llarp_xi_bencode(xi, static_cast< llarp_buffer_t * >(iter->user));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
@ -56,8 +39,7 @@ llarp_xi_list_bencode(struct llarp_xi_list *l, llarp_buffer_t *buff)
|
|
|
|
|
{
|
|
|
|
|
if(!bencode_start_list(buff))
|
|
|
|
|
return false;
|
|
|
|
|
struct llarp_xi_list_iter xi_itr = {.user = buff,
|
|
|
|
|
.visit = &llarp_xi_iter_bencode};
|
|
|
|
|
struct llarp_xi_list_iter xi_itr = {buff, nullptr, &llarp_xi_iter_bencode};
|
|
|
|
|
llarp_xi_list_iterate(l, &xi_itr);
|
|
|
|
|
return bencode_end(buff);
|
|
|
|
|
}
|
|
|
|
@ -65,15 +47,10 @@ llarp_xi_list_bencode(struct llarp_xi_list *l, llarp_buffer_t *buff)
|
|
|
|
|
void
|
|
|
|
|
llarp_xi_list_iterate(struct llarp_xi_list *l, struct llarp_xi_list_iter *iter)
|
|
|
|
|
{
|
|
|
|
|
struct llarp_xi_list_node *current = l->root;
|
|
|
|
|
iter->list = l;
|
|
|
|
|
while(current)
|
|
|
|
|
{
|
|
|
|
|
if(!iter->visit(iter, ¤t->data))
|
|
|
|
|
iter->list = l;
|
|
|
|
|
for(auto &item : l->list)
|
|
|
|
|
if(!iter->visit(iter, &item))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
current = current->next;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
@ -121,7 +98,7 @@ llarp_xi_decode_dict(struct dict_reader *r, llarp_buffer_t *key)
|
|
|
|
|
if(!key)
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
struct llarp_xi *xi = r->user;
|
|
|
|
|
llarp_xi *xi = static_cast< llarp_xi * >(r->user);
|
|
|
|
|
llarp_buffer_t strbuf;
|
|
|
|
|
uint64_t v;
|
|
|
|
|
char tmp[128] = {0};
|
|
|
|
@ -170,31 +147,15 @@ llarp_xi_decode_dict(struct dict_reader *r, llarp_buffer_t *key)
|
|
|
|
|
bool
|
|
|
|
|
llarp_xi_bdecode(struct llarp_xi *xi, llarp_buffer_t *buf)
|
|
|
|
|
{
|
|
|
|
|
struct dict_reader r = {.user = xi, .on_key = &llarp_xi_decode_dict};
|
|
|
|
|
struct dict_reader r = {buf, xi, &llarp_xi_decode_dict};
|
|
|
|
|
return bdecode_read_dict(buf, &r);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_xi_list_pushback(struct llarp_xi_list *l, struct llarp_xi *xi)
|
|
|
|
|
{
|
|
|
|
|
struct llarp_xi_list_node *cur = l->root;
|
|
|
|
|
if(cur)
|
|
|
|
|
{
|
|
|
|
|
// go to the end of the list
|
|
|
|
|
while(cur->next)
|
|
|
|
|
cur = cur->next;
|
|
|
|
|
|
|
|
|
|
cur->next = l->mem->alloc(l->mem, sizeof(struct llarp_xi_list_node), 16);
|
|
|
|
|
cur = cur->next;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
l->root = l->mem->alloc(l->mem, sizeof(struct llarp_xi_list_node), 16);
|
|
|
|
|
cur = l->root;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
llarp_xi_copy(&cur->data, xi);
|
|
|
|
|
cur->next = 0;
|
|
|
|
|
l->list.emplace_back();
|
|
|
|
|
llarp_xi_copy(&l->list.back(), xi);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
@ -209,21 +170,15 @@ llarp_xi_list_decode_item(struct list_reader *r, bool more)
|
|
|
|
|
if(!more)
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
struct llarp_xi_list *l = r->user;
|
|
|
|
|
struct llarp_xi xi;
|
|
|
|
|
if(!llarp_xi_bdecode(&xi, r->buffer))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
llarp_xi_list_pushback(l, &xi);
|
|
|
|
|
return true;
|
|
|
|
|
llarp_xi_list *l = static_cast< llarp_xi_list * >(r->user);
|
|
|
|
|
l->list.emplace_back();
|
|
|
|
|
return llarp_xi_bdecode(&l->list.back(), r->buffer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_xi_list_bdecode(struct llarp_xi_list *l, llarp_buffer_t *buff)
|
|
|
|
|
{
|
|
|
|
|
struct list_reader r = {
|
|
|
|
|
.user = l,
|
|
|
|
|
.on_item = &llarp_xi_list_decode_item,
|
|
|
|
|
};
|
|
|
|
|
list_reader r = {buff, l, &llarp_xi_list_decode_item};
|
|
|
|
|
return bdecode_read_list(buff, &r);
|
|
|
|
|
}
|
|
|
|
|
}
|