feat(ltm): initial write function
All checks were successful
ci/woodpecker/push/build Pipeline was successful

This commit is contained in:
Jef Roosens 2023-12-16 20:42:07 +01:00
parent 11325bdbcd
commit c7a1fec6c2
Signed by: Jef Roosens
GPG key ID: B75D4F293C7052DB
5 changed files with 130 additions and 7 deletions

View file

@ -115,19 +115,23 @@ ltm_err ltm_instance_block_add_var(ltm_instance *instance, const char *name,
ltm_instance_block_type type, void *data,
size_t len) {
const ltm_template *template = instance->template;
bool matched = false;
ltm_template_block_name *block_name = NULL;
size_t i = 0;
for (i = 0; i < template->names.len && !matched; i++) {
ltm_template_block_name *block_name = &template->names.arr[i];
matched = strncmp(name, block_name->name.s, block_name->name.len) == 0;
for (i = 0; i < template->names.len; i++) {
block_name = &template->names.arr[i];
if (strncmp(name, block_name->name.s, block_name->name.len) == 0) {
break;
}
}
if (!matched) {
if (i == template->names.len) {
return ltm_err_not_found;
}
ltm_template_block *template_block = &template->blocks.arr[i];
ltm_template_block *template_block = &template->blocks.arr[block_name->index];
if (template_block->type != ltm_template_block_type_var) {
return ltm_err_wrong_block_type;
@ -191,3 +195,66 @@ ltm_err ltm_instance_block_add_nested(ltm_instance **out,
return ltm_err_ok;
}
size_t ltm_instance_size(const ltm_instance *instance) {
size_t total = 0;
ltm_instance_block *block = instance->blocks.head;
while (block != NULL) {
switch (block->type) {
case ltm_instance_block_type_buf:
case ltm_instance_block_type_buf_owned:
total += block->data.len;
break;
case ltm_instance_block_type_nested:
total += ltm_instance_size(block->data.ptr);
break;
}
block = block->next;
}
return total;
}
ltm_err ltm_instance_write(size_t *written, char *buf, size_t len,
ltm_instance *instance) {
while ((*written < len) && (instance->blocks.current != NULL)) {
ltm_instance_block *current = instance->blocks.current;
switch (current->type) {
case ltm_instance_block_type_buf:
case ltm_instance_block_type_buf_owned: {
size_t cap =
LTM_MIN(current->data.len - instance->written, len - *written);
memcpy(&buf[*written], current->data.ptr, cap);
*written += cap;
instance->written += cap;
if (instance->written == current->data.len) {
instance->blocks.current = current->next;
instance->written = 0;
}
} break;
case ltm_instance_block_type_nested: {
size_t nested_written = 0;
ltm_err res = ltm_instance_write(&nested_written, &buf[*written],
len - *written, current->data.ptr);
*written += nested_written;
switch (res) {
case ltm_err_done:
instance->blocks.current = current->next;
instance->written = 0;
break;
case ltm_err_ok:
break;
default:
return res;
}
} break;
}
}
return instance->blocks.current == NULL ? ltm_err_done : ltm_err_ok;
}