aboutsummaryrefslogtreecommitdiff
path: root/src/config.c
diff options
context:
space:
mode:
authorRaghuram Subramani <raghus2247@gmail.com>2025-08-28 08:57:56 -0400
committerRaghuram Subramani <raghus2247@gmail.com>2025-08-28 08:57:56 -0400
commitab44f0795db114fd6115df4388abfb30009b76e8 (patch)
tree4d6c4393fcc4c779e88c3ada3fdac565961db59e /src/config.c
parente575bd7b35df28c236a6812b430ed4cbd86deb13 (diff)
config: support array of nested blocks with delimiter ___
Diffstat (limited to 'src/config.c')
-rw-r--r--src/config.c38
1 files changed, 32 insertions, 6 deletions
diff --git a/src/config.c b/src/config.c
index e593020..ead0f48 100644
--- a/src/config.c
+++ b/src/config.c
@@ -21,6 +21,7 @@
#include <config.h>
#include <filehandler.h>
#include <list.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -32,8 +33,27 @@ parse_nested_block(char **buffer, list_t *nested_config_values)
(*buffer)++;
char *raw_block = strsep(buffer, "]");
- config_t *config = config_parse(raw_block);
- list_wrap_and_add(nested_config_values, config);
+ list_t *l = list_create(sizeof(ptr_wrapper_t));
+
+ while (true) {
+ char *next = strstr(raw_block, DELIM_BLOCK);
+
+ if (next == NULL) {
+ config_t *config = config_parse(raw_block);
+ list_wrap_and_add(l, config);
+
+ break;
+ } else {
+ char *block = strndup(raw_block, next - raw_block);
+ config_t *config = config_parse(block);
+ list_wrap_and_add(l, config);
+ free(block);
+
+ raw_block += next - raw_block + strlen(DELIM_BLOCK);
+ }
+ }
+
+ list_wrap_and_add(nested_config_values, l);
}
static void
@@ -112,6 +132,7 @@ config_delete(config_t *config)
{
for (size_t i = 0; i < config->keys->size; i++) {
ptr_wrapper_t *wrapper;
+ list_t *l;
wrapper = list_get(config->keys, i);
if (wrapper->ptr != NULL)
@@ -121,11 +142,16 @@ config_delete(config_t *config)
if (wrapper->ptr != NULL)
free(wrapper->ptr);
- wrapper = list_get(config->nested_config_values, i);
- if (wrapper->ptr != NULL)
- config_delete(wrapper->ptr);
+ l = unwrap(list_get(config->nested_config_values, i));
+ if (l != NULL) {
+ for (size_t y = 0; y < l->size; y++) {
+ config_t *config = unwrap(list_get(l, y));
+ config_delete(config);
+ }
+ list_delete(l);
+ }
- list_t *l = unwrap(list_get(config->array_values, i));
+ l = unwrap(list_get(config->array_values, i));
if (l != NULL) {
for (size_t y = 0; y < l->size; y++) {
wrapper = list_get(l, y);