]> source.dussan.org Git - rspamd.git/commitdiff
Make gstring emitting generic.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 28 Jan 2014 16:22:17 +0000 (16:22 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 28 Jan 2014 16:22:17 +0000 (16:22 +0000)
src/protocol.c
src/util.c
src/util.h

index 2b7f03b5b6550d298bd48c1d3f490bae80c0210c..345723fb980f01632523754b6f40b6567fbe1337 100644 (file)
@@ -650,68 +650,6 @@ rspamd_metric_result_ucl (struct worker_task *task, struct metric_result *mres,
        return obj;
 }
 
-/*
- * GString ucl emitting functions
- */
-static int
-rspamd_gstring_append_character (unsigned char c, size_t len, void *ud)
-{
-       GString *buf = ud;
-
-       if (len == 1) {
-               g_string_append_c (buf, c);
-       }
-       else {
-               if (buf->allocated_len - buf->len <= len) {
-                       g_string_set_size (buf, buf->len + len + 1);
-               }
-               memset (&buf->str[buf->len], c, len);
-               buf->len += len;
-               buf->str[buf->len] = '\0';
-       }
-
-       return 0;
-}
-
-static int
-rspamd_gstring_append_len (const unsigned char *str, size_t len, void *ud)
-{
-       GString *buf = ud;
-
-       g_string_append_len (buf, str, len);
-
-       return 0;
-}
-
-static int
-rspamd_gstring_append_int (int64_t val, void *ud)
-{
-       GString *buf = ud;
-
-       rspamd_printf_gstring (buf, "%L", (intmax_t)val);
-       return 0;
-}
-
-static int
-rspamd_gstring_append_double (double val, void *ud)
-{
-       GString *buf = ud;
-       const double delta = 0.0000001;
-
-       if (val == (double)(int)val) {
-               rspamd_printf_gstring (buf, "%.1f", val);
-       }
-       else if (fabs (val - (double)(int)val) < delta) {
-               /* Write at maximum precision */
-               rspamd_printf_gstring (buf, "%.*g", DBL_DIG, val);
-       }
-       else {
-               rspamd_printf_gstring (buf, "%f", val);
-       }
-
-       return 0;
-}
-
 static void
 write_check_reply (struct rspamd_http_message *msg, struct worker_task *task)
 {
@@ -720,12 +658,6 @@ write_check_reply (struct rspamd_http_message *msg, struct worker_task *task)
        GHashTableIter                   hiter;
        gpointer                         h, v;
        ucl_object_t                    *top = NULL, *obj;
-       struct ucl_emitter_functions func = {
-               .ucl_emitter_append_character = rspamd_gstring_append_character,
-               .ucl_emitter_append_len = rspamd_gstring_append_len,
-               .ucl_emitter_append_int = rspamd_gstring_append_int,
-               .ucl_emitter_append_double = rspamd_gstring_append_double
-       };
 
        /* Output the first line - check status */
        logbuf = g_string_sized_new (BUFSIZ);
@@ -762,8 +694,8 @@ write_check_reply (struct rspamd_http_message *msg, struct worker_task *task)
        g_string_free (logbuf, TRUE);
 
        msg->body = g_string_sized_new (BUFSIZ);
-       func.ud = msg->body;
-       ucl_object_emit_full (top, UCL_EMIT_JSON_COMPACT, &func);
+
+       rspamd_ucl_emit_gstring (top, UCL_EMIT_JSON_COMPACT, msg->body);
        ucl_object_unref (top);
 
        /* Increase counters */
index 65f3b106b6b6a3416b8a0e3631cec0a2ec9b7eff..3bf98a5362858f3648a85d11acaf206252325c82 100644 (file)
@@ -2177,6 +2177,82 @@ rspamd_ip_is_valid (void *ptr, int af)
        return ret;
 }
 
+/*
+ * GString ucl emitting functions
+ */
+static int
+rspamd_gstring_append_character (unsigned char c, size_t len, void *ud)
+{
+       GString *buf = ud;
+
+       if (len == 1) {
+               g_string_append_c (buf, c);
+       }
+       else {
+               if (buf->allocated_len - buf->len <= len) {
+                       g_string_set_size (buf, buf->len + len + 1);
+               }
+               memset (&buf->str[buf->len], c, len);
+               buf->len += len;
+               buf->str[buf->len] = '\0';
+       }
+
+       return 0;
+}
+
+static int
+rspamd_gstring_append_len (const unsigned char *str, size_t len, void *ud)
+{
+       GString *buf = ud;
+
+       g_string_append_len (buf, str, len);
+
+       return 0;
+}
+
+static int
+rspamd_gstring_append_int (int64_t val, void *ud)
+{
+       GString *buf = ud;
+
+       rspamd_printf_gstring (buf, "%L", (intmax_t)val);
+       return 0;
+}
+
+static int
+rspamd_gstring_append_double (double val, void *ud)
+{
+       GString *buf = ud;
+       const double delta = 0.0000001;
+
+       if (val == (double)(int)val) {
+               rspamd_printf_gstring (buf, "%.1f", val);
+       }
+       else if (fabs (val - (double)(int)val) < delta) {
+               /* Write at maximum precision */
+               rspamd_printf_gstring (buf, "%.*g", DBL_DIG, val);
+       }
+       else {
+               rspamd_printf_gstring (buf, "%f", val);
+       }
+
+       return 0;
+}
+
+void
+rspamd_ucl_emit_gstring (ucl_object_t *obj, enum ucl_emitter emit_type, GString *target)
+{
+       struct ucl_emitter_functions func = {
+               .ucl_emitter_append_character = rspamd_gstring_append_character,
+               .ucl_emitter_append_len = rspamd_gstring_append_len,
+               .ucl_emitter_append_int = rspamd_gstring_append_int,
+               .ucl_emitter_append_double = rspamd_gstring_append_double
+       };
+
+       func.ud = target;
+       ucl_object_emit_full (obj, emit_type, &func);
+}
+
 /*
  * vi:ts=4
  */
index 9b7891c05d6202606a1e89d97595af4d512e84c0..2f33e91ee510a3276c955ec887ab0418fc6c3ee8 100644 (file)
@@ -7,6 +7,7 @@
 #include "statfile.h"
 #include "printf.h"
 #include "fstring.h"
+#include "ucl.h"
 
 struct config_file;
 struct rspamd_main;
@@ -457,4 +458,12 @@ void rspamd_random_bytes (gchar *buf, gsize buflen);
  */
 gboolean rspamd_ip_is_valid (void *ptr, int af);
 
+/**
+ * Emit UCL object to gstring
+ * @param obj object to emit
+ * @param emit_type emitter type
+ * @param target target string
+ */
+void rspamd_ucl_emit_gstring (ucl_object_t *obj, enum ucl_emitter emit_type, GString *target);
+
 #endif