add cmdline_get* and options_get*

This commit is contained in:
Sascha Kruse 2012-10-20 09:35:58 +02:00
parent 66a5845ecc
commit 1b2b1d2f03
2 changed files with 153 additions and 0 deletions

141
options.c
View File

@ -32,6 +32,11 @@ static void add_entry(char *section_name, char *key, char *value);
static char *get_value(char *section, char *key);
static char *clean_value(char *value);
static int cmdline_argc;
static char **cmdline_argv;
static int cmdline_find_option(char *key);
section_t *new_section(char *name)
{
section_count++;
@ -255,4 +260,140 @@ int load_ini_file(FILE *fp)
free(current_section);
return 0;
}
void cmdline_load(int argc, char *argv[])
{
cmdline_argc = argc;
cmdline_argv = argv;
}
int cmdline_find_option(char *key)
{
char *key1 = strdup(key);
char *key2 = strstr(key1, "/");
if (key2) {
*key2 = '\0';
key2++;
}
/* look for first key */
for (int i = 0; i < cmdline_argc; i++) {
if (strcmp(key1, cmdline_argv[i]) == 0) {
free(key1);
return i;
}
}
/* look for second key if one was specified */
if (key2) {
for (int i = 0; i < cmdline_argc; i++) {
if (strcmp(key2, cmdline_argv[i]) == 0) {
free(key1);
return i;
}
}
}
free(key1);
return -1;
}
char *cmdline_get_string(char *key, char *def)
{
int idx = cmdline_find_option(key);
if (idx == 0) {
return def;
}
if (idx + 1 <= cmdline_argc || cmdline_argv[idx+1][0] == '-') {
/* the argument is missing */
fprintf(stderr, "Warning: %s, missing argument. Ignoring", key);
return def;
}
return cmdline_argv[idx+1];
}
int cmdline_get_int(char *key, int def)
{
char *str = cmdline_get_string(key, NULL);
if (str == NULL)
return def;
else
return atoi(str);
}
double cmdline_get_double(char *key, double def)
{
char *str = cmdline_get_string(key, NULL);
if (str == NULL)
return def;
else
return atof(str);
}
int cmdline_get_bool(char *key, int def)
{
int idx = cmdline_find_option(key);
if (idx > 0)
return true;
else
return def;
}
char *option_get_string(char *ini_section, char *ini_key, char *cmdline_key, char *def)
{
char *val = cmdline_get_string(cmdline_key, NULL);
if (val) {
return val;
} else {
return ini_get_string(ini_section, ini_key, def);
}
}
int option_get_int(char *ini_section, char *ini_key, char *cmdline_key, int def)
{
/* we have to get this twice in order to check wether the actual value
* is the same as the first default value
*/
int val = cmdline_get_int(cmdline_key, 1);
int val2 = cmdline_get_int(cmdline_key, 0);
if (val == val2) {
/* the cmdline option has been set */
return val;
} else {
return ini_get_int(ini_section, ini_key, def);
}
}
double option_get_double(char *ini_section, char *ini_key, char *cmdline_key, double def)
{
/* see option_get_int */
double val = cmdline_get_double(cmdline_key, 1);
double val2 = cmdline_get_double(cmdline_key, 0);
if (val == val2) {
return val;
} else {
return ini_get_double(ini_section, ini_key, def);
}
}
int option_get_bool(char *ini_section, char *ini_key, char *cmdline_key, int def)
{
int val = cmdline_get_bool(cmdline_key, false);
if (val) {
/* this can only be true if the value has been set,
* so we can return */
return true;
}
return ini_get_bool(ini_section, ini_key, def);
}
/* vim: set ts=8 sw=8 tw=0: */

View File

@ -11,6 +11,18 @@ double ini_get_double(char *section, char *key, double def);
int ini_get_bool(char *section, char *key, int def);
void free_ini(void);
void cmdline_load(int argc, char *argv[]);
/* for all cmdline_get_* key can be either "-key" or "-key/-longkey" */
char *cmdline_get_string(char *key, char *def);
int cmdline_get_int(char *key, int def);
double cmdline_get_double(char *key, double def);
int cmdline_get_bool(char *key, int def);
char *option_get_string(char *ini_section, char *ini_key, char *cmdline_key, char *def);
int option_get_int(char *ini_section, char *ini_key, char *cmdline_key, int def);
double option_get_double(char *ini_section, char *ini_key, char *cmdline_key, double def);
int option_get_bool(char *ini_section, char *ini_key, char *cmdline_key, int def);
/* returns the next known section.
* if section == NULL returns first section.
* returns NULL if no more sections are available