diff options
| author | Albert Cervin <albert@acervin.com> | 2023-03-17 08:43:41 +0100 |
|---|---|---|
| committer | Albert Cervin <albert@acervin.com> | 2023-03-17 08:43:41 +0100 |
| commit | 0e61e64b4e1036f2bf107efb01bea1017893d5e6 (patch) | |
| tree | afed627a8e4a0d3136e6f5ff3e6ca1a1a7274ca6 /src/settings.c | |
| parent | 40db61eb7a2019ced97f09a9687139f35749f4e0 (diff) | |
| download | dged-0e61e64b4e1036f2bf107efb01bea1017893d5e6.tar.gz dged-0e61e64b4e1036f2bf107efb01bea1017893d5e6.tar.xz dged-0e61e64b4e1036f2bf107efb01bea1017893d5e6.zip | |
Implement support for languages
Uses the settings system to implement a small system for per-language
settings.
Diffstat (limited to 'src/settings.c')
| -rw-r--r-- | src/settings.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/src/settings.c b/src/settings.c index c00fd94..4bbcf44 100644 --- a/src/settings.c +++ b/src/settings.c @@ -26,6 +26,16 @@ void settings_destroy() { HASHMAP_DESTROY(&g_settings.settings); } +void setting_set_value(struct setting *setting, struct setting_value val) { + if (setting->value.type == val.type) { + if (setting->value.type == Setting_String && val.string_value != NULL) { + setting->value.string_value = strdup(val.string_value); + } else { + setting->value = val; + } + } +} + void settings_register_setting(const char *path, struct setting_value default_value) { HASHMAP_APPEND(&g_settings.settings, struct setting_entry, path, @@ -33,7 +43,8 @@ void settings_register_setting(const char *path, if (s != NULL) { struct setting *new_setting = &s->value; - new_setting->value = default_value; + new_setting->value.type = default_value.type; + setting_set_value(new_setting, default_value); strncpy(new_setting->path, path, 128); new_setting->path[127] = '\0'; } @@ -64,15 +75,15 @@ void settings_get_prefix(const char *prefix, struct setting **settings_out[], void settings_set(const char *path, struct setting_value value) { struct setting *setting = settings_get(path); - if (setting != NULL && setting->value.type == value.type) { - setting->value = value; + if (setting != NULL) { + setting_set_value(setting, value); } } void setting_to_string(struct setting *setting, char *buf, size_t n) { switch (setting->value.type) { case Setting_Bool: - snprintf(buf, n, "%s", setting->value.bool_value ? "true" : false); + snprintf(buf, n, "%s", setting->value.bool_value ? "true" : "false"); break; case Setting_Number: snprintf(buf, n, "%ld", setting->value.number_value); @@ -105,7 +116,7 @@ int32_t settings_set_cmd(struct command_ctx ctx, int argc, const char *argv[]) { if (argc == 0) { return minibuffer_prompt(ctx, "setting: "); } else if (argc == 1) { - // validate setting here as well + // validate setting here as well for a better experience struct setting *setting = settings_get(argv[0]); if (setting == NULL) { minibuffer_echo_timeout(4, "no such setting \"%s\"", argv[0]); @@ -125,17 +136,19 @@ int32_t settings_set_cmd(struct command_ctx ctx, int argc, const char *argv[]) { struct setting_value new_value = {.type = setting->value.type}; switch (setting->value.type) { case Setting_Bool: - new_value.bool_value = strncmp("true", value, 4) == 0; + new_value.bool_value = strncmp("true", value, 4) == 0 || + strncmp("yes", value, 3) == 0 || + strncmp("on", value, 2) == 0; break; case Setting_Number: new_value.number_value = atol(value); break; case Setting_String: - new_value.string_value = strdup(value); + new_value.string_value = (char *)value; break; } - setting->value = new_value; + setting_set_value(setting, new_value); } return 0; |
