src/config.c: Remove map for configuration variables
This patch kind of reverts what we did in commit 6377582841118688aee13aff98c9216403582e45. We were a tad off-base there since using a map doesn't improve maintainability, really. Using strcmp() at a central location seems perfectly fine and doesn't have the overhead of the map scanning algorithm. Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
parent
093b28ac39
commit
4f4891bdb8
283
src/config.c
283
src/config.c
@ -38,66 +38,8 @@
|
|||||||
|
|
||||||
#include "calcurse.h"
|
#include "calcurse.h"
|
||||||
|
|
||||||
/* Available configuration variables. */
|
|
||||||
enum config_var {
|
|
||||||
CUSTOM_CONF_AUTOSAVE,
|
|
||||||
CUSTOM_CONF_AUTOGC,
|
|
||||||
CUSTOM_CONF_PERIODICSAVE,
|
|
||||||
CUSTOM_CONF_CONFIRMQUIT,
|
|
||||||
CUSTOM_CONF_CONFIRMDELETE,
|
|
||||||
CUSTOM_CONF_SKIPSYSTEMDIALOGS,
|
|
||||||
CUSTOM_CONF_SKIPPROGRESSBAR,
|
|
||||||
CUSTOM_CONF_CALENDAR_DEFAULTVIEW,
|
|
||||||
CUSTOM_CONF_WEEKBEGINSONMONDAY,
|
|
||||||
CUSTOM_CONF_COLORTHEME,
|
|
||||||
CUSTOM_CONF_LAYOUT,
|
|
||||||
CUSTOM_CONF_SBAR_WIDTH,
|
|
||||||
CUSTOM_CONF_NOTIFYBARSHOW,
|
|
||||||
CUSTOM_CONF_NOTIFYBARDATE,
|
|
||||||
CUSTOM_CONF_NOTIFYBARCLOCK,
|
|
||||||
CUSTOM_CONF_NOTIFYBARWARNING,
|
|
||||||
CUSTOM_CONF_NOTIFYBARCOMMAND,
|
|
||||||
CUSTOM_CONF_NOTIFYALL,
|
|
||||||
CUSTOM_CONF_OUTPUTDATEFMT,
|
|
||||||
CUSTOM_CONF_INPUTDATEFMT,
|
|
||||||
CUSTOM_CONF_DMON_ENABLE,
|
|
||||||
CUSTOM_CONF_DMON_LOG,
|
|
||||||
CUSTOM_CONF_INVALID
|
|
||||||
};
|
|
||||||
|
|
||||||
struct config_varname {
|
|
||||||
enum config_var var;
|
|
||||||
const char *name;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct config_varname config_varmap[] =
|
|
||||||
{
|
|
||||||
{ CUSTOM_CONF_AUTOSAVE, "auto_save" },
|
|
||||||
{ CUSTOM_CONF_AUTOGC, "auto_gc" },
|
|
||||||
{ CUSTOM_CONF_PERIODICSAVE, "periodic_save" },
|
|
||||||
{ CUSTOM_CONF_CONFIRMQUIT, "confirm_quit" },
|
|
||||||
{ CUSTOM_CONF_CONFIRMDELETE, "confirm_delete" },
|
|
||||||
{ CUSTOM_CONF_SKIPSYSTEMDIALOGS, "skip_system_dialogs" },
|
|
||||||
{ CUSTOM_CONF_SKIPPROGRESSBAR, "skip_progress_bar" },
|
|
||||||
{ CUSTOM_CONF_CALENDAR_DEFAULTVIEW, "calendar_default_view" },
|
|
||||||
{ CUSTOM_CONF_WEEKBEGINSONMONDAY, "week_begins_on_monday" },
|
|
||||||
{ CUSTOM_CONF_COLORTHEME, "color-theme" },
|
|
||||||
{ CUSTOM_CONF_LAYOUT, "layout" },
|
|
||||||
{ CUSTOM_CONF_SBAR_WIDTH, "side-bar_width" },
|
|
||||||
{ CUSTOM_CONF_NOTIFYBARSHOW, "notify-bar_show" },
|
|
||||||
{ CUSTOM_CONF_NOTIFYBARDATE, "notify-bar_date" },
|
|
||||||
{ CUSTOM_CONF_NOTIFYBARCLOCK, "notify-bar_clock" },
|
|
||||||
{ CUSTOM_CONF_NOTIFYBARWARNING, "notify-bar_warning" },
|
|
||||||
{ CUSTOM_CONF_NOTIFYBARCOMMAND, "notify-bar_command" },
|
|
||||||
{ CUSTOM_CONF_NOTIFYALL, "notify-all" },
|
|
||||||
{ CUSTOM_CONF_OUTPUTDATEFMT, "output_datefmt" },
|
|
||||||
{ CUSTOM_CONF_INPUTDATEFMT, "input_datefmt" },
|
|
||||||
{ CUSTOM_CONF_DMON_ENABLE, "notify-daemon_enable" },
|
|
||||||
{ CUSTOM_CONF_DMON_LOG, "notify-daemon_log" }
|
|
||||||
};
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
config_parse_bool (unsigned *dest, char *val)
|
config_parse_bool (unsigned *dest, const char *val)
|
||||||
{
|
{
|
||||||
if (strncmp (val, "yes", 4) == 0)
|
if (strncmp (val, "yes", 4) == 0)
|
||||||
*dest = 1;
|
*dest = 1;
|
||||||
@ -110,7 +52,7 @@ config_parse_bool (unsigned *dest, char *val)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
config_parse_unsigned (unsigned *dest, char *val)
|
config_parse_unsigned (unsigned *dest, const char *val)
|
||||||
{
|
{
|
||||||
if (is_all_digit (val))
|
if (is_all_digit (val))
|
||||||
*dest = atoi (val);
|
*dest = atoi (val);
|
||||||
@ -121,7 +63,7 @@ config_parse_unsigned (unsigned *dest, char *val)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
config_parse_int (int *dest, char *val)
|
config_parse_int (int *dest, const char *val)
|
||||||
{
|
{
|
||||||
if ((*val == '+' || *val == '-' || isdigit (*val)) && is_all_digit (val + 1))
|
if ((*val == '+' || *val == '-' || isdigit (*val)) && is_all_digit (val + 1))
|
||||||
*dest = atoi (val);
|
*dest = atoi (val);
|
||||||
@ -137,7 +79,7 @@ config_parse_int (int *dest, char *val)
|
|||||||
* differently (number between 1 and 8).
|
* differently (number between 1 and 8).
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
config_parse_color (char *val)
|
config_parse_color (const char *val)
|
||||||
{
|
{
|
||||||
#define AWAITED_COLORS 2
|
#define AWAITED_COLORS 2
|
||||||
|
|
||||||
@ -226,91 +168,110 @@ config_parse_color (char *val)
|
|||||||
|
|
||||||
/* Set a configuration variable. */
|
/* Set a configuration variable. */
|
||||||
static int
|
static int
|
||||||
config_set_conf (enum config_var var, char *val)
|
config_set_conf (const char *key, const char *value)
|
||||||
{
|
{
|
||||||
unsigned tmp;
|
if (!key)
|
||||||
|
return -1;
|
||||||
|
|
||||||
switch (var)
|
if (!strcmp(key, "auto_save"))
|
||||||
{
|
return config_parse_bool (&conf.auto_save, value);
|
||||||
case CUSTOM_CONF_AUTOSAVE:
|
|
||||||
return config_parse_bool (&conf.auto_save, val);
|
if (!strcmp(key, "auto_gc"))
|
||||||
break;
|
return config_parse_bool (&conf.auto_gc, value);
|
||||||
case CUSTOM_CONF_AUTOGC:
|
|
||||||
return config_parse_bool (&conf.auto_gc, val);
|
if (!strcmp(key, "periodic_save"))
|
||||||
break;
|
return config_parse_unsigned (&conf.periodic_save, value);
|
||||||
case CUSTOM_CONF_PERIODICSAVE:
|
|
||||||
return config_parse_unsigned (&conf.periodic_save, val);
|
if (!strcmp(key, "confirm_quit"))
|
||||||
break;
|
return config_parse_bool (&conf.confirm_quit, value);
|
||||||
case CUSTOM_CONF_CONFIRMQUIT:
|
|
||||||
return config_parse_bool (&conf.confirm_quit, val);
|
if (!strcmp(key, "confirm_delete"))
|
||||||
break;
|
return config_parse_bool (&conf.confirm_delete, value);
|
||||||
case CUSTOM_CONF_CONFIRMDELETE:
|
|
||||||
return config_parse_bool (&conf.confirm_delete, val);
|
if (!strcmp(key, "skip_system_dialogs"))
|
||||||
break;
|
return config_parse_bool (&conf.skip_system_dialogs, value);
|
||||||
case CUSTOM_CONF_SKIPSYSTEMDIALOGS:
|
|
||||||
return config_parse_bool (&conf.skip_system_dialogs, val);
|
if (!strcmp(key, "skip_progress_bar"))
|
||||||
break;
|
return config_parse_bool (&conf.skip_progress_bar, value);
|
||||||
case CUSTOM_CONF_SKIPPROGRESSBAR:
|
|
||||||
return config_parse_bool (&conf.skip_progress_bar, val);
|
if (!strcmp(key, "calendar_default_view")) {
|
||||||
break;
|
calendar_set_view (atoi (value));
|
||||||
case CUSTOM_CONF_CALENDAR_DEFAULTVIEW:
|
return 1;
|
||||||
calendar_set_view (atoi (val));
|
}
|
||||||
break;
|
|
||||||
case CUSTOM_CONF_WEEKBEGINSONMONDAY:
|
if (!strcmp(key, "week_begins_on_monday")) {
|
||||||
return config_parse_bool (&tmp, val);
|
unsigned tmp;
|
||||||
|
if (config_parse_bool (&tmp, value)) {
|
||||||
if (tmp)
|
if (tmp)
|
||||||
calendar_set_first_day_of_week (MONDAY);
|
calendar_set_first_day_of_week (MONDAY);
|
||||||
else
|
else
|
||||||
calendar_set_first_day_of_week (SUNDAY);
|
calendar_set_first_day_of_week (SUNDAY);
|
||||||
break;
|
return 1;
|
||||||
case CUSTOM_CONF_COLORTHEME:
|
}
|
||||||
return config_parse_color (val);
|
else
|
||||||
break;
|
return 0;
|
||||||
case CUSTOM_CONF_LAYOUT:
|
}
|
||||||
wins_set_layout (atoi (val));
|
|
||||||
break;
|
if (!strcmp(key, "color-theme"))
|
||||||
case CUSTOM_CONF_SBAR_WIDTH:
|
return config_parse_color (value);
|
||||||
wins_set_sbar_width (atoi (val));
|
|
||||||
break;
|
if (!strcmp(key, "layout")) {
|
||||||
case CUSTOM_CONF_NOTIFYBARSHOW:
|
wins_set_layout (atoi (value));
|
||||||
return config_parse_bool (&nbar.show, val);
|
return 1;
|
||||||
break;
|
}
|
||||||
case CUSTOM_CONF_NOTIFYBARDATE:
|
|
||||||
strncpy (nbar.datefmt, val, strlen (val) + 1);
|
if (!strcmp(key, "side-bar_width")) {
|
||||||
break;
|
wins_set_sbar_width (atoi (value));
|
||||||
case CUSTOM_CONF_NOTIFYBARCLOCK:
|
return 1;
|
||||||
strncpy (nbar.timefmt, val, strlen (val) + 1);
|
}
|
||||||
break;
|
|
||||||
case CUSTOM_CONF_NOTIFYBARWARNING:
|
if (!strcmp(key, "notify-bar_show"))
|
||||||
return config_parse_int (&nbar.cntdwn, val);
|
return config_parse_bool (&nbar.show, value);
|
||||||
break;
|
|
||||||
case CUSTOM_CONF_NOTIFYBARCOMMAND:
|
if (!strcmp(key, "notify-bar_date")) {
|
||||||
strncpy (nbar.cmd, val, strlen (val) + 1);
|
strncpy (nbar.datefmt, value, strlen (value) + 1);
|
||||||
break;
|
return 1;
|
||||||
case CUSTOM_CONF_NOTIFYALL:
|
}
|
||||||
return config_parse_bool(&nbar.notify_all, val);
|
|
||||||
break;
|
if (!strcmp(key, "notify-bar_clock")) {
|
||||||
case CUSTOM_CONF_OUTPUTDATEFMT:
|
strncpy (nbar.timefmt, value, strlen (value) + 1);
|
||||||
if (val[0] != '\0')
|
return 1;
|
||||||
strncpy (conf.output_datefmt, val, strlen (val) + 1);
|
}
|
||||||
break;
|
|
||||||
case CUSTOM_CONF_INPUTDATEFMT:
|
if (!strcmp(key, "notify-bar_warning"))
|
||||||
return config_parse_int (&conf.input_datefmt, val);
|
return config_parse_int (&nbar.cntdwn, value);
|
||||||
|
|
||||||
|
if (!strcmp(key, "notify-bar_command")) {
|
||||||
|
strncpy (nbar.cmd, value, strlen (value) + 1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(key, "notify-all"))
|
||||||
|
return config_parse_bool(&nbar.notify_all, value);
|
||||||
|
|
||||||
|
if (!strcmp(key, "output_datefmt")) {
|
||||||
|
if (value[0] != '\0')
|
||||||
|
strncpy (conf.output_datefmt, value, strlen (value) + 1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(key, "input_datefmt")) {
|
||||||
|
if (config_parse_int (&conf.input_datefmt, value)) {
|
||||||
if (conf.input_datefmt <= 0 || conf.input_datefmt >= DATE_FORMATS)
|
if (conf.input_datefmt <= 0 || conf.input_datefmt >= DATE_FORMATS)
|
||||||
conf.input_datefmt = 1;
|
conf.input_datefmt = 1;
|
||||||
break;
|
return 1;
|
||||||
case CUSTOM_CONF_DMON_ENABLE:
|
|
||||||
return config_parse_bool (&dmon.enable, val);
|
|
||||||
break;
|
|
||||||
case CUSTOM_CONF_DMON_LOG:
|
|
||||||
return config_parse_bool (&dmon.log, val);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
if (!strcmp(key, "notify-daemon_enable"))
|
||||||
|
return config_parse_bool (&dmon.enable, value);
|
||||||
|
|
||||||
|
if (!strcmp(key, "notify-daemon_log"))
|
||||||
|
return config_parse_bool (&dmon.log, value);
|
||||||
|
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load the user configuration. */
|
/* Load the user configuration. */
|
||||||
@ -321,10 +282,8 @@ config_load (void)
|
|||||||
char *mesg_line1 = _("Failed to open config file");
|
char *mesg_line1 = _("Failed to open config file");
|
||||||
char *mesg_line2 = _("Press [ENTER] to continue");
|
char *mesg_line2 = _("Press [ENTER] to continue");
|
||||||
char buf[BUFSIZ], e_conf[BUFSIZ];
|
char buf[BUFSIZ], e_conf[BUFSIZ];
|
||||||
int i;
|
char *key, *value;
|
||||||
char *name;
|
int result;
|
||||||
enum config_var var;
|
|
||||||
char *val;
|
|
||||||
|
|
||||||
data_file = fopen (path_conf, "r");
|
data_file = fopen (path_conf, "r");
|
||||||
if (data_file == NULL)
|
if (data_file == NULL)
|
||||||
@ -345,44 +304,30 @@ config_load (void)
|
|||||||
if (*e_conf == '\0')
|
if (*e_conf == '\0')
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
name = e_conf;
|
key = e_conf;
|
||||||
val = strchr (e_conf, '=');
|
value = strchr (e_conf, '=');
|
||||||
if (val)
|
if (value)
|
||||||
{
|
{
|
||||||
*val = '\0';
|
*value = '\0';
|
||||||
val++;
|
value++;
|
||||||
}
|
}
|
||||||
|
|
||||||
var = CUSTOM_CONF_INVALID;
|
if (value && (*value == '\0' || *value == '\n'))
|
||||||
for (i = 0; i < sizeof (config_varmap) / sizeof (struct config_varname); i++)
|
|
||||||
{
|
|
||||||
if (strncmp (name, config_varmap[i].name, BUFSIZ) == 0)
|
|
||||||
{
|
|
||||||
var = config_varmap[i].var;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (var == CUSTOM_CONF_INVALID)
|
|
||||||
{
|
|
||||||
EXIT (_("configuration variable unknown: \"%s\""), name);
|
|
||||||
/* NOTREACHED */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (val && (*val == '\0' || *val == '\n'))
|
|
||||||
{
|
{
|
||||||
/* Backward compatibility mode. */
|
/* Backward compatibility mode. */
|
||||||
if (fgets (buf, sizeof buf, data_file) == NULL)
|
if (fgets (buf, sizeof buf, data_file) == NULL)
|
||||||
break;
|
break;
|
||||||
io_extract_data (e_conf, buf, sizeof buf);
|
io_extract_data (e_conf, buf, sizeof buf);
|
||||||
val = e_conf;
|
value = e_conf;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!val || !config_set_conf (var, val))
|
result = config_set_conf (key, value);
|
||||||
{
|
if (result < 0)
|
||||||
EXIT (_("wrong configuration variable format for \"%s\""), name);
|
EXIT (_("configuration variable unknown: \"%s\""), key);
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
}
|
else if (result == 0)
|
||||||
|
EXIT (_("wrong configuration variable format for \"%s\""), key);
|
||||||
|
/* NOTREACHED */
|
||||||
}
|
}
|
||||||
file_close (data_file, __FILE_POS__);
|
file_close (data_file, __FILE_POS__);
|
||||||
pthread_mutex_unlock (&nbar.mutex);
|
pthread_mutex_unlock (&nbar.mutex);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user