From ac1ce0a0474466eb7f6e02777d69f08870e41be9 Mon Sep 17 00:00:00 2001
From: schneider <schneider@blinkenlichts.net>
Date: Sun, 10 Nov 2019 17:54:28 +0100
Subject: [PATCH] fix(config): Add *_with_default functions

---
 epicardium/modules/config.c | 77 ++++++++++++++++++++++++++++---------
 epicardium/modules/config.h | 13 +++++--
 2 files changed, 68 insertions(+), 22 deletions(-)

diff --git a/epicardium/modules/config.c b/epicardium/modules/config.c
index dcbe7b86..14fc24f3 100644
--- a/epicardium/modules/config.c
+++ b/epicardium/modules/config.c
@@ -304,27 +304,40 @@ static size_t read_config_offset(size_t seek_offset, char *buf, size_t buf_len)
 	return nread;
 }
 
-// returns default_value if not found or invalid
-int config_get_integer(const char *key, int default_value)
+// returns error if not found or invalid
+int config_get_integer(const char *key, int *value)
 {
 	config_slot *slot = find_config_slot(key);
 	if (slot && slot->value != NOT_INT_MAGIC) {
-		return slot->value;
+		*value = slot->value;
+		return 0;
+	}
+	return -ENOENT;
+}
+
+// returns default_value if not found or invalid
+int config_get_integer_with_default(const char *key, int default_value)
+{
+	int value;
+	int ret = config_get_integer(key, &value);
+	if (ret) {
+		return default_value;
+	} else {
+		return value;
 	}
-	return default_value;
 }
 
-// returns NULL if not found, otherwise same pointer as buf
-char *config_get_string(const char *key, char *buf, size_t buf_len)
+// returns error if not found
+int config_get_string(const char *key, char *buf, size_t buf_len)
 {
 	config_slot *slot = find_config_slot(key);
 	if (!(slot && slot->value_offset)) {
-		return NULL;
+		return -ENOENT;
 	}
 
 	size_t nread = read_config_offset(slot->value_offset, buf, buf_len);
 	if (nread == 0) {
-		return NULL;
+		return -ENOENT;
 	}
 
 	char *eol = strchr(buf, '\n');
@@ -332,30 +345,58 @@ char *config_get_string(const char *key, char *buf, size_t buf_len)
 		*eol = '\0';
 	}
 
-	return buf;
+	return 0;
 }
 
-// returns default_value if not found or invalid
-bool config_get_boolean(const char *key, bool default_value)
+// returns dflt if not found, otherwise same pointer as buf
+char *config_get_string_with_default(
+	const char *key, char *buf, size_t buf_len, char *dflt
+) {
+	int ret = config_get_string(key, buf, buf_len);
+	if (ret) {
+		return dflt;
+	} else {
+		return buf;
+	}
+}
+
+// returns error if not found or invalid
+int config_get_boolean(const char *key, bool *value)
 {
-	int int_value = config_get_integer(key, -1);
+	int int_value;
+	int ret = config_get_integer(key, &int_value);
 
-	if (int_value != -1) {
-		return !!int_value;
+	if (ret == 0) {
+		*value = !!int_value;
+		return 0;
 	}
 
 	char buf[MAX_LINE_LENGTH + 1];
 	config_get_string(key, buf, MAX_LINE_LENGTH);
 
 	if (buf == NULL) {
-		return default_value;
+		return -ENOENT;
 	}
 
 	if (!strcmp(buf, "true")) {
-		return true;
+		*value = true;
+		return 0;
 	} else if (!strcmp(buf, "false")) {
-		return false;
+		*value = false;
+		return 0;
 	}
 
-	return default_value;
+	return -ERANGE;
+}
+
+// returns default_value if not found or invalid
+bool config_get_boolean_with_default(const char *key, bool default_value)
+{
+	bool value;
+	int ret = config_get_boolean(key, &value);
+	if (ret) {
+		return default_value;
+	} else {
+		return value;
+	}
 }
diff --git a/epicardium/modules/config.h b/epicardium/modules/config.h
index 5693214b..4c8bdc60 100644
--- a/epicardium/modules/config.h
+++ b/epicardium/modules/config.h
@@ -7,11 +7,16 @@
 //initialize configuration values and load card10.cfg
 void load_config(void);
 
+// returns error if not found
+int config_get_integer(const char *key, int *value);
+int config_get_boolean(const char *key, bool *value);
+int config_get_string(const char *key, char *buf, size_t buf_len);
+
 // returns default_value if not found or invalid
-bool config_get_boolean(const char *key, bool default_value);
-int config_get_integer(const char *key, int default_value);
+bool config_get_boolean_with_default(const char *key, bool default_value);
+int config_get_integer_with_default(const char *key, int default_value);
 
-// returns NULL if not found, otherwise same pointer as buf
-char *config_get_string(const char *key, char *buf, size_t buf_len);
+// returns dflt if not found, otherwise same pointer as buf
+char *config_get_string_with_default(const char *key, char *buf, size_t buf_len, char *dflt);
 
 #endif//EPICARDIUM_MODULES_CONFIG_H_INCLUDED
-- 
GitLab