aboutsummaryrefslogtreecommitdiffstats
path: root/src/blogc-make/ctx.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/blogc-make/ctx.c')
-rw-r--r--src/blogc-make/ctx.c172
1 files changed, 172 insertions, 0 deletions
diff --git a/src/blogc-make/ctx.c b/src/blogc-make/ctx.c
new file mode 100644
index 0000000..8c9cc9a
--- /dev/null
+++ b/src/blogc-make/ctx.c
@@ -0,0 +1,172 @@
+/*
+ * blogc: A blog compiler.
+ * Copyright (C) 2016 Rafael G. Martins <rafael@rafaelmartins.eng.br>
+ *
+ * This program can be distributed under the terms of the BSD License.
+ * See the file LICENSE.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <libgen.h>
+#include <time.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include "../common/file.h"
+#include "../common/utils.h"
+#include "atom.h"
+#include "settings.h"
+#include "ctx.h"
+
+
+bm_filectx_t*
+bm_filectx_new(bm_ctx_t *ctx, const char *filename)
+{
+ if (ctx == NULL || filename == NULL)
+ return NULL;
+
+ char *f = filename[0] == '/' ? bc_strdup(filename) :
+ bc_strdup_printf("%s/%s", ctx->root_dir, filename);
+
+ bm_filectx_t *rv = bc_malloc(sizeof(bm_filectx_t));
+ rv->path = f;
+ rv->short_path = bc_strdup(filename);
+
+ struct stat buf;
+
+ if (0 != stat(f, &buf)) {
+ struct timespec ts;
+ ts.tv_sec = 0;
+ ts.tv_nsec = 0;
+ rv->timestamp = ts;
+ rv->readable = false;
+ }
+ else {
+ rv->timestamp = buf.st_mtim;
+ rv->readable = true;
+ }
+
+ return rv;
+}
+
+
+void
+bm_filectx_free(bm_filectx_t *fctx)
+{
+ if (fctx == NULL)
+ return;
+ free(fctx->path);
+ free(fctx->short_path);
+ free(fctx);
+}
+
+
+bm_ctx_t*
+bm_ctx_new(const char *settings_file, bc_error_t **err)
+{
+ if (settings_file == NULL || err == NULL || *err != NULL)
+ return NULL;
+
+ size_t content_len;
+ char *content = bc_file_get_contents(settings_file, true, &content_len,
+ err);
+ if (*err != NULL)
+ return NULL;
+
+ bm_settings_t *settings = bm_settings_parse(content, content_len, err);
+ if (*err != NULL) {
+ free(content);
+ return NULL;
+ }
+ free(content);
+
+ char *atom_template = bm_atom_deploy(settings, err);
+ if (*err != NULL) {
+ return NULL;
+ }
+
+ bm_ctx_t *rv = bc_malloc(sizeof(bm_ctx_t));
+ rv->settings = settings;
+
+ char *real_filename = realpath(settings_file, NULL);
+ rv->settings_fctx = bm_filectx_new(rv, real_filename);
+ rv->root_dir = bc_strdup(dirname(real_filename));
+ free(real_filename);
+
+ const char *output_dir = bc_trie_lookup(settings->settings, "output_dir");
+ rv->output_dir = output_dir[0] == '/' ? bc_strdup(output_dir) :
+ bc_strdup_printf("%s/%s", rv->root_dir, output_dir);
+
+ const char *template_dir = bc_trie_lookup(settings->settings,
+ "template_dir");
+
+ char *main_template = bc_strdup_printf("%s/%s", template_dir,
+ bc_trie_lookup(settings->settings, "main_template"));
+ rv->main_template_fctx = bm_filectx_new(rv, main_template);
+ free(main_template);
+
+ rv->atom_template_fctx = bm_filectx_new(rv, atom_template);
+ free(atom_template);
+
+ const char *content_dir = bc_trie_lookup(settings->settings, "content_dir");
+ const char *post_prefix = bc_trie_lookup(settings->settings, "post_prefix");
+ const char *source_ext = bc_trie_lookup(settings->settings, "source_ext");
+
+ rv->posts_fctx = NULL;
+ if (settings->posts != NULL) {
+ for (size_t i = 0; settings->posts[i] != NULL; i++) {
+ char *f = bc_strdup_printf("%s/%s/%s%s", content_dir, post_prefix,
+ settings->posts[i], source_ext);
+ rv->posts_fctx = bc_slist_append(rv->posts_fctx,
+ bm_filectx_new(rv, f));
+ free(f);
+ }
+ }
+
+ rv->pages_fctx = NULL;
+ if (settings->pages != NULL) {
+ for (size_t i = 0; settings->pages[i] != NULL; i++) {
+ char *f = bc_strdup_printf("%s/%s%s", content_dir,
+ settings->pages[i], source_ext);
+ rv->pages_fctx = bc_slist_append(rv->pages_fctx,
+ bm_filectx_new(rv, f));
+ free(f);
+ }
+ }
+
+ rv->copy_files_fctx = NULL;
+ if (settings->copy_files != NULL) {
+ for (size_t i = 0; settings->copy_files[i] != NULL; i++) {
+ rv->copy_files_fctx = bc_slist_append(rv->copy_files_fctx,
+ bm_filectx_new(rv, settings->copy_files[i]));
+ }
+ }
+
+ return rv;
+}
+
+
+void
+bm_ctx_free(bm_ctx_t *ctx)
+{
+ if (ctx == NULL)
+ return;
+
+ bm_settings_free(ctx->settings);
+
+ free(ctx->root_dir);
+ free(ctx->output_dir);
+
+ bm_atom_destroy(ctx->atom_template_fctx->path);
+
+ bm_filectx_free(ctx->main_template_fctx);
+ bm_filectx_free(ctx->atom_template_fctx);
+ bm_filectx_free(ctx->settings_fctx);
+
+ bc_slist_free_full(ctx->posts_fctx, (bc_free_func_t) bm_filectx_free);
+ bc_slist_free_full(ctx->pages_fctx, (bc_free_func_t) bm_filectx_free);
+ bc_slist_free_full(ctx->copy_files_fctx, (bc_free_func_t) bm_filectx_free);
+
+ free(ctx);
+}