]> source.dussan.org Git - rspamd.git/commitdiff
Add emitting of ucl object to rspamd_fstring_t.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 7 Oct 2015 13:24:15 +0000 (14:24 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 7 Oct 2015 13:24:15 +0000 (14:24 +0100)
src/libutil/fstring.c
src/libutil/fstring.h
src/libutil/str_util.c
src/libutil/str_util.h
src/libutil/util.c
src/libutil/util.h

index e63912c9a28927b63e9ec2d12021a899a29f9cf6..32fabcea42672c9b4eba249caaca3bf004cd612c 100644 (file)
@@ -144,6 +144,22 @@ rspamd_fstring_append (rspamd_fstring_t *str, const char *in, gsize len)
        return str;
 }
 
+rspamd_fstring_t *
+rspamd_fstring_append_chars (rspamd_fstring_t *str,
+               char c, gsize len)
+{
+       gsize avail = fstravail (str);
+
+       if (avail < len) {
+               str = rspamd_fstring_grow (str, len);
+       }
+
+       memset (str->str + str->len, c, len);
+       str->len += len;
+
+       return str;
+}
+
 void
 rspamd_fstring_erase (rspamd_fstring_t *str, gsize pos, gsize len)
 {
@@ -329,4 +345,16 @@ rspamd_fstring_mapped_ftok_free (gpointer p)
        storage = (rspamd_fstring_t *) (tok->begin - 2 * sizeof (gsize));
        rspamd_fstring_free (storage);
        g_slice_free1 (sizeof (*tok), tok);
+}
+
+rspamd_ftok_t *
+rspamd_ftok_map (const rspamd_fstring_t *s)
+{
+       rspamd_ftok_t *tok;
+
+       g_assert (s != NULL);
+
+       tok = g_slice_alloc (sizeof (*tok));
+       tok->begin = s->str;
+       tok->len = s->len;
 }
\ No newline at end of file
index 5ca74f4576638d2893175fc0607852df0ea32d5e..d3b51821f38eafdfe34f87503ebf955d766e5fe9 100644 (file)
@@ -80,6 +80,11 @@ void rspamd_fstring_free (rspamd_fstring_t *str);
 rspamd_fstring_t* rspamd_fstring_append (rspamd_fstring_t *str,
                const char *in, gsize len) G_GNUC_WARN_UNUSED_RESULT;
 
+/**
+ * Append `len` repeated chars `c` to string `str`
+ */
+rspamd_fstring_t *rspamd_fstring_append_chars (rspamd_fstring_t *str,
+               char c, gsize len) G_GNUC_WARN_UNUSED_RESULT;
 
 /**
  * Erase `len` characters at postion `pos`
@@ -138,4 +143,9 @@ gint rspamd_ftok_cmp (const rspamd_ftok_t *s1,
  */
 void rspamd_fstring_mapped_ftok_free (gpointer p);
 
+/**
+ * Map token to a specified string. Token must be freed using g_slice_free1
+ */
+rspamd_ftok_t *rspamd_ftok_map (const rspamd_fstring_t *s);
+
 #endif
index ffed9893dbcca39040ccb6fbbfa2696f87948a6c..82d4acfa39692e5a60a7d7e5f19c5d4a4ba9cc1f 100644 (file)
@@ -1226,3 +1226,151 @@ rspamd_string_find_eoh (GString *input)
 
        return -1;
 }
