aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile24
-rw-r--r--src/config.c75
-rw-r--r--src/config.h16
3 files changed, 105 insertions, 10 deletions
diff --git a/Makefile b/Makefile
index 5a3514a..a31484b 100644
--- a/Makefile
+++ b/Makefile
@@ -7,6 +7,7 @@ export FTAG_CONFIG_DIR ?= $(shell pwd)/ftag_config
export PROG ?= ftag
export CFLAGS ?= -O0 -g3
+export UCONFIG_ROOT ?= /usr/local
export LDFLAGS ?=
export LIBS ?=
@@ -16,22 +17,25 @@ export FTAG_VERSION := 0.1
FTAG_ARCHIVE_DIR := ftag-$(FTAG_VERSION)
FTAG_ARCHIVE := ftag-$(FTAG_VERSION).tar.gz
-export __CFLAGS := -std=c99 -Wall \
- -DFTAG_PREFIX=\"$(PREFIX)\" \
- -DFTAG_CACHE_DIR=\"$(FTAG_CACHE_DIR)\" \
- -DFTAG_CONFIG_DIR=\"$(FTAG_CONFIG_DIR)\" \
- -DFTAG_VERSION=\"$(FTAG_VERSION)\" \
- -D_POSIX_C_SOURCE=200809L \
- $(shell pkg-config --cflags sqlite3)
-export __LIBS := $(shell pkg-config --libs sqlite3)
+export __CFLAGS := -std=c99 -Wall \
+ -DFTAG_PREFIX=\"$(PREFIX)\" \
+ -DFTAG_CACHE_DIR=\"$(FTAG_CACHE_DIR)\" \
+ -DFTAG_CONFIG_DIR=\"$(FTAG_CONFIG_DIR)\" \
+ -DFTAG_VERSION=\"$(FTAG_VERSION)\" \
+ -D_POSIX_C_SOURCE=200809L \
+ $(shell pkg-config --cflags sqlite3) \
+ -I$(UCONFIG_ROOT)/include
+export __LDFLAGS := -L$(UCONFIG_ROOT)/lib
+export __LIBS := $(shell pkg-config --libs sqlite3) -l uconfig
all: $(PROG)
-$(PROG): src/main.o src/input.o src/system.o src/utils.o
+$(PROG): src/config.o src/input.o src/main.o src/system.o src/utils.o
$(CC) -o $@ $^ $(__LIBS) $(LDFLAGS) $(LIBS)
-src/main.o: src/main.c src/input.h src/system.h src/utils.h
+src/config.o: src/config.c src/config.h src/system.h src/utils.h
src/input.o: src/input.c src/input.h
+src/main.o: src/main.c src/input.h src/system.h src/utils.h
src/system.o: src/system.c src/system.h
src/utils.o: src/utils.c src/system.h src/utils.h
.c.o:
diff --git a/src/config.c b/src/config.c
new file mode 100644
index 0000000..c0d9409
--- /dev/null
+++ b/src/config.c
@@ -0,0 +1,75 @@
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <uconfig.h>
+
+#include "config.h"
+#include "system.h"
+#include "utils.h"
+
+#define CONFIG_STR_SIZE 128
+
+static struct uconfig_s *uconfig;
+static char *ftag_config_keys[FC_COUNT];
+static char ftag_config_values[FC_COUNT][CONFIG_STR_SIZE];
+
+static void ftag_config_read(enum ftag_config_e key)
+{
+ char *new_value = uconfig_get(uconfig, ftag_config_keys[key]);
+ if (new_value != NULL) {
+ assert(strlen(new_value) < CONFIG_STR_SIZE);
+ strcpy(ftag_config_values[key], new_value);
+ }
+}
+
+void ftag_config_init(char *config_file)
+{
+ const char *env_home = getenv("HOME");
+
+ /* Keys */
+ ftag_config_keys[FC_DATABASE_PATH] = "database_path";
+ ftag_config_keys[FC_CACHE_DIR] = "cache_dir";
+ ftag_config_keys[FC_REMOTE_HOST] = "remote_host";
+ ftag_config_keys[FC_REMOTE_ROOT] = "remote_root";
+
+ /* Defaults */
+ strbuild(ftag_config_values[FC_DATABASE_PATH],
+ "%s/.cache/ftag/ftag.sqlite3", env_home);
+ strbuild(ftag_config_values[FC_CACHE_DIR],
+ "%s/.cache/ftag", env_home);
+ strcpy(ftag_config_values[FC_REMOTE_HOST], "localhost");
+ strcpy(ftag_config_values[FC_REMOTE_ROOT], "ftag");
+
+ if (config_file == NULL) {
+ /* Use default config file */
+ /* TODO: prioritize XDG_CONFIG_HOME */
+ config_file = malloc(CONFIG_STR_SIZE);
+ strbuild_with_size(config_file, CONFIG_STR_SIZE,
+ "%s/.config/ftag/ftag.conf", env_home);
+ }
+
+ uconfig = NULL;
+ if (file_exists(config_file)) {
+ uconfig = uconfig_new(config_file);
+ if (uconfig == NULL) {
+ fprintf(stderr,
+ "%s: error during configuration file parsing\n",
+ __func__);
+ exit(EXIT_FAILURE);
+ }
+ for (enum ftag_config_e key = FC_FIRST; key < FC_COUNT; key++) {
+ ftag_config_read(key);
+ }
+ }
+}
+
+const char *ftag_config_get(enum ftag_config_e key)
+{
+ return ftag_config_values[key];
+}
+
+void ftag_config_finalize(void)
+{
+ uconfig_destroy(uconfig);
+}
diff --git a/src/config.h b/src/config.h
index 82ffd6a..50cba3a 100644
--- a/src/config.h
+++ b/src/config.h
@@ -12,4 +12,20 @@
#define DATABASE_PATH FTAG_CACHE_DIR "/ftag.sqlite3"
+/* Note "FC" stands for "Ftag Config". */
+enum ftag_config_e {
+ FC_DATABASE_PATH,
+ FC_CACHE_DIR,
+ FC_REMOTE_HOST,
+ FC_REMOTE_ROOT,
+ FC_COUNT,
+ FC_FIRST = FC_DATABASE_PATH
+};
+
+void ftag_config_init(char *config_file);
+
+const char *ftag_config_get(enum ftag_config_e key);
+
+void ftag_config_destroy(void);
+
#endif