From 595b6a4f6c2a6f12fb2b3c83f4053942844ffa84 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 30 Jan 2013 17:52:51 +0100 Subject: ConfigFile: add enum ConfigOption Look up top-level config options by enum (= integer), not by name string. --- src/ConfigFile.cxx | 48 ++++++++++++------------- src/ConfigOption.hxx | 90 ++++++++++++++++++++++++++++++++++++++++++++++ src/ConfigTemplates.cxx | 96 +++++++++++++++++++++++++++++++++++++++++++++++++ src/ConfigTemplates.hxx | 75 +++----------------------------------- src/Log.cxx | 3 +- src/Main.cxx | 11 +++--- src/OutputInit.cxx | 6 ++-- src/PlaylistState.cxx | 2 +- src/audio_config.c | 5 ++- src/conf.h | 73 +++++++------------------------------ 10 files changed, 237 insertions(+), 172 deletions(-) create mode 100644 src/ConfigOption.hxx create mode 100644 src/ConfigTemplates.cxx (limited to 'src') diff --git a/src/ConfigFile.cxx b/src/ConfigFile.cxx index 2c8238c2..ee2501ff 100644 --- a/src/ConfigFile.cxx +++ b/src/ConfigFile.cxx @@ -46,7 +46,7 @@ extern "C" { #define CONF_COMMENT '#' -static GSList *config_params[G_N_ELEMENTS(config_templates)]; +static GSList *config_params[unsigned(CONF_MAX)]; static bool get_bool(const char *value, bool *value_r) @@ -309,8 +309,8 @@ ReadConfigFile(const Path &path, GError **error_r) /* get the definition of that option, and check the "repeatable" flag */ - int i = ConfigFindByName(name); - if (i < 0) { + const ConfigOption o = ParseConfigOptionName(name); + if (o == CONF_MAX) { g_set_error(error_r, config_quark(), 0, "unrecognized parameter in config file at " "line %i: %s\n", count, name); @@ -318,6 +318,7 @@ ReadConfigFile(const Path &path, GError **error_r) return false; } + const unsigned i = ParseConfigOptionName(name); const ConfigTemplate &option = config_templates[i]; GSList *¶ms = config_params[i]; @@ -396,15 +397,9 @@ ReadConfigFile(const Path &path, GError **error_r) } const struct config_param * -config_get_next_param(const char *name, const struct config_param * last) +config_get_next_param(ConfigOption option, const struct config_param * last) { - struct config_param *param; - - int i = ConfigFindByName(name); - if (i < 0) - return NULL; - - GSList *node = config_params[i]; + GSList *node = config_params[unsigned(option)]; if (last) { node = g_slist_find(node, last); @@ -417,15 +412,15 @@ config_get_next_param(const char *name, const struct config_param * last) if (node == NULL) return NULL; - param = (struct config_param *)node->data; + struct config_param *param = (struct config_param *)node->data; param->used = true; return param; } const char * -config_get_string(const char *name, const char *default_value) +config_get_string(ConfigOption option, const char *default_value) { - const struct config_param *param = config_get_param(name); + const struct config_param *param = config_get_param(option); if (param == NULL) return default_value; @@ -434,28 +429,28 @@ config_get_string(const char *name, const char *default_value) } char * -config_dup_path(const char *name, GError **error_r) +config_dup_path(ConfigOption option, GError **error_r) { assert(error_r != NULL); assert(*error_r == NULL); - const struct config_param *param = config_get_param(name); + const struct config_param *param = config_get_param(option); if (param == NULL) return NULL; char *path = parsePath(param->value, error_r); if (G_UNLIKELY(path == NULL)) g_prefix_error(error_r, - "Invalid path in \"%s\" at line %i: ", - name, param->line); + "Invalid path at line %i: ", + param->line); return path; } unsigned -config_get_unsigned(const char *name, unsigned default_value) +config_get_unsigned(ConfigOption option, unsigned default_value) { - const struct config_param *param = config_get_param(name); + const struct config_param *param = config_get_param(option); long value; char *endptr; @@ -471,9 +466,9 @@ config_get_unsigned(const char *name, unsigned default_value) } unsigned -config_get_positive(const char *name, unsigned default_value) +config_get_positive(ConfigOption option, unsigned default_value) { - const struct config_param *param = config_get_param(name); + const struct config_param *param = config_get_param(option); long value; char *endptr; @@ -507,9 +502,10 @@ config_get_block_param(const struct config_param * param, const char *name) return NULL; } -bool config_get_bool(const char *name, bool default_value) +bool +config_get_bool(ConfigOption option, bool default_value) { - const struct config_param *param = config_get_param(name); + const struct config_param *param = config_get_param(option); bool success, value; if (param == NULL) @@ -517,9 +513,9 @@ bool config_get_bool(const char *name, bool default_value) success = get_bool(param->value, &value); if (!success) - MPD_ERROR("%s is not a boolean value (yes, true, 1) or " + MPD_ERROR("Expected boolean value (yes, true, 1) or " "(no, false, 0) on line %i\n", - name, param->line); + param->line); return value; } diff --git a/src/ConfigOption.hxx b/src/ConfigOption.hxx new file mode 100644 index 00000000..21a3a02e --- /dev/null +++ b/src/ConfigOption.hxx @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2003-2013 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPD_CONFIG_OPTION_HXX +#define MPD_CONFIG_OPTION_HXX + +#include "gcc.h" + +enum ConfigOption { + CONF_MUSIC_DIR, + CONF_PLAYLIST_DIR, + CONF_FOLLOW_INSIDE_SYMLINKS, + CONF_FOLLOW_OUTSIDE_SYMLINKS, + CONF_DB_FILE, + CONF_STICKER_FILE, + CONF_LOG_FILE, + CONF_PID_FILE, + CONF_STATE_FILE, + CONF_RESTORE_PAUSED, + CONF_USER, + CONF_GROUP, + CONF_BIND_TO_ADDRESS, + CONF_PORT, + CONF_LOG_LEVEL, + CONF_ZEROCONF_NAME, + CONF_ZEROCONF_ENABLED, + CONF_PASSWORD, + CONF_DEFAULT_PERMS, + CONF_AUDIO_OUTPUT, + CONF_AUDIO_OUTPUT_FORMAT, + CONF_MIXER_TYPE, + CONF_REPLAYGAIN, + CONF_REPLAYGAIN_PREAMP, + CONF_REPLAYGAIN_MISSING_PREAMP, + CONF_REPLAYGAIN_LIMIT, + CONF_VOLUME_NORMALIZATION, + CONF_SAMPLERATE_CONVERTER, + CONF_AUDIO_BUFFER_SIZE, + CONF_BUFFER_BEFORE_PLAY, + CONF_HTTP_PROXY_HOST, + CONF_HTTP_PROXY_PORT, + CONF_HTTP_PROXY_USER, + CONF_HTTP_PROXY_PASSWORD, + CONF_CONN_TIMEOUT, + CONF_MAX_CONN, + CONF_MAX_PLAYLIST_LENGTH, + CONF_MAX_COMMAND_LIST_SIZE, + CONF_MAX_OUTPUT_BUFFER_SIZE, + CONF_FS_CHARSET, + CONF_ID3V1_ENCODING, + CONF_METADATA_TO_USE, + CONF_SAVE_ABSOLUTE_PATHS, + CONF_DECODER, + CONF_INPUT, + CONF_GAPLESS_MP3_PLAYBACK, + CONF_PLAYLIST_PLUGIN, + CONF_AUTO_UPDATE, + CONF_AUTO_UPDATE_DEPTH, + CONF_DESPOTIFY_USER, + CONF_DESPOTIFY_PASSWORD, + CONF_DESPOTIFY_HIGH_BITRATE, + CONF_AUDIO_FILTER, + CONF_DATABASE, + CONF_MAX +}; + +/** + * @return #CONF_MAX if not found + */ +gcc_pure +enum ConfigOption +ParseConfigOptionName(const char *name); + +#endif diff --git a/src/ConfigTemplates.cxx b/src/ConfigTemplates.cxx new file mode 100644 index 00000000..27726ddb --- /dev/null +++ b/src/ConfigTemplates.cxx @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2003-2013 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "ConfigTemplates.hxx" +#include "ConfigOption.hxx" + +#include + +const ConfigTemplate config_templates[] = { + { "music_directory", false, false }, + { "playlist_directory", false, false }, + { "follow_inside_symlinks", false, false }, + { "follow_outside_symlinks", false, false }, + { "db_file", false, false }, + { "sticker_file", false, false }, + { "log_file", false, false }, + { "pid_file", false, false }, + { "state_file", false, false }, + { "restore_paused", false, false }, + { "user", false, false }, + { "group", false, false }, + { "bind_to_address", true, false }, + { "port", false, false }, + { "log_level", false, false }, + { "zeroconf_name", false, false }, + { "zeroconf_enabled", false, false }, + { "password", true, false }, + { "default_permissions", false, false }, + { "audio_output", true, true }, + { "audio_output_format", false, false }, + { "mixer_type", false, false }, + { "replaygain", false, false }, + { "replaygain_preamp", false, false }, + { "replaygain_missing_preamp", false, false }, + { "replaygain_limit", false, false }, + { "volume_normalization", false, false }, + { "samplerate_converter", false, false }, + { "audio_buffer_size", false, false }, + { "buffer_before_play", false, false }, + { "http_proxy_host", false, false }, + { "http_proxy_port", false, false }, + { "http_proxy_user", false, false }, + { "http_proxy_password", false, false }, + { "connection_timeout", false, false }, + { "max_connections", false, false }, + { "max_playlist_length", false, false }, + { "max_command_list_size", false, false }, + { "max_output_buffer_size", false, false }, + { "filesystem_charset", false, false }, + { "id3vtrue_encoding", false, false }, + { "metadata_to_use", false, false }, + { "save_absolute_paths_in_playlists", false, false }, + { "decoder", true, true }, + { "input", true, true }, + { "gapless_mp3_playback", false, false }, + { "playlist_plugin", true, true }, + { "auto_update", false, false }, + { "auto_update_depth", false, false }, + { "despotify_user", false, false }, + { "despotify_password", false, false}, + { "despotify_high_bitrate", false, false }, + { "filter", true, true }, + { "database", false, true }, +}; + +static constexpr unsigned n_config_templates = + sizeof(config_templates) / sizeof(config_templates[0]); + +static_assert(n_config_templates == unsigned(CONF_MAX), + "Wrong number of config_templates"); + +ConfigOption +ParseConfigOptionName(const char *name) +{ + for (unsigned i = 0; i < n_config_templates; ++i) + if (strcmp(config_templates[i].name, name) == 0) + return ConfigOption(i); + + return CONF_MAX; +} diff --git a/src/ConfigTemplates.hxx b/src/ConfigTemplates.hxx index 8592070c..4f546046 100644 --- a/src/ConfigTemplates.hxx +++ b/src/ConfigTemplates.hxx @@ -17,11 +17,10 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "gcc.h" +#ifndef MPD_CONFIG_TEMPLATES_HXX +#define MPD_CONFIG_TEMPLATES_HXX -#include - -#include +#include "ConfigOption.hxx" struct ConfigTemplate { const char *const name; @@ -29,70 +28,6 @@ struct ConfigTemplate { const bool block; }; -static constexpr struct ConfigTemplate config_templates[] = { - { CONF_MUSIC_DIR, false, false }, - { CONF_PLAYLIST_DIR, false, false }, - { CONF_FOLLOW_INSIDE_SYMLINKS, false, false }, - { CONF_FOLLOW_OUTSIDE_SYMLINKS, false, false }, - { CONF_DB_FILE, false, false }, - { CONF_STICKER_FILE, false, false }, - { CONF_LOG_FILE, false, false }, - { CONF_PID_FILE, false, false }, - { CONF_STATE_FILE, false, false }, - { "restore_paused", false, false }, - { CONF_USER, false, false }, - { CONF_GROUP, false, false }, - { CONF_BIND_TO_ADDRESS, true, false }, - { CONF_PORT, false, false }, - { CONF_LOG_LEVEL, false, false }, - { CONF_ZEROCONF_NAME, false, false }, - { CONF_ZEROCONF_ENABLED, false, false }, - { CONF_PASSWORD, true, false }, - { CONF_DEFAULT_PERMS, false, false }, - { CONF_AUDIO_OUTPUT, true, true }, - { CONF_AUDIO_OUTPUT_FORMAT, false, false }, - { CONF_MIXER_TYPE, false, false }, - { CONF_REPLAYGAIN, false, false }, - { CONF_REPLAYGAIN_PREAMP, false, false }, - { CONF_REPLAYGAIN_MISSING_PREAMP, false, false }, - { CONF_REPLAYGAIN_LIMIT, false, false }, - { CONF_VOLUME_NORMALIZATION, false, false }, - { CONF_SAMPLERATE_CONVERTER, false, false }, - { CONF_AUDIO_BUFFER_SIZE, false, false }, - { CONF_BUFFER_BEFORE_PLAY, false, false }, - { CONF_HTTP_PROXY_HOST, false, false }, - { CONF_HTTP_PROXY_PORT, false, false }, - { CONF_HTTP_PROXY_USER, false, false }, - { CONF_HTTP_PROXY_PASSWORD, false, false }, - { CONF_CONN_TIMEOUT, false, false }, - { CONF_MAX_CONN, false, false }, - { CONF_MAX_PLAYLIST_LENGTH, false, false }, - { CONF_MAX_COMMAND_LIST_SIZE, false, false }, - { CONF_MAX_OUTPUT_BUFFER_SIZE, false, false }, - { CONF_FS_CHARSET, false, false }, - { CONF_ID3V1_ENCODING, false, false }, - { CONF_METADATA_TO_USE, false, false }, - { CONF_SAVE_ABSOLUTE_PATHS, false, false }, - { CONF_DECODER, true, true }, - { CONF_INPUT, true, true }, - { CONF_GAPLESS_MP3_PLAYBACK, false, false }, - { CONF_PLAYLIST_PLUGIN, true, true }, - { CONF_AUTO_UPDATE, false, false }, - { CONF_AUTO_UPDATE_DEPTH, false, false }, - { CONF_DESPOTIFY_USER, false, false }, - { CONF_DESPOTIFY_PASSWORD, false, false}, - { CONF_DESPOTIFY_HIGH_BITRATE, false, false }, - { "filter", true, true }, - { "database", false, true }, -}; - -gcc_pure -static int -ConfigFindByName(const char *name) -{ - for (unsigned i = 0; i < G_N_ELEMENTS(config_templates); ++i) - if (strcmp(config_templates[i].name, name) == 0) - return i; +extern const ConfigTemplate config_templates[]; - return -1; -} +#endif diff --git a/src/Log.cxx b/src/Log.cxx index 76b36577..8a50e1ef 100644 --- a/src/Log.cxx +++ b/src/Log.cxx @@ -261,8 +261,7 @@ log_init(bool verbose, bool use_stdout, GError **error_r) return true; #else g_set_error(error_r, log_quark(), 0, - "config parameter \"%s\" not found", - CONF_LOG_FILE); + "config parameter 'log_file' not found"); return false; #endif #ifdef HAVE_SYSLOG diff --git a/src/Main.cxx b/src/Main.cxx index ecea5984..a22ee631 100644 --- a/src/Main.cxx +++ b/src/Main.cxx @@ -167,12 +167,11 @@ glue_mapper_init(GError **error_r) static bool glue_db_init_and_load(void) { - const struct config_param *param = config_get_param("database"); + const struct config_param *param = config_get_param(CONF_DATABASE); const struct config_param *path = config_get_param(CONF_DB_FILE); if (param != NULL && path != NULL) - g_message("Found both 'database' and '" CONF_DB_FILE - "' setting - ignoring the latter"); + g_message("Found both 'database' and 'db_file' setting - ignoring the latter"); GError *error = NULL; bool ret; @@ -180,10 +179,10 @@ glue_db_init_and_load(void) if (!mapper_has_music_directory()) { if (param != NULL) g_message("Found database setting without " - CONF_MUSIC_DIR " - disabling database"); + "music_directory - disabling database"); if (path != NULL) - g_message("Found " CONF_DB_FILE " setting without " - CONF_MUSIC_DIR " - disabling database"); + g_message("Found db_file setting without " + "music_directory - disabling database"); return true; } diff --git a/src/OutputInit.cxx b/src/OutputInit.cxx index 2890b3f2..4e352f28 100644 --- a/src/OutputInit.cxx +++ b/src/OutputInit.cxx @@ -91,7 +91,8 @@ audio_output_mixer_type(const struct config_param *param) /* fall back to the global "mixer_type" setting (also deprecated) */ - return mixer_type_parse(config_get_string("mixer_type", "hardware")); + return mixer_type_parse(config_get_string(CONF_MIXER_TYPE, + "hardware")); } static struct mixer * @@ -312,8 +313,7 @@ audio_output_new(const struct config_param *param, return nullptr; } } else { - g_warning("No \"%s\" defined in config file\n", - CONF_AUDIO_OUTPUT); + g_warning("No 'audio_output' defined in config file\n"); plugin = audio_output_detect(error_r); if (plugin == NULL) diff --git a/src/PlaylistState.cxx b/src/PlaylistState.cxx index 212b5286..d03de0a1 100644 --- a/src/PlaylistState.cxx +++ b/src/PlaylistState.cxx @@ -180,7 +180,7 @@ playlist_state_restore(const char *line, TextFile &file, current = 0; if (state == PLAYER_STATE_PLAY && - config_get_bool("restore_paused", false)) + config_get_bool(CONF_RESTORE_PAUSED, false)) /* the user doesn't want MPD to auto-start playback after startup; fall back to "pause" */ diff --git a/src/audio_config.c b/src/audio_config.c index fe7484fb..bae3c184 100644 --- a/src/audio_config.c +++ b/src/audio_config.c @@ -47,7 +47,6 @@ void initAudioConfig(void) ret = audio_format_parse(&configured_audio_format, param->value, true, &error); if (!ret) - MPD_ERROR("error parsing \"%s\" at line %i: %s", - CONF_AUDIO_OUTPUT_FORMAT, param->line, - error->message); + MPD_ERROR("error parsing line %i: %s", + param->line, error->message); } diff --git a/src/conf.h b/src/conf.h index ca60591d..61c6cd9f 100644 --- a/src/conf.h +++ b/src/conf.h @@ -20,62 +20,12 @@ #ifndef MPD_CONF_H #define MPD_CONF_H +#include "ConfigOption.hxx" +#include "gcc.h" + #include #include -#define CONF_MUSIC_DIR "music_directory" -#define CONF_PLAYLIST_DIR "playlist_directory" -#define CONF_FOLLOW_INSIDE_SYMLINKS "follow_inside_symlinks" -#define CONF_FOLLOW_OUTSIDE_SYMLINKS "follow_outside_symlinks" -#define CONF_DB_FILE "db_file" -#define CONF_STICKER_FILE "sticker_file" -#define CONF_LOG_FILE "log_file" -#define CONF_PID_FILE "pid_file" -#define CONF_STATE_FILE "state_file" -#define CONF_USER "user" -#define CONF_GROUP "group" -#define CONF_BIND_TO_ADDRESS "bind_to_address" -#define CONF_PORT "port" -#define CONF_LOG_LEVEL "log_level" -#define CONF_ZEROCONF_NAME "zeroconf_name" -#define CONF_ZEROCONF_ENABLED "zeroconf_enabled" -#define CONF_PASSWORD "password" -#define CONF_DEFAULT_PERMS "default_permissions" -#define CONF_AUDIO_OUTPUT "audio_output" -#define CONF_AUDIO_FILTER "filter" -#define CONF_AUDIO_OUTPUT_FORMAT "audio_output_format" -#define CONF_MIXER_TYPE "mixer_type" -#define CONF_REPLAYGAIN "replaygain" -#define CONF_REPLAYGAIN_PREAMP "replaygain_preamp" -#define CONF_REPLAYGAIN_MISSING_PREAMP "replaygain_missing_preamp" -#define CONF_REPLAYGAIN_LIMIT "replaygain_limit" -#define CONF_VOLUME_NORMALIZATION "volume_normalization" -#define CONF_SAMPLERATE_CONVERTER "samplerate_converter" -#define CONF_AUDIO_BUFFER_SIZE "audio_buffer_size" -#define CONF_BUFFER_BEFORE_PLAY "buffer_before_play" -#define CONF_HTTP_PROXY_HOST "http_proxy_host" -#define CONF_HTTP_PROXY_PORT "http_proxy_port" -#define CONF_HTTP_PROXY_USER "http_proxy_user" -#define CONF_HTTP_PROXY_PASSWORD "http_proxy_password" -#define CONF_CONN_TIMEOUT "connection_timeout" -#define CONF_MAX_CONN "max_connections" -#define CONF_MAX_PLAYLIST_LENGTH "max_playlist_length" -#define CONF_MAX_COMMAND_LIST_SIZE "max_command_list_size" -#define CONF_MAX_OUTPUT_BUFFER_SIZE "max_output_buffer_size" -#define CONF_FS_CHARSET "filesystem_charset" -#define CONF_ID3V1_ENCODING "id3v1_encoding" -#define CONF_METADATA_TO_USE "metadata_to_use" -#define CONF_SAVE_ABSOLUTE_PATHS "save_absolute_paths_in_playlists" -#define CONF_DECODER "decoder" -#define CONF_INPUT "input" -#define CONF_GAPLESS_MP3_PLAYBACK "gapless_mp3_playback" -#define CONF_PLAYLIST_PLUGIN "playlist_plugin" -#define CONF_AUTO_UPDATE "auto_update" -#define CONF_AUTO_UPDATE_DEPTH "auto_update_depth" -#define CONF_DESPOTIFY_USER "despotify_user" -#define CONF_DESPOTIFY_PASSWORD "despotify_password" -#define CONF_DESPOTIFY_HIGH_BITRATE "despotify_high_bitrate" - #define DEFAULT_PLAYLIST_MAX_LENGTH (1024*16) #define DEFAULT_PLAYLIST_SAVE_ABSOLUTE_PATHS false @@ -144,13 +94,14 @@ G_BEGIN_DECLS set _last_ to NULL to get first entry */ G_GNUC_PURE const struct config_param * -config_get_next_param(const char *name, const struct config_param *last); +config_get_next_param(enum ConfigOption option, + const struct config_param *last); G_GNUC_PURE static inline const struct config_param * -config_get_param(const char *name) +config_get_param(enum ConfigOption option) { - return config_get_next_param(name, NULL); + return config_get_next_param(option, NULL); } /* Note on G_GNUC_PURE: Some of the functions declared pure are not @@ -162,7 +113,7 @@ config_get_param(const char *name) G_GNUC_PURE const char * -config_get_string(const char *name, const char *default_value); +config_get_string(enum ConfigOption option, const char *default_value); /** * Returns an optional configuration variable which contains an @@ -174,22 +125,22 @@ config_get_string(const char *name, const char *default_value); */ G_GNUC_MALLOC char * -config_dup_path(const char *name, GError **error_r); +config_dup_path(enum ConfigOption option, GError **error_r); G_GNUC_PURE unsigned -config_get_unsigned(const char *name, unsigned default_value); +config_get_unsigned(enum ConfigOption option, unsigned default_value); G_GNUC_PURE unsigned -config_get_positive(const char *name, unsigned default_value); +config_get_positive(enum ConfigOption option, unsigned default_value); G_GNUC_PURE const struct block_param * config_get_block_param(const struct config_param *param, const char *name); G_GNUC_PURE -bool config_get_bool(const char *name, bool default_value); +bool config_get_bool(enum ConfigOption option, bool default_value); G_GNUC_PURE const char * -- cgit v1.2.3