refactored tlibc collections
This commit is contained in:
@@ -39,7 +39,7 @@ void ClientCLI_destroy(ClientCLI* self){
|
||||
Client_free(self->client);
|
||||
|
||||
idb_close(self->db);
|
||||
List_destroy(&self->servers.list);
|
||||
List_ServerInfo_destroy(&self->servers.list);
|
||||
HashMap_destroy(&self->servers.addr_id_map);
|
||||
}
|
||||
void ClientCLI_construct(ClientCLI* self){
|
||||
@@ -51,7 +51,7 @@ Result(void) ClientCLI_run(ClientCLI* self) {
|
||||
|
||||
try_void(term_init());
|
||||
term_clear();
|
||||
printf(FMT_str"\n", greeting_art.size, greeting_art.data);
|
||||
printf(FMT_str"\n", greeting_art.len, greeting_art.data);
|
||||
|
||||
// create Client
|
||||
str username = str_null, password = str_null;
|
||||
@@ -62,7 +62,7 @@ Result(void) ClientCLI_run(ClientCLI* self) {
|
||||
);
|
||||
Client_free(self->client);
|
||||
try(self->client, p, Client_create(username, password));
|
||||
memset(password.data, 0, password.size);
|
||||
memset(password.data, 0, password.len);
|
||||
|
||||
// init db
|
||||
try_void(ClientCLI_openUserDB(self));
|
||||
@@ -77,14 +77,14 @@ Result(void) ClientCLI_run(ClientCLI* self) {
|
||||
|
||||
command_input = str_from_cstr(input_buf);
|
||||
str_trim(&command_input, true);
|
||||
if(command_input.size == 0)
|
||||
if(command_input.len == 0)
|
||||
continue;
|
||||
|
||||
ResultVar(void) com_result = ClientCLI_execCommand(self, command_input, &stop);
|
||||
if(com_result.error){
|
||||
Error_addCallPos(com_result.error, ErrorCallPos_here());
|
||||
str e_str = Error_toStr(com_result.error);
|
||||
printf("\n"FMT_str"\n", e_str.size, e_str.data);
|
||||
printf("\n"FMT_str"\n", e_str.len, e_str.data);
|
||||
str_free(e_str);
|
||||
Error_free(com_result.error);
|
||||
}
|
||||
@@ -98,33 +98,33 @@ static Result(void) ClientCLI_askUserNameAndPassword(str* username_out, str* pas
|
||||
bool success = false;
|
||||
|
||||
// ask username
|
||||
Array(char) username_buf = Array_alloc_size(128);
|
||||
Defer(if(!success) Array_free(username_buf));
|
||||
Array(char) username_buf = Array_char_alloc(128);
|
||||
Defer(if(!success) Array_char_destroy(&username_buf));
|
||||
str username = str_null;
|
||||
while(true) {
|
||||
printf("username: ");
|
||||
try_void(term_readLine(username_buf.data, username_buf.size));
|
||||
try_void(term_readLine(username_buf.data, username_buf.len));
|
||||
username = str_from_cstr(username_buf.data);
|
||||
str_trim(&username, true);
|
||||
str name_error_str = validateUsername_str(username);
|
||||
if(name_error_str.data){
|
||||
printf("ERROR: "FMT_str"\n",
|
||||
name_error_str.size, name_error_str.data);
|
||||
name_error_str.len, name_error_str.data);
|
||||
}
|
||||
else break;
|
||||
}
|
||||
|
||||
// ask password
|
||||
Array(char) password_buf = Array_alloc_size(128);
|
||||
Defer(if(!success) Array_free(password_buf));
|
||||
Array(char) password_buf = Array_char_alloc(128);
|
||||
Defer(if(!success) Array_char_destroy(&password_buf));
|
||||
str password = str_null;
|
||||
while(true) {
|
||||
printf("password: ");
|
||||
// TODO: hide password
|
||||
try_void(term_readLineHidden(password_buf.data, password_buf.size));
|
||||
try_void(term_readLineHidden(password_buf.data, password_buf.len));
|
||||
password = str_from_cstr(password_buf.data);
|
||||
str_trim(&password, true);
|
||||
if(password.size < PASSWORD_SIZE_MIN || password.size > PASSWORD_SIZE_MAX){
|
||||
if(password.len < PASSWORD_SIZE_MIN || password.len > PASSWORD_SIZE_MAX){
|
||||
printf("ERROR: password length (in bytes) must be >= %i and <= %i\n",
|
||||
PASSWORD_SIZE_MIN, PASSWORD_SIZE_MAX);
|
||||
}
|
||||
@@ -141,7 +141,7 @@ static Result(void) ClientCLI_execCommand(ClientCLI* self, str command, bool* st
|
||||
Deferral(64);
|
||||
|
||||
if(is_alias("q") || is_alias("quit") || is_alias("exit")){
|
||||
printf(FMT_str"\n", farewell_art.size, farewell_art.data);
|
||||
printf(FMT_str"\n", farewell_art.len, farewell_art.data);
|
||||
*stop = true;
|
||||
}
|
||||
else if(is_alias("clear")){
|
||||
@@ -230,16 +230,16 @@ static Result(void) ClientCLI_selectServerFromCache(ClientCLI* self){
|
||||
idb_lockTable(self->servers.table);
|
||||
Defer(idb_unlockTable(self->servers.table));
|
||||
|
||||
u32 servers_count = List_len(self->servers.list, ServerInfo);
|
||||
u32 servers_count = self->servers.list.len;
|
||||
if(servers_count == 0){
|
||||
printf("No servers found in cache\n");
|
||||
Return RESULT_VOID;
|
||||
}
|
||||
|
||||
for(u32 id = 0; id < servers_count; id++){
|
||||
ServerInfo* row = &List_index(self->servers.list, ServerInfo, id);
|
||||
ServerInfo* server = self->servers.list.data + id;
|
||||
printf("[%02u] "FMT_str" "FMT_str"\n",
|
||||
id, row->address_len, row->address, row->name_len, row->name);
|
||||
id, server->address_len, server->address, server->name_len, server->name);
|
||||
}
|
||||
|
||||
char buf[32];
|
||||
@@ -261,7 +261,7 @@ static Result(void) ClientCLI_selectServerFromCache(ClientCLI* self){
|
||||
}
|
||||
else break;
|
||||
}
|
||||
ServerInfo* server = &List_index(self->servers.list, ServerInfo, id);
|
||||
ServerInfo* server = self->servers.list.data + id;
|
||||
|
||||
printf("Connecting to '"FMT_str"'...\n", server->address_len, server->address);
|
||||
try_void(Client_connect(self->client, server->address, server->pk_base64));
|
||||
@@ -273,9 +273,9 @@ static Result(void) ClientCLI_selectServerFromCache(ClientCLI* self){
|
||||
try_void(Client_getServerName(self->client, &name));
|
||||
if(!str_equals(name, str_construct(server->name, server->name_len, true))){
|
||||
server_info_changed = true;
|
||||
if(name.size > SERVER_NAME_SIZE_MAX)
|
||||
name.size = SERVER_NAME_SIZE_MAX;
|
||||
server->name_len = name.size;
|
||||
if(name.len > SERVER_NAME_SIZE_MAX)
|
||||
name.len = SERVER_NAME_SIZE_MAX;
|
||||
server->name_len = name.len;
|
||||
memcpy(server->name, name.data, server->name_len);
|
||||
}
|
||||
// update cached server description
|
||||
@@ -283,9 +283,9 @@ static Result(void) ClientCLI_selectServerFromCache(ClientCLI* self){
|
||||
try_void(Client_getServerDescription(self->client, &desc));
|
||||
if(!str_equals(desc, str_construct(server->desc, server->desc_len, true))){
|
||||
server_info_changed = true;
|
||||
if(desc.size > SERVER_DESC_SIZE_MAX)
|
||||
desc.size = SERVER_DESC_SIZE_MAX;
|
||||
server->desc_len = desc.size;
|
||||
if(desc.len > SERVER_DESC_SIZE_MAX)
|
||||
desc.len = SERVER_DESC_SIZE_MAX;
|
||||
server->desc_len = desc.len;
|
||||
memcpy(server->desc, desc.data, server->desc_len);
|
||||
}
|
||||
if(server_info_changed){
|
||||
@@ -335,7 +335,7 @@ static Result(void) ClientCLI_openUserDB(ClientCLI* self){
|
||||
|
||||
// load whole servers table to list
|
||||
try_void(
|
||||
idb_createListFromTable(self->servers.table, &self->servers.list, false)
|
||||
idb_createListFromTable(self->servers.table, (void*)&self->servers.list, false)
|
||||
);
|
||||
|
||||
// build address-id map
|
||||
@@ -344,10 +344,12 @@ static Result(void) ClientCLI_openUserDB(ClientCLI* self){
|
||||
);
|
||||
HashMap_construct(&self->servers.addr_id_map, u64, NULL);
|
||||
for(u64 id = 0; id < servers_count; id++){
|
||||
ServerInfo* row = &List_index(self->servers.list, ServerInfo, id);
|
||||
str key = str_construct(row->address, row->address_len, true);
|
||||
ServerInfo* server = self->servers.list.data + id;
|
||||
str key = str_construct(server->address, server->address_len, true);
|
||||
if(!HashMap_tryPush(&self->servers.addr_id_map, key, &id)){
|
||||
Return RESULT_ERROR_FMT("duplicate server address '"FMT_str"'", key.size, key.data);
|
||||
Return RESULT_ERROR_FMT(
|
||||
"duplicate server address '"FMT_str"'",
|
||||
key.len, key.data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -362,24 +364,24 @@ static Result(ServerInfo*) ClientCLI_saveServerInfo(ClientCLI* self,
|
||||
ServerInfo server;
|
||||
memset(&server, 0, sizeof(ServerInfo));
|
||||
// address
|
||||
if(addr.size > HOSTADDR_SIZE_MAX)
|
||||
addr.size = HOSTADDR_SIZE_MAX;
|
||||
server.address_len = addr.size;
|
||||
if(addr.len > HOSTADDR_SIZE_MAX)
|
||||
addr.len = HOSTADDR_SIZE_MAX;
|
||||
server.address_len = addr.len;
|
||||
memcpy(server.address, addr.data, server.address_len);
|
||||
// public key
|
||||
if(pk_base64.size > PUBLIC_KEY_BASE64_SIZE_MAX)
|
||||
pk_base64.size = PUBLIC_KEY_BASE64_SIZE_MAX;
|
||||
server.pk_base64_len = pk_base64.size;
|
||||
if(pk_base64.len > PUBLIC_KEY_BASE64_SIZE_MAX)
|
||||
pk_base64.len = PUBLIC_KEY_BASE64_SIZE_MAX;
|
||||
server.pk_base64_len = pk_base64.len;
|
||||
memcpy(server.pk_base64, pk_base64.data, server.pk_base64_len);
|
||||
// name
|
||||
if(name.size > SERVER_NAME_SIZE_MAX)
|
||||
name.size = SERVER_NAME_SIZE_MAX;
|
||||
server.name_len = name.size;
|
||||
if(name.len > SERVER_NAME_SIZE_MAX)
|
||||
name.len = SERVER_NAME_SIZE_MAX;
|
||||
server.name_len = name.len;
|
||||
memcpy(server.name, name.data, server.name_len);
|
||||
// description
|
||||
if(desc.size > SERVER_DESC_SIZE_MAX)
|
||||
desc.size = SERVER_DESC_SIZE_MAX;
|
||||
server.desc_len = desc.size;
|
||||
if(desc.len > SERVER_DESC_SIZE_MAX)
|
||||
desc.len = SERVER_DESC_SIZE_MAX;
|
||||
server.desc_len = desc.len;
|
||||
memcpy(server.desc, desc.data, server.desc_len);
|
||||
|
||||
// Lock table until this function returns.
|
||||
@@ -395,16 +397,16 @@ static Result(ServerInfo*) ClientCLI_saveServerInfo(ClientCLI* self,
|
||||
// update existing server
|
||||
u64 id = *id_ptr;
|
||||
try_void(idb_updateRow(self->servers.table, id, &server, false));
|
||||
try_assert(id < List_len(self->servers.list, ServerInfo));
|
||||
cached_row_ptr = &List_index(self->servers.list, ServerInfo, id);
|
||||
try_assert(id < self->servers.list.len);
|
||||
cached_row_ptr = self->servers.list.data + id;
|
||||
memcpy(cached_row_ptr, &server, sizeof(ServerInfo));
|
||||
}
|
||||
else {
|
||||
// push new server
|
||||
try(u64 id, u, idb_pushRow(self->servers.table, &server, false));
|
||||
try_assert(id == List_len(self->servers.list, ServerInfo));
|
||||
List_pushMany(&self->servers.list, ServerInfo, &server, 1);
|
||||
cached_row_ptr = &List_index(self->servers.list, ServerInfo, id);
|
||||
try_assert(id == self->servers.list.len);
|
||||
List_ServerInfo_pushMany(&self->servers.list, &server, 1);
|
||||
cached_row_ptr = self->servers.list.data + id;
|
||||
try_assert(HashMap_tryPush(&self->servers.addr_id_map, addr, &id));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user