diff --git a/port/src/config.c b/port/src/config.c index b10c5e5df..5f9f7289e 100644 --- a/port/src/config.c +++ b/port/src/config.c @@ -16,6 +16,7 @@ typedef enum { CFG_NONE, CFG_S32, CFG_F32, + CFG_U32, CFG_STR } configtype; @@ -27,6 +28,7 @@ struct configentry { union { struct { f32 min_f32, max_f32; }; struct { s32 min_s32, max_s32; }; + struct { u32 min_u32, max_u32; }; u32 max_str; }; } settings[CONFIG_MAX_SETTINGS]; @@ -38,6 +40,11 @@ static inline s32 configClampInt(s32 val, s32 min, s32 max) return (val < min) ? min : ((val > max) ? max : val); } +static inline u32 configClampUInt(u32 val, u32 min, u32 max) +{ + return (val < min) ? min : ((val > max) ? max : val); +} + static inline f32 configClampFloat(f32 val, f32 min, f32 max) { return (val < min) ? min : ((val > max) ? max : val); @@ -101,6 +108,17 @@ void configRegisterInt(const char *key, s32 *var, s32 min, s32 max) } } +void configRegisterUInt(const char* key, u32* var, u32 min, u32 max) +{ + struct configentry* cfg = configFindOrAddEntry(key); + if (cfg) { + cfg->type = CFG_U32; + cfg->ptr = var; + cfg->min_u32 = min; + cfg->max_u32 = max; + } +} + void configRegisterFloat(const char *key, f32 *var, f32 min, f32 max) { struct configentry *cfg = configFindOrAddEntry(key); @@ -129,6 +147,7 @@ static void configSetFromString(const char *key, const char *val) s32 tmp_s32; f32 tmp_f32; + u32 tmp_u32; switch (cfg->type) { case CFG_S32: tmp_s32 = atoi(val); @@ -144,6 +163,13 @@ static void configSetFromString(const char *key, const char *val) } *(f32 *)cfg->ptr = tmp_f32; break; + case CFG_U32: + tmp_u32 = atoll(val); + if (cfg->min_u32 < cfg->max_u32) { + tmp_u32 = configClampUInt(tmp_u32, cfg->min_u32, cfg->max_u32); + } + *(u32*)cfg->ptr = tmp_u32; + break; case CFG_STR: strncpy(cfg->ptr, val, cfg->max_str ? cfg->max_str - 1 : 4096); break; @@ -167,6 +193,12 @@ static void configSaveEntry(struct configentry *cfg, FILE *f) } fprintf(f, "%s=%f\n", cfg->key + cfg->seclen + 1, *(f32 *)cfg->ptr); break; + case CFG_U32: + if (cfg->min_u32 < cfg->max_u32) { + *(u32*)cfg->ptr = configClampUInt(*(u32*)cfg->ptr, cfg->min_u32, cfg->max_u32); + } + fprintf(f, "%s=%u\n", cfg->key + cfg->seclen + 1, *(u32*)cfg->ptr); + break; case CFG_STR: fprintf(f, "%s=%s\n", cfg->key + cfg->seclen + 1, (char *)cfg->ptr); break;