diff options
| author | Tristan Riehs <tristan.riehs@inria.fr> | 2026-05-03 21:42:52 +0200 |
|---|---|---|
| committer | Tristan Riehs <tristan.riehs@inria.fr> | 2026-05-03 21:42:52 +0200 |
| commit | 8f055cf8c4daa693b16fbd257399ab2e1ed2eed3 (patch) | |
| tree | c54588bf33a320c4d5cde9a81afafc5aa2909fb5 /src | |
| parent | 08f9d5ddd1233f973e6a613931f80cbebd4e39dd (diff) | |
Create a config module
Diffstat (limited to 'src')
| -rw-r--r-- | src/config.c | 75 | ||||
| -rw-r--r-- | src/config.h | 16 |
2 files changed, 91 insertions, 0 deletions
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 |
