summaryrefslogtreecommitdiff
path: root/src/dged/settings.c
diff options
context:
space:
mode:
authorAlbert Cervin <albert@acervin.com>2023-04-06 23:23:46 +0200
committerAlbert Cervin <albert@acervin.com>2023-05-01 22:19:14 +0200
commita123725a12e948d78badb2cb686d38548f1c633b (patch)
treec92c46134ef5536fbbf3bf08983c4f0dea1aaf58 /src/dged/settings.c
parentb5ed4cf757afc50afb6ac499eee7b87a2648fa4c (diff)
downloaddged-a123725a12e948d78badb2cb686d38548f1c633b.tar.gz
dged-a123725a12e948d78badb2cb686d38548f1c633b.tar.xz
dged-a123725a12e948d78badb2cb686d38548f1c633b.zip
Implement window handling
Also implement searching. fix undo boundaries when it checked for other save point, it used && instead of == which caused it to overwrite other types. Fix bytes vs chars bug in text_get_region
Diffstat (limited to 'src/dged/settings.c')
-rw-r--r--src/dged/settings.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/dged/settings.c b/src/dged/settings.c
new file mode 100644
index 0000000..524aa9b
--- /dev/null
+++ b/src/dged/settings.c
@@ -0,0 +1,95 @@
+#include "settings.h"
+#include "command.h"
+#include "hash.h"
+#include "hashmap.h"
+#include "minibuffer.h"
+#include "vec.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static struct settings g_settings = {0};
+
+void settings_init(uint32_t initial_capacity) {
+ HASHMAP_INIT(&g_settings.settings, initial_capacity, hash_name);
+}
+
+void settings_destroy() {
+ HASHMAP_FOR_EACH(&g_settings.settings, struct setting_entry * entry) {
+ struct setting *setting = &entry->value;
+ if (setting->value.type == Setting_String) {
+ free(setting->value.string_value);
+ }
+ }
+
+ 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,
+ struct setting_entry * s);
+
+ if (s != NULL) {
+ struct setting *new_setting = &s->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';
+ }
+}
+
+struct setting *settings_get(const char *path) {
+ HASHMAP_GET(&g_settings.settings, struct setting_entry, path,
+ struct setting * s);
+ return s;
+}
+
+void settings_get_prefix(const char *prefix, struct setting **settings_out[],
+ uint32_t *nsettings_out) {
+
+ uint32_t capacity = 16;
+ VEC(struct setting *) res;
+ VEC_INIT(&res, 16);
+ HASHMAP_FOR_EACH(&g_settings.settings, struct setting_entry * entry) {
+ struct setting *setting = &entry->value;
+ if (strncmp(prefix, setting->path, strlen(prefix)) == 0) {
+ VEC_PUSH(&res, setting);
+ }
+ }
+
+ *nsettings_out = VEC_SIZE(&res);
+ *settings_out = VEC_ENTRIES(&res);
+}
+
+void settings_set(const char *path, struct setting_value value) {
+ struct setting *setting = settings_get(path);
+ 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");
+ break;
+ case Setting_Number:
+ snprintf(buf, n, "%ld", setting->value.number_value);
+ break;
+ case Setting_String:
+ snprintf(buf, n, "%s", setting->value.string_value);
+ break;
+ }
+}