diff options
author | Raghuram Subramani <raghus2247@gmail.com> | 2025-07-30 20:18:35 +0530 |
---|---|---|
committer | Raghuram Subramani <raghus2247@gmail.com> | 2025-07-30 20:18:35 +0530 |
commit | 0cd55a7b37edf098c6b6ffdb551cfb80629e3c79 (patch) | |
tree | 3ec939a9e27797ad6453599dac252881811649cb | |
parent | 8e6dad06fe4c0bb83f44ff016c3814b9c89f385b (diff) |
template: add template_initialize() and template_clean()
-rw-r--r-- | include/template.h | 2 | ||||
-rw-r--r-- | src/msg.c | 2 | ||||
-rw-r--r-- | src/template.c | 84 |
3 files changed, 74 insertions, 14 deletions
diff --git a/include/template.h b/include/template.h index e70b460..4676feb 100644 --- a/include/template.h +++ b/include/template.h @@ -27,6 +27,8 @@ typedef struct { list_t *components; } template_t; +void template_initialize(void); +void template_clean(void); template_t *template_create(char *template_name); void template_delete(template_t *template); void template_write(template_t *template, @@ -128,6 +128,7 @@ run(void) if (config == NULL) return EXIT_FAILURE; + template_initialize(); base_template = template_create(BASE_TEMPLATE); int err = mkdir(msg->output_directory, 0700); @@ -178,6 +179,7 @@ run(void) } template_delete(base_template); + template_clean(); config_delete(config); return EXIT_SUCCESS; diff --git a/src/template.c b/src/template.c index 6773986..aea077e 100644 --- a/src/template.c +++ b/src/template.c @@ -19,6 +19,7 @@ #define _GNU_SOURCE #include <copy.h> +#include <dirent.h> #include <engine.h> #include <filehandler.h> #include <lexer.h> @@ -28,9 +29,77 @@ #include <stdlib.h> #include <string.h> #include <template.h> +#include <util.h> extern msg_t *msg; +list_t *keys; +list_t *templates; + +static void +delete_components(template_t *template) +{ + for (size_t i = 0; i < template->components->size; i++) { + directive_t *directive = list_get(template->components, i); + switch (directive->type) { + case _RAW: + case CONTENT: + free(directive->operands); + break; + + default: + break; + } + } + list_delete(template->components); +} + +void +template_initialize(void) +{ + keys = list_create(sizeof(ptr_wrapper_t)); + templates = list_create(sizeof(template_t)); + + char *template_directory; + asprintf(&template_directory, "%s/%s", msg->base_directory, TEMPLATES); + DIR *dir = opendir(template_directory); + + if (dir == NULL) { + printf("Could not open %s\n", template_directory); + return; + } + free(template_directory); + + struct dirent *f; + while ((f = readdir(dir)) != NULL) { + if (f->d_type != DT_REG) + continue; + + template_t *t = template_create(f->d_name); + list_wrap_and_add(keys, strdup(f->d_name)); + list_add(templates, t); + + free(t); + } + + closedir(dir); +} + +void +template_clean(void) +{ + for (size_t i = 0; i < keys->size; i++) { + template_t *template = list_get(templates, i); + delete_components(template); + + ptr_wrapper_t *wrapper = list_get(keys, i); + free(wrapper->ptr); + } + + list_delete(keys); + list_delete(templates); +} + template_t * template_create(char *template_name) { @@ -56,20 +125,7 @@ template_create(char *template_name) void template_delete(template_t *template) { - for (size_t i = 0; i < template->components->size; i++) { - directive_t *directive = list_get(template->components, i); - switch (directive->type) { - case _RAW: - case CONTENT: - free(directive->operands); - break; - - default: - break; - } - } - - list_delete(template->components); + delete_components(template); free(template); } |