int64 MDFN_GetSettingI(const char *name) { const MDFNCS *setting = FindSetting(name); const char *value = GetSetting(FindSetting(name)); if(setting->desc->type == MDFNST_ENUM) return(GetEnum(setting, value)); else { long long ret; TranslateSettingValueI(value, ret); return(ret); } }
static bool ValidateSetting(const char *value, const MDFNSetting *setting) { MDFNSettingType base_type = setting->type; if(base_type == MDFNST_UINT) { unsigned long long ullvalue; if(!TranslateSettingValueUI(value, ullvalue)) { MDFN_PrintError(_("Setting \"%s\", value \"%s\", is not set to a valid unsigned integer."), setting->name, value); return(0); } if(setting->minimum) { unsigned long long minimum; TranslateSettingValueUI(setting->minimum, minimum); if(ullvalue < minimum) { MDFN_PrintError(_("Setting \"%s\" is set too small(\"%s\"); the minimum acceptable value is \"%s\"."), setting->name, value, setting->minimum); return(0); } } if(setting->maximum) { unsigned long long maximum; TranslateSettingValueUI(setting->maximum, maximum); if(ullvalue > maximum) { MDFN_PrintError(_("Setting \"%s\" is set too large(\"%s\"); the maximum acceptable value is \"%s\"."), setting->name, value, setting->maximum); return(0); } } } else if(base_type == MDFNST_INT) { long long llvalue; if(!TranslateSettingValueI(value, llvalue)) { MDFN_PrintError(_("Setting \"%s\", value \"%s\", is not set to a valid signed integer."), setting->name, value); return(0); } if(setting->minimum) { long long minimum; TranslateSettingValueI(setting->minimum, minimum); if(llvalue < minimum) { MDFN_PrintError(_("Setting \"%s\" is set too small(\"%s\"); the minimum acceptable value is \"%s\"."), setting->name, value, setting->minimum); return(0); } } if(setting->maximum) { long long maximum; TranslateSettingValueI(setting->maximum, maximum); if(llvalue > maximum) { MDFN_PrintError(_("Setting \"%s\" is set too large(\"%s\"); the maximum acceptable value is \"%s\"."), setting->name, value, setting->maximum); return(0); } } } else if(base_type == MDFNST_FLOAT) { double dvalue; char *endptr = NULL; dvalue = world_strtod(value, &endptr); if(!endptr || *endptr != 0) { MDFN_PrintError(_("Setting \"%s\", value \"%s\", is not set to a floating-point(real) number."), setting->name, value); return(0); } if(setting->minimum) { double minimum; minimum = world_strtod(setting->minimum, NULL); if(dvalue < minimum) { MDFN_PrintError(_("Setting \"%s\" is set too small(\"%s\"); the minimum acceptable value is \"%s\"."), setting->name, value, setting->minimum); return(0); } } if(setting->maximum) { double maximum; maximum = world_strtod(setting->maximum, NULL); if(dvalue > maximum) { MDFN_PrintError(_("Setting \"%s\" is set too large(\"%s\"); the maximum acceptable value is \"%s\"."), setting->name, value, setting->maximum); return(0); } } } else if(base_type == MDFNST_BOOL) { if(strlen(value) != 1 || (value[0] != '0' && value[0] != '1')) { MDFN_PrintError(_("Setting \"%s\", value \"%s\", is not a valid boolean value."), setting->name, value); return(0); } } else if(base_type == MDFNST_ENUM) { const MDFNSetting_EnumList *enum_list = setting->enum_list; bool found = false; std::string valid_string_list; assert(enum_list); while(enum_list->string) { if(!strcasecmp(value, enum_list->string)) { found = true; break; } valid_string_list = valid_string_list + std::string(enum_list->string) + (enum_list[1].string ? " " : ""); enum_list++; } if(!found) { MDFN_PrintError(_("Setting \"%s\", value \"%s\", is not a recognized string. Recognized strings: %s"), setting->name, value, valid_string_list.c_str()); return(0); } } if(setting->validate_func && !setting->validate_func(setting->name, value)) { if(base_type == MDFNST_STRING) MDFN_PrintError(_("Setting \"%s\" is not set to a valid string: \"%s\""), setting->name, value); else MDFN_PrintError(_("Setting \"%s\" is not set to a valid unsigned integer: \"%s\""), setting->name, value); return(0); } return(1); }
static void ValidateSetting(const char *value, const MDFNSetting *setting) { MDFNSettingType base_type = setting->type; if(base_type == MDFNST_UINT) { unsigned long long ullvalue; if(!TranslateSettingValueUI(value, ullvalue)) { throw MDFN_Error(0, _("Setting \"%s\", value \"%s\", is not set to a valid unsigned integer."), setting->name, value); } if(setting->minimum) { unsigned long long minimum; TranslateSettingValueUI(setting->minimum, minimum); if(ullvalue < minimum) { throw MDFN_Error(0, _("Setting \"%s\" is set too small(\"%s\"); the minimum acceptable value is \"%s\"."), setting->name, value, setting->minimum); } } if(setting->maximum) { unsigned long long maximum; TranslateSettingValueUI(setting->maximum, maximum); if(ullvalue > maximum) { throw MDFN_Error(0, _("Setting \"%s\" is set too large(\"%s\"); the maximum acceptable value is \"%s\"."), setting->name, value, setting->maximum); } } } else if(base_type == MDFNST_INT) { long long llvalue; if(!TranslateSettingValueI(value, llvalue)) { throw MDFN_Error(0, _("Setting \"%s\", value \"%s\", is not set to a valid signed integer."), setting->name, value); } if(setting->minimum) { long long minimum; TranslateSettingValueI(setting->minimum, minimum); if(llvalue < minimum) { throw MDFN_Error(0, _("Setting \"%s\" is set too small(\"%s\"); the minimum acceptable value is \"%s\"."), setting->name, value, setting->minimum); } } if(setting->maximum) { long long maximum; TranslateSettingValueI(setting->maximum, maximum); if(llvalue > maximum) { throw MDFN_Error(0, _("Setting \"%s\" is set too large(\"%s\"); the maximum acceptable value is \"%s\"."), setting->name, value, setting->maximum); } } } else if(base_type == MDFNST_FLOAT) { double dvalue; if(!MR_StringToDouble(value, &dvalue)) { throw MDFN_Error(0, _("Setting \"%s\", value \"%s\", is not set to a floating-point(real) number."), setting->name, value); } if(setting->minimum) { double minimum; assert(MR_StringToDouble(setting->minimum, &minimum) == true); if(dvalue < minimum) { throw MDFN_Error(0, _("Setting \"%s\" is set too small(\"%s\"); the minimum acceptable value is \"%s\"."), setting->name, value, setting->minimum); } } if(setting->maximum) { double maximum; assert(MR_StringToDouble(setting->maximum, &maximum) == true); if(dvalue > maximum) { throw MDFN_Error(0, _("Setting \"%s\" is set too large(\"%s\"); the maximum acceptable value is \"%s\"."), setting->name, value, setting->maximum); } } } else if(base_type == MDFNST_BOOL) { if(strlen(value) != 1 || (value[0] != '0' && value[0] != '1')) { throw MDFN_Error(0, _("Setting \"%s\", value \"%s\", is not a valid boolean value."), setting->name, value); } } else if(base_type == MDFNST_ENUM) { const MDFNSetting_EnumList *enum_list = setting->enum_list; bool found = false; std::string valid_string_list; assert(enum_list); while(enum_list->string) { if(!strcasecmp(value, enum_list->string)) { found = true; break; } if(enum_list->description) // Don't list out undocumented and deprecated values. valid_string_list = valid_string_list + (enum_list == setting->enum_list ? "" : " ") + std::string(enum_list->string); enum_list++; } if(!found) { throw MDFN_Error(0, _("Setting \"%s\", value \"%s\", is not a recognized string. Recognized strings: %s"), setting->name, value, valid_string_list.c_str()); } } if(setting->validate_func && !setting->validate_func(setting->name, value)) { if(base_type == MDFNST_STRING) throw MDFN_Error(0, _("Setting \"%s\" is not set to a valid string: \"%s\""), setting->name, value); else throw MDFN_Error(0, _("Setting \"%s\" is not set to a valid unsigned integer: \"%s\""), setting->name, value); } }