aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Lindner <mark.a.lindner@gmail.com>2022-11-22 14:25:57 -0700
committerMark Lindner <mark.a.lindner@gmail.com>2022-11-22 14:25:57 -0700
commitcca09fa1115512fd7b68a170e18c20d0843e8066 (patch)
tree857fdc924a896002d4f2834c0cc88a7357be9630
parent5ff6aecbdb7f85a8e7a2ea7fd63c03b4bdd42076 (diff)
downloadlibconfig-cca09fa1115512fd7b68a170e18c20d0843e8066.tar.gz
Fixed some constness inconsistencies in lookup APIs.
Also check for NULL name in lookup functions.
-rw-r--r--doc/libconfig.texi18
-rw-r--r--lib/libconfig.c27
-rw-r--r--lib/libconfig.h7
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);