From 76dad93fd2f437167af999787168e1c3aae398ef Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 2 Jan 2016 17:37:28 +0000 Subject: [PATCH] Add method to insert documentation to the specific path --- src/libserver/cfg_rcl.c | 47 +++++++++++++++++++++++++++++++++++++++++ src/libserver/cfg_rcl.h | 12 +++++++++++ 2 files changed, 59 insertions(+) diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c index 44e84acea..a493e9c32 100644 --- a/src/libserver/cfg_rcl.c +++ b/src/libserver/cfg_rcl.c @@ -3063,3 +3063,50 @@ rspamd_rcl_add_doc_obj (ucl_object_t *doc_target, return doc_obj; } + +ucl_object_t * +rspamd_rcl_add_doc_by_path (struct rspamd_config *cfg, + const gchar *doc_path, + const char *doc_string, + const char *doc_name, + ucl_type_t type, + rspamd_rcl_default_handler_t handler, + gint flags) +{ + const ucl_object_t *found, *cur; + ucl_object_t *obj; + gchar **path_components, **comp; + + found = ucl_lookup_path (cfg->doc_strings, doc_path); + + if (found != NULL) { + return rspamd_rcl_add_doc_obj ((ucl_object_t *)found, + doc_string, doc_name, type, handler, flags); + } + + /* Otherwise we need to insert all components of the path */ + path_components = g_strsplit_set (doc_path, ".", -1); + cur = cfg->doc_strings; + + for (comp = path_components; *comp != NULL; comp ++) { + if (ucl_object_type (cur) != UCL_OBJECT) { + msg_err_config ("Bad path while lookup for '%s' at %s", + doc_path, *comp); + return NULL; + } + + found = ucl_object_find_key (cur, *comp); + + if (found == NULL) { + obj = ucl_object_typed_new (UCL_OBJECT); + ucl_object_insert_key ((ucl_object_t *)cur, obj, *comp, 0, true); + cur = obj; + } + else { + cur = found; + } + } + + return rspamd_rcl_add_doc_obj ((ucl_object_t *) cur, + doc_string, doc_name, type, handler, flags); +} diff --git a/src/libserver/cfg_rcl.h b/src/libserver/cfg_rcl.h index 38f545825..b114e765c 100644 --- a/src/libserver/cfg_rcl.h +++ b/src/libserver/cfg_rcl.h @@ -358,4 +358,16 @@ ucl_object_t* rspamd_rcl_add_doc_obj (ucl_object_t *doc_target, ucl_type_t type, rspamd_rcl_default_handler_t handler, gint flags); + +/** + * Adds new documentation option specified by path `doc_path` that should be + * splitted by dots + */ +ucl_object_t *rspamd_rcl_add_doc_by_path (struct rspamd_config *cfg, + const gchar *doc_path, + const char *doc_string, + const char *doc_name, + ucl_type_t type, + rspamd_rcl_default_handler_t handler, + gint flags); #endif /* CFG_RCL_H_ */ -- 2.39.5