2023-09-22 12:54:15 +01:00
|
|
|
#include "putty.h"
|
|
|
|
|
Begin moving saved-setting semantics into conf_key_info.
The new ConfKeyInfo structure now includes some fields indicating how
to load and save each config option: what keyword it's stored under in
the saved settings file, and what its default value should be set to
when loading a session that doesn't mention it. (Including, of course,
loading the null session at program startup.)
So far, this only applies to the saved settings that are sufficiently
simple: a single integer, string or boolean value whose internal
format matches its storage format, or an integer value consisting of a
finite enumeration with a fixed mapping between its internal and
storage formats. Anything more difficult than that - mappings,
variable defaults, config options tied together, options that still
support a legacy save format alongside the up-to-date one, things
under #ifdef - hasn't yet been tampered with.
This allows a large amount of repetitive code in settings.c to be
deleted, and replaced by simple loops over the conf_key_info array
doing all the easy work. The remaining manual load/save code per
option is all there because it's difficult in some way.
The transitional test_conf program still passes after this upheaval.
2023-09-22 13:48:20 +01:00
|
|
|
#define CONF_ENUM(name, ...) \
|
|
|
|
static const ConfSaveEnumValue enum_values_##name[] = { \
|
|
|
|
__VA_ARGS__ \
|
|
|
|
}; static const ConfSaveEnumType enum_##name = { \
|
|
|
|
.values = enum_values_##name, \
|
|
|
|
.nvalues = lenof(enum_values_##name), \
|
|
|
|
};
|
|
|
|
|
|
|
|
#define VALUE(eval, sval) { eval, sval, false }
|
|
|
|
#define VALUE_OBSOLETE(eval, sval) { eval, sval, true }
|
|
|
|
|
|
|
|
#include "conf-enums.h"
|
|
|
|
|
|
|
|
bool conf_enum_map_to_storage(const ConfSaveEnumType *etype,
|
|
|
|
int confval, int *storageval_out)
|
|
|
|
{
|
|
|
|
for (size_t i = 0; i < etype->nvalues; i++)
|
|
|
|
if (!etype->values[i].obsolete &&
|
|
|
|
etype->values[i].confval == confval) {
|
|
|
|
*storageval_out = etype->values[i].storageval;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool conf_enum_map_from_storage(const ConfSaveEnumType *etype,
|
|
|
|
int storageval, int *confval_out)
|
|
|
|
{
|
|
|
|
for (size_t i = 0; i < etype->nvalues; i++)
|
|
|
|
if (etype->values[i].storageval == storageval) {
|
|
|
|
*confval_out = etype->values[i].confval;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2023-09-22 12:54:15 +01:00
|
|
|
#define CONF_OPTION(id, ...) { __VA_ARGS__ },
|
|
|
|
#define VALUE_TYPE(x) .value_type = CONF_TYPE_ ## x
|
|
|
|
#define SUBKEY_TYPE(x) .subkey_type = CONF_TYPE_ ## x
|
Begin moving saved-setting semantics into conf_key_info.
The new ConfKeyInfo structure now includes some fields indicating how
to load and save each config option: what keyword it's stored under in
the saved settings file, and what its default value should be set to
when loading a session that doesn't mention it. (Including, of course,
loading the null session at program startup.)
So far, this only applies to the saved settings that are sufficiently
simple: a single integer, string or boolean value whose internal
format matches its storage format, or an integer value consisting of a
finite enumeration with a fixed mapping between its internal and
storage formats. Anything more difficult than that - mappings,
variable defaults, config options tied together, options that still
support a legacy save format alongside the up-to-date one, things
under #ifdef - hasn't yet been tampered with.
This allows a large amount of repetitive code in settings.c to be
deleted, and replaced by simple loops over the conf_key_info array
doing all the easy work. The remaining manual load/save code per
option is all there because it's difficult in some way.
The transitional test_conf program still passes after this upheaval.
2023-09-22 13:48:20 +01:00
|
|
|
#define DEFAULT_INT(x) .default_value.ival = x
|
|
|
|
#define DEFAULT_STR(x) .default_value.sval = x
|
|
|
|
#define DEFAULT_BOOL(x) .default_value.bval = x
|
|
|
|
#define SAVE_KEYWORD(x) .save_keyword = x
|
|
|
|
#define STORAGE_ENUM(x) .storage_enum = &enum_ ## x
|
2023-09-22 12:54:15 +01:00
|
|
|
|
|
|
|
const ConfKeyInfo conf_key_info[] = {
|
|
|
|
#include "conf.h"
|
|
|
|
};
|