aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaghuram Subramani <raghus2247@gmail.com>2025-07-30 20:18:35 +0530
committerRaghuram Subramani <raghus2247@gmail.com>2025-07-30 20:18:35 +0530
commit0cd55a7b37edf098c6b6ffdb551cfb80629e3c79 (patch)
tree3ec939a9e27797ad6453599dac252881811649cb
parent8e6dad06fe4c0bb83f44ff016c3814b9c89f385b (diff)
template: add template_initialize() and template_clean()
-rw-r--r--include/template.h2
-rw-r--r--src/msg.c2
-rw-r--r--src/template.c84
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,
diff --git a/src/msg.c b/src/msg.c
index 968da98..76cf9cc 100644
--- a/src/msg.c
+++ b/src/msg.c
@@ -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);
}