// dvxPrefs.c — INI-based preferences system // // Thin wrapper around rxi/ini that adds typed accessors with defaults. #include #include #include #include "dvxPrefs.h" #include "thirdparty/ini/src/ini.h" static ini_t *sIni = NULL; // ============================================================ // prefsFree // ============================================================ void prefsFree(void) { if (sIni) { ini_free(sIni); sIni = NULL; } } // ============================================================ // prefsGetBool // ============================================================ bool prefsGetBool(const char *section, const char *key, bool defaultVal) { const char *val = prefsGetString(section, key, NULL); if (!val) { return defaultVal; } // Case-insensitive first character check covers true/yes/1 and false/no/0 char c = (char)tolower((unsigned char)val[0]); if (c == 't' || c == 'y' || c == '1') { return true; } if (c == 'f' || c == 'n' || c == '0') { return false; } return defaultVal; } // ============================================================ // prefsGetInt // ============================================================ int32_t prefsGetInt(const char *section, const char *key, int32_t defaultVal) { const char *val = prefsGetString(section, key, NULL); if (!val) { return defaultVal; } char *end = NULL; long n = strtol(val, &end, 10); if (end == val) { return defaultVal; } return (int32_t)n; } // ============================================================ // prefsGetString // ============================================================ const char *prefsGetString(const char *section, const char *key, const char *defaultVal) { if (!sIni) { return defaultVal; } const char *val = ini_get(sIni, section, key); return val ? val : defaultVal; } // ============================================================ // prefsLoad // ============================================================ bool prefsLoad(const char *filename) { prefsFree(); sIni = ini_load(filename); return sIni != NULL; }