]> source.dussan.org Git - rspamd.git/commitdiff
Add string list fields parser.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 30 Aug 2013 12:59:21 +0000 (13:59 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 30 Aug 2013 12:59:21 +0000 (13:59 +0100)
src/cfg_rcl.c
src/cfg_rcl.h

index f2f48f912e355eb8935011513ed36a5e2708bd35..b094b04acfdfe4e84c4cb385e8533d5537821bf3 100644 (file)
@@ -403,3 +403,48 @@ rspamd_rcl_parse_struct_time (struct config_file *cfg, rspamd_cl_object_t *obj,
 
        return TRUE;
 }
+
+gboolean
+rspamd_rcl_parse_struct_string_list (struct config_file *cfg, rspamd_cl_object_t *obj,
+               gpointer ud, struct rspamd_rcl_section *section, GError **err)
+{
+       struct rspamd_rcl_struct_parser *pd = ud;
+       GList **target;
+       gchar *val;
+       rspamd_cl_object_t *cur;
+       const gsize num_str_len = 32;
+
+       target = (GList **)(((gchar *)pd->user_struct) + pd->offset);
+
+       if (obj->type != RSPAMD_CL_ARRAY) {
+               g_set_error (err, CFG_RCL_ERROR, EINVAL, "an array of strings is expected");
+               return FALSE;
+       }
+
+       for (cur = obj; cur != NULL; cur = cur->next) {
+               switch (cur->type) {
+               case RSPAMD_CL_STRING:
+                       /* Direct assigning is safe, as curect is likely linked to the cfg mem_pool */
+                       val = cur->value.sv;
+                       break;
+               case RSPAMD_CL_INT:
+                       val = memory_pool_alloc (cfg->cfg_pool, num_str_len);
+                       rspamd_snprintf (val, num_str_len, "%L", cur->value.iv);
+                       break;
+               case RSPAMD_CL_FLOAT:
+                       val = memory_pool_alloc (cfg->cfg_pool, num_str_len);
+                       rspamd_snprintf (val, num_str_len, "%f", cur->value.dv);
+                       break;
+               case RSPAMD_CL_BOOLEAN:
+                       val = memory_pool_alloc (cfg->cfg_pool, num_str_len);
+                       rspamd_snprintf (val, num_str_len, "%b", (gboolean)cur->value.iv);
+                       break;
+               default:
+                       g_set_error (err, CFG_RCL_ERROR, EINVAL, "cannot convert an object or array to string");
+                       return FALSE;
+               }
+               *target = g_list_prepend (*target, val);
+       }
+
+       return TRUE;
+}
index 8c77009a29c6041280b7593e5cb161ab50729ac1..283e84d823dbdef53559b92e8c4bf163d29ddba6 100644 (file)
@@ -149,4 +149,16 @@ gboolean rspamd_rcl_parse_struct_double (struct config_file *cfg, rspamd_cl_obje
 gboolean rspamd_rcl_parse_struct_time (struct config_file *cfg, rspamd_cl_object_t *obj,
                gpointer ud, struct rspamd_rcl_section *section, GError **err);
 
+/**
+ * Parse a string list field of a structure presented by a GList* object
+ * @param cfg config pointer
+ * @param obj object to parse
+ * @param ud struct_parser structure (flags mean the exact structure used)
+ * @param section the current section
+ * @param err error pointer
+ * @return TRUE if a value has been successfully parsed
+ */
+gboolean rspamd_rcl_parse_struct_string_list (struct config_file *cfg, rspamd_cl_object_t *obj,
+               gpointer ud, struct rspamd_rcl_section *section, GError **err);
+
 #endif /* CFG_RCL_H_ */