config from new c2s: underscore and dashes are equivalent

This commit is contained in:
yrutschle 2020-01-26 21:19:16 +01:00
parent 10fe9c6e27
commit dfa764e2e8
2 changed files with 49 additions and 10 deletions

View File

@ -1,5 +1,5 @@
/* Generated by conf2struct (https://www.rutschle.net/tech/conf2struct/README)
* on Fri Dec 27 18:18:30 2019.
* on Sun Jan 26 21:17:47 2020.
# conf2struct: generate libconf parsers that read to structs
# Copyright (C) 2018-2019 Yves Rutschle
@ -1000,6 +1000,47 @@ static void print_setting(config_type type, void* val)
}
}
/* Changes all dashes to underscores in a string of
* vice-versa */
void strswap_ud(const char target, char* str)
{
char* c;
for (c = str; *c; c++)
if (*c == (target == '_' ? '-' : '_'))
*c = (target == '_' ? '_' : '-');
}
/* Same as config_setting_lookup() but looks up with dash or
* underscore so `my_setting` and `my-setting` match the same */
config_setting_t* config_setting_lookup_ud(config_setting_t* cfg, struct config_desc* desc)
{
config_setting_t* setting;
char name[strlen(desc->name)+1];;
strcpy(name, desc->name);
strswap_ud('_', name);
setting = config_setting_lookup(cfg, name);
if (setting)
return setting;
strswap_ud('-', name);
setting = config_setting_lookup(cfg, name);
return setting;
}
int lookup_typed_ud(config_setting_t* cfg, void* target, struct config_desc *desc)
{
lookup_fn lookup_fn = lookup_fns[desc->type];
char name[strlen(desc->name)+1];;
strcpy(name, desc->name);
strswap_ud('_', name);
if (lookup_fn(cfg, name, ((char*)target) + desc->offset) == CONFIG_TRUE)
return CONFIG_TRUE;
strswap_ud('-', name);
return lookup_fn(cfg, name, ((char*)target) + desc->offset);
}
/* When traversing configuration, allocate memory for plural
* types, init for scalars */
@ -1013,7 +1054,7 @@ static void read_block_init(void* target, config_setting_t* cfg, struct config_d
case CFG_LIST:
case CFG_ARRAY:
if (cfg) {
setting = config_setting_lookup(cfg, desc->name);
setting = config_setting_lookup_ud(cfg, desc);
if (setting)
len = config_setting_length(setting);
}
@ -1055,14 +1096,13 @@ static int read_block_setval(void* target,
int i;
size_t len = 0;
void* block;
lookup_fn lookup_fn;
int in_cfg = 0, in_cl = 0; /* Present in config file? present on command line? */
config_setting_t* setting = NULL;
switch (desc->type) {
case CFG_LIST:
if (cfg) {
setting = config_setting_lookup(cfg, desc->name);
setting = config_setting_lookup_ud(cfg, desc);
if (setting)
len = config_setting_length(setting);
block = *(void**)(((char*)target) + desc->offset);
@ -1076,7 +1116,7 @@ static int read_block_setval(void* target,
case CFG_ARRAY:
if (cfg) {
setting = config_setting_lookup(cfg, desc->name);
setting = config_setting_lookup_ud(cfg, desc);
if (setting)
len = config_setting_length(setting);
block = *(void**)(((char*)target) + desc->offset);
@ -1090,18 +1130,17 @@ static int read_block_setval(void* target,
break;
case CFG_GROUP:
if (cfg) setting = config_setting_lookup(cfg, desc->name);
if (cfg) setting = config_setting_lookup_ud(cfg, desc);
block = *(void**)(((char*)target) + desc->offset);
if (!read_block(setting, block, desc->sub_group, errmsg)) return 0;
break;
default: /* scalar types */
TRACE_READ((" `%s'", desc->name));
if (cfg && config_setting_lookup(cfg, desc->name)) {
if (cfg && config_setting_lookup_ud(cfg, desc)) {
TRACE_READ((" in config file: "));
/* setting is present in cfg, look it up */
lookup_fn = lookup_fns[desc->type];
if (lookup_fn(cfg, desc->name, ((char*)target) + desc->offset) != CONFIG_TRUE) {
if (lookup_typed_ud(cfg, target, desc) != CONFIG_TRUE) {
TRACE_READ((" but wrong type (expected %s) ", type2str[desc->type]));
asprintf(errmsg, "Option \"%s\" wrong type, expected %s\n",
desc->name, type2str[desc->type]);

View File

@ -1,5 +1,5 @@
/* Generated by conf2struct (https://www.rutschle.net/tech/conf2struct/README)
* on Fri Dec 27 18:18:30 2019.
* on Sun Jan 26 21:17:47 2020.
# conf2struct: generate libconf parsers that read to structs
# Copyright (C) 2018-2019 Yves Rutschle