[common] option: add support for float option types

This commit is contained in:
Geoffrey McRae 2021-08-10 01:09:40 +10:00
parent 37faccd014
commit 88eada3494
2 changed files with 37 additions and 0 deletions

View File

@ -30,6 +30,7 @@ enum OptionType
OPTION_TYPE_INT, OPTION_TYPE_INT,
OPTION_TYPE_STRING, OPTION_TYPE_STRING,
OPTION_TYPE_BOOL, OPTION_TYPE_BOOL,
OPTION_TYPE_FLOAT,
OPTION_TYPE_CUSTOM OPTION_TYPE_CUSTOM
}; };
@ -55,6 +56,7 @@ struct Option
int x_int; int x_int;
char * x_string; char * x_string;
bool x_bool; bool x_bool;
float x_float;
void * x_custom; void * x_custom;
} }
value; value;
@ -78,6 +80,7 @@ struct Option * option_get (const char * module, const char * name);
int option_get_int (const char * module, const char * name); int option_get_int (const char * module, const char * name);
const char * option_get_string(const char * module, const char * name); const char * option_get_string(const char * module, const char * name);
bool option_get_bool (const char * module, const char * name); bool option_get_bool (const char * module, const char * name);
bool option_get_float (const char * module, const char * name);
// called by the main application to parse the command line arguments // called by the main application to parse the command line arguments
bool option_parse(int argc, char * argv[]); bool option_parse(int argc, char * argv[]);

View File

@ -70,6 +70,12 @@ static bool bool_parser(struct Option * opt, const char * str)
return true; return true;
} }
static bool float_parser(struct Option * opt, const char * str)
{
opt->value.x_float = atof(str);
return true;
}
static bool string_parser(struct Option * opt, const char * str) static bool string_parser(struct Option * opt, const char * str)
{ {
free(opt->value.x_string); free(opt->value.x_string);
@ -90,6 +96,14 @@ static char * bool_toString(struct Option * opt)
return strdup(opt->value.x_bool ? "yes" : "no"); return strdup(opt->value.x_bool ? "yes" : "no");
} }
static char * float_toString(struct Option * opt)
{
int len = snprintf(NULL, 0, "%f", opt->value.x_float);
char * ret = malloc(len + 1);
sprintf(ret, "%f", opt->value.x_float);
return ret;
}
static char * string_toString(struct Option * opt) static char * string_toString(struct Option * opt)
{ {
if (!opt->value.x_string) if (!opt->value.x_string)
@ -131,6 +145,10 @@ bool option_register(struct Option options[])
o->parser = bool_parser; o->parser = bool_parser;
break; break;
case OPTION_TYPE_FLOAT:
o->parser = float_parser;
break;
default: default:
DEBUG_ERROR("BUG: Non int/string/bool option types must have a parser"); DEBUG_ERROR("BUG: Non int/string/bool option types must have a parser");
continue; continue;
@ -153,6 +171,10 @@ bool option_register(struct Option options[])
o->toString = bool_toString; o->toString = bool_toString;
break; break;
case OPTION_TYPE_FLOAT:
o->toString = float_toString;
break;
default: default:
DEBUG_ERROR("BUG: Non int/string/bool option types must implement toString"); DEBUG_ERROR("BUG: Non int/string/bool option types must implement toString");
continue; continue;
@ -770,3 +792,15 @@ bool option_get_bool(const char * module, const char * name)
assert(o->type == OPTION_TYPE_BOOL); assert(o->type == OPTION_TYPE_BOOL);
return o->value.x_bool; return o->value.x_bool;
} }
bool option_get_float(const char * module, const char * name)
{
struct Option * o = option_get(module, name);
if (!o)
{
DEBUG_ERROR("BUG: Failed to get the value for option %s:%s", module, name);
return false;
}
assert(o->type == OPTION_TYPE_FLOAT);
return o->value.x_float;
}