+
+/*
+ * GString ucl emitting functions
+ */
+static int
+rspamd_gstring_append_character (unsigned char c, size_t len, void *ud)
+{
+       GString *buf = ud;
+       gsize old_len;
+
+       if (len == 1) {
+               g_string_append_c (buf, c);
+       }
+       else {
+               if (buf->allocated_len - buf->len <= len) {
+                       old_len = buf->len;
+                       g_string_set_size (buf, buf->len + len + 1);
+                       buf->len = old_len;
+               }
+               memset (&buf->str[buf->len], c, len);
+               buf->len += len;
+       }
+
+       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);
+}
+
+/*
+ * FString ucl emitting functions
+ */
+static int
+rspamd_fstring_emit_append_character (unsigned char c, size_t len, void *ud)
+{
+       rspamd_fstring_t **buf = ud;
+
+       *buf = rspamd_fstring_append_chars (*buf, c, len);
+
+       return 0;
+}
+
+static int
+rspamd_fstring_emit_append_len (const unsigned char *str, size_t len, void *ud)
+{
+       rspamd_fstring_t **buf = ud;
+
+       *buf = rspamd_fstring_append (*buf, str, len);
+
+       return 0;
+}
+
+static int
+rspamd_fstring_emit_append_int (int64_t val, void *ud)
+{
+       rspamd_fstring_t **buf = ud;
+
+       rspamd_printf_fstring (buf, "%L", (intmax_t) val);
+       return 0;
+}
+
+static int
+rspamd_fstring_emit_append_double (double val, void *ud)
+{
+       rspamd_fstring_t **buf = ud;
+       const double delta = 0.0000001;
+
+       if (val == (double)((gint) val)) {
+               rspamd_printf_fstring (buf, "%.1f", val);
+       }
+       else if (fabs (val - (double) (int) val) < delta) {
+               /* Write at maximum precision */
+               rspamd_printf_fstring (buf, "%.*g", DBL_DIG, val);
+       }
+       else {
+               rspamd_printf_fstring (buf, "%f", val);
+       }
+
+       return 0;
+}
+
+void
+rspamd_ucl_emit_fstring (ucl_object_t *obj,
+               enum ucl_emitter emit_type,
+               rspamd_fstring_t **buf)
+{
+       struct ucl_emitter_functions func = {
+                       .ucl_emitter_append_character = rspamd_fstring_emit_append_character,
+                       .ucl_emitter_append_len = rspamd_fstring_emit_append_len,
+                       .ucl_emitter_append_int = rspamd_fstring_emit_append_int,
+                       .ucl_emitter_append_double = rspamd_fstring_emit_append_double
+       };
+
+       func.ud = buf;
+       ucl_object_emit_full (obj, emit_type, &func);
+}
index 801bcc10949399adabbd121f7235a4be9c749d18..2f822d97c29b2760e85bb6e91d52510b59e64433 100644 (file)
@@ -197,4 +197,24 @@ goffset rspamd_substring_search (const gchar *in, gsize inlen,
  */
 goffset rspamd_string_find_eoh (GString *input);
 
+/**
+ * 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);
+
+/**
+ * Emit UCL object to fstring
+ * @param obj object to emit
+ * @param emit_type emitter type
+ * @param target target string
+ */
+void rspamd_ucl_emit_fstring (ucl_object_t *obj,
+               enum ucl_emitter emit_type,
+               rspamd_fstring_t **target);
+
 #endif /* SRC_LIBUTIL_STR_UTIL_H_ */
index fd66cc321a9353d23115c0038d4e7ac4da0f0f9c..5706a2f4988df455f7c2d5a11d8ebccbeb249d65 100644 (file)
@@ -1743,86 +1743,6 @@ restart:
 #endif
 }
 
-/*
- * GString ucl emitting functions
- */
-static int
-rspamd_gstring_append_character (unsigned char c, size_t len, void *ud)
-{
-       GString *buf = ud;
-       gsize old_len;
-
-       if (len == 1) {
-               g_string_append_c (buf, c);
-       }
-       else {
-               if (buf->allocated_len - buf->len <= len) {
-                       old_len = buf->len;
-                       g_string_set_size (buf, buf->len + len + 1);
-                       buf->len = old_len;
-               }
-               memset (&buf->str[buf->len], c, len);
-               buf->len += len;
-       }
-
-       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);
-}
-
 gdouble
 rspamd_get_ticks (void)
 {
index df1c30e7d66bd56889013f739f10ad25b823d916..7efb728b166b6664f4d03eceed3af05917ae5d97 100644 (file)
@@ -335,16 +335,6 @@ void rspamd_hash_table_copy (GHashTable *src, GHashTable *dst,
  */
 gint rspamd_read_passphrase (gchar *buf, gint size, gint rwflag, gpointer key);
 
-/**
- * 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);
-
 /**
  * Portably return the current clock ticks as seconds
  * @return