diff options
author | Mark Lindner <mark.a.lindner@gmail.com> | 2022-11-22 14:25:57 -0700 |
---|---|---|
committer | Mark Lindner <mark.a.lindner@gmail.com> | 2022-11-22 14:25:57 -0700 |
commit | cca09fa1115512fd7b68a170e18c20d0843e8066 (patch) | |
tree | 857fdc924a896002d4f2834c0cc88a7357be9630 | |
parent | 5ff6aecbdb7f85a8e7a2ea7fd63c03b4bdd42076 (diff) | |
download | libconfig-cca09fa1115512fd7b68a170e18c20d0843e8066.tar.gz |
Fixed some constness inconsistencies in lookup APIs.
Also check for NULL name in lookup functions.
-rw-r--r-- | doc/libconfig.texi | 18 | ||||
-rw-r--r-- | lib/libconfig.c | 27 | ||||
-rw-r--r-- | lib/libconfig.h | 7 |
3 files changed, 47 insertions, 5 deletions
diff --git a/doc/libconfig.texi b/doc/libconfig.texi index cf0e434..24dc1f1 100644 --- a/doc/libconfig.texi +++ b/doc/libconfig.texi @@ -1075,6 +1075,15 @@ setting was not found. @end deftypefun +@deftypefun {const config_setting_t *} config_lookup_const (@w{const config_t * @var{config}}, @w{const char * @var{path}}) + +@b{Since @i{v1.7.4}} + +This function is identical to @code{config_lookup()}, except that the +setting is returned as a @code{const} structure. + +@end deftypefun + @deftypefun {config_setting_t *} config_setting_lookup (@w{const config_setting_t * @var{setting}}, @w{const char * @var{path}}) This function locates a setting by a path @var{path} relative to @@ -1084,6 +1093,15 @@ setting was not found. @end deftypefun +@deftypefun {const config_setting_t *} config_setting_lookup_const (@w{const config_setting_t * @var{setting}}, @w{const char * @var{path}}) + +@b{Since @i{v1.7.4}} + +This function is identical to @code{config_setting_lookup()}, except that the +setting is returned as a @code{const} structure. + +@end deftypefun + @deftypefun int config_setting_get_int (@w{const config_setting_t * @var{setting}}) @deftypefunx {long long} config_setting_get_int64 (@w{const config_setting_t * @var{setting}}) @deftypefunx double config_setting_get_float (@w{const config_setting_t * @var{setting}}) diff --git a/lib/libconfig.c b/lib/libconfig.c index 2c84a9d..f6fefb8 100644 --- a/lib/libconfig.c +++ b/lib/libconfig.c @@ -1199,11 +1199,11 @@ unsigned short config_setting_get_format(const config_setting_t *setting) /* ------------------------------------------------------------------------- */ -config_setting_t *config_setting_lookup(config_setting_t *setting, - const char *path) +const config_setting_t *config_setting_lookup_const( + const config_setting_t *setting, const char *path) { const char *p = path; - config_setting_t *found = setting; + const config_setting_t *found = setting; while(*p && found) { @@ -1240,6 +1240,14 @@ config_setting_t *config_setting_lookup(config_setting_t *setting, /* ------------------------------------------------------------------------- */ +config_setting_t *config_setting_lookup(const config_setting_t *setting, + const char *path) +{ + return((config_setting_t *)config_setting_lookup_const(setting, path)); +} + +/* ------------------------------------------------------------------------- */ + config_setting_t *config_lookup(const config_t *config, const char *path) { return(config_setting_lookup(config->root, path)); @@ -1247,6 +1255,14 @@ config_setting_t *config_lookup(const config_t *config, const char *path) /* ------------------------------------------------------------------------- */ +const config_setting_t *config_lookup_const(const config_t *config, + const char *path) +{ + return(config_setting_lookup(config->root, path)); +} + +/* ------------------------------------------------------------------------- */ + int config_lookup_string(const config_t *config, const char *path, const char **value) { @@ -1554,6 +1570,9 @@ config_setting_t *config_setting_get_member(const config_setting_t *setting, if(setting->type != CONFIG_TYPE_GROUP) return(NULL); + if(!name) + return(NULL); + return(__config_list_search(setting->value.list, name, strlen(name), NULL)); } @@ -1642,7 +1661,7 @@ int config_setting_remove(config_setting_t *parent, const char *name) const char *settingName; const char *lastFound; - if(! parent) + if(! parent || !name) return(CONFIG_FALSE); if(parent->type != CONFIG_TYPE_GROUP) diff --git a/lib/libconfig.h b/lib/libconfig.h index a67ce77..d8288da 100644 --- a/lib/libconfig.h +++ b/lib/libconfig.h @@ -306,8 +306,13 @@ extern LIBCONFIG_API void config_setting_set_hook(config_setting_t *setting, extern LIBCONFIG_API config_setting_t *config_lookup(const config_t *config, const char *path); +extern LIBCONFIG_API const config_setting_t *config_lookup_const( + const config_t *config, const char *path); + extern LIBCONFIG_API config_setting_t *config_setting_lookup( - config_setting_t *setting, const char *path); + const config_setting_t *setting, const char *path); +extern LIBCONFIG_API const config_setting_t *config_setting_lookup_const( + const config_setting_t *setting, const char *path); extern LIBCONFIG_API int config_lookup_int(const config_t *config, const char *path, int *value); |