|
@@ -316,27 +316,27 @@ static bool ini_save(const char *filenam
|
|
|
fclose(f);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
static void ini_free(IniFile *ini)
|
|
|
{
|
|
|
pool_free(&ini->pool);
|
|
|
}
|
|
|
|
|
|
struct SettingDesc {
|
|
|
const char *name;
|
|
|
int flags;
|
|
|
void *def;
|
|
|
const void *def;
|
|
|
void *ptr;
|
|
|
void *b;
|
|
|
const void *b;
|
|
|
|
|
|
};
|
|
|
|
|
|
static int lookup_oneofmany(const char *many, const char *one, int onelen)
|
|
|
{
|
|
|
const char *s;
|
|
|
int idx;
|
|
|
|
|
|
if (onelen == -1) onelen = strlen(one);
|
|
|
|
|
|
// check if it's an integer
|
|
|
if (*one >= '0' && *one <= '9')
|
|
@@ -484,25 +484,25 @@ static void make_manyofmany(char *buf, c
|
|
|
if (start == many) {
|
|
|
buf += sprintf(buf, "%d", i);
|
|
|
} else {
|
|
|
memcpy(buf, start, many - start);
|
|
|
buf += many - start;
|
|
|
}
|
|
|
}
|
|
|
if (*many == '|') many++;
|
|
|
} while (++i, x>>=1);
|
|
|
*buf = 0;
|
|
|
}
|
|
|
|
|
|
static void *string_to_val(const SettingDesc *desc, const char *str)
|
|
|
static const void *string_to_val(const SettingDesc *desc, const char *str)
|
|
|
{
|
|
|
unsigned long val;
|
|
|
char *end;
|
|
|
|
|
|
switch(desc->flags & 0xF) {
|
|
|
case SDT_INTX:
|
|
|
val = strtol(str, &end, 0);
|
|
|
if (*end != 0) ShowInfoF("ini: trailing characters at end of setting '%s'", desc->name);
|
|
|
return (void*)val;
|
|
|
case SDT_ONEOFMANY: {
|
|
|
int r = lookup_oneofmany((char*)desc->b, str, -1);
|
|
|
if (r != -1) return (void*)r;
|
|
@@ -523,29 +523,29 @@ static void *string_to_val(const Setting
|
|
|
ShowInfoF("ini: invalid setting value '%s' for '%s'", str, desc->name);
|
|
|
break;
|
|
|
|
|
|
case SDT_STRING:
|
|
|
case SDT_STRINGBUF:
|
|
|
case SDT_INTLIST:
|
|
|
return (void*)str;
|
|
|
}
|
|
|
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
static void load_setting_desc(IniFile *ini, const SettingDesc *desc, void *grpname, void *base)
|
|
|
static void load_setting_desc(IniFile *ini, const SettingDesc *desc, const void *grpname, void *base)
|
|
|
{
|
|
|
IniGroup *group_def = ini_getgroup(ini, grpname, -1), *group;
|
|
|
IniItem *item;
|
|
|
void *p;
|
|
|
const void *p;
|
|
|
void *ptr;
|
|
|
|
|
|
for (;desc->name;desc++) {
|
|
|
// group override?
|
|
|
const char *s = strchr(desc->name, '.');
|
|
|
if (s) {
|
|
|
group = ini_getgroup(ini, desc->name, s - desc->name);
|
|
|
s++;
|
|
|
} else {
|
|
|
s = desc->name;
|
|
|
group = group_def;
|
|
|
}
|
|
@@ -594,29 +594,30 @@ static void load_setting_desc(IniFile *i
|
|
|
break;
|
|
|
case SDT_INTLIST: {
|
|
|
if (!load_intlist(p, ptr, desc->flags >> 16, desc->flags >> 4 & 7))
|
|
|
ShowInfoF("ini: error in array '%s'", desc->name);
|
|
|
break;
|
|
|
}
|
|
|
default:
|
|
|
NOT_REACHED();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static void save_setting_desc(IniFile *ini, const SettingDesc *desc, void *grpname, void *base)
|
|
|
static void save_setting_desc(IniFile *ini, const SettingDesc *desc, const void *grpname, void *base)
|
|
|
{
|
|
|
IniGroup *group_def = NULL, *group;
|
|
|
IniItem *item;
|
|
|
void *p, *ptr;
|
|
|
const void *p;
|
|
|
void *ptr;
|
|
|
int i = 0;
|
|
|
char buf[512]; // setting buffer
|
|
|
const char *s;
|
|
|
|
|
|
for (;desc->name;desc++) {
|
|
|
if (desc->flags & SDT_NOSAVE)
|
|
|
continue;
|
|
|
|
|
|
// group override?
|
|
|
s = strchr(desc->name, '.');
|
|
|
if (s) {
|
|
|
group = ini_getgroup(ini, desc->name, s - desc->name);
|
|
@@ -874,25 +875,25 @@ static const SettingDesc patch_settings[
|
|
|
{"dist_local_authority",SDT_UINT8, (void*)20, (void*)offsetof(Patches, dist_local_authority), NULL},
|
|
|
|
|
|
{"wait_oneway_signal", SDT_UINT8, (void*)15, (void*)offsetof(Patches, wait_oneway_signal), NULL},
|
|
|
{"wait_twoway_signal", SDT_UINT8, (void*)41, (void*)offsetof(Patches, wait_twoway_signal), NULL},
|
|
|
|
|
|
{"ainew_active", SDT_BOOL, (void*)false, (void*)offsetof(Patches, ainew_active), NULL},
|
|
|
|
|
|
{"drag_signals_density",SDT_UINT8, (void*)4, (void*)offsetof(Patches, drag_signals_density), NULL},
|
|
|
|
|
|
{NULL, 0, NULL, NULL, NULL}
|
|
|
};
|
|
|
|
|
|
typedef void SettingDescProc(IniFile *ini, const SettingDesc *desc, void *grpname, void *base);
|
|
|
typedef void SettingDescProc(IniFile *ini, const SettingDesc *desc, const void *grpname, void *base);
|
|
|
|
|
|
static void HandleSettingDescs(IniFile *ini, SettingDescProc *proc)
|
|
|
{
|
|
|
proc(ini, misc_settings, "misc", NULL);
|
|
|
proc(ini, win32_settings, "win32", NULL);
|
|
|
proc(ini, network_settings, "network", NULL);
|
|
|
proc(ini, music_settings, "music", &msf);
|
|
|
proc(ini, gameopt_settings, "gameopt", &_new_opt);
|
|
|
proc(ini, patch_settings, "patches", &_patches);
|
|
|
|
|
|
proc(ini, debug_settings, "debug", NULL);
|
|
|
}
|