aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libutil/str_util.c37
-rw-r--r--src/libutil/str_util.h11
2 files changed, 48 insertions, 0 deletions
diff --git a/src/libutil/str_util.c b/src/libutil/str_util.c
index bccb0699f..7a94a4df1 100644
--- a/src/libutil/str_util.c
+++ b/src/libutil/str_util.c
@@ -1940,6 +1940,43 @@ decode:
return (o - out);
}
+gssize
+rspamd_encode_qp2047_buf (const gchar *in, gsize inlen,
+ gchar *out, gsize outlen)
+{
+ gchar *o = out, *end = out + outlen, c;
+ static const gchar hexdigests[16] = "0123456789ABCDEF";
+
+ while (inlen > 0 && o < end) {
+ c = *in;
+
+ if (g_ascii_isalnum (c)) {
+ *o++ = c;
+ }
+ else if (c == ' ') {
+ *o++ = "_";
+ in++;
+ }
+ else if (end - o >= 3){
+ *o++ = '=';
+ *o++ = hexdigests[((c >> 4) & 0xF)];
+ *o++ = hexdigests[(c & 0xF)];
+ }
+ else {
+ return (-1);
+ }
+
+ in ++;
+ inlen --;
+ }
+
+ if (inlen != 0) {
+ return (-1);
+ }
+
+ return (o - out);
+}
+
/*
* GString ucl emitting functions
diff --git a/src/libutil/str_util.h b/src/libutil/str_util.h
index 2c9905e13..094a6498c 100644
--- a/src/libutil/str_util.h
+++ b/src/libutil/str_util.h
@@ -234,6 +234,17 @@ gssize rspamd_decode_qp_buf (const gchar *in, gsize inlen,
gssize rspamd_decode_qp2047_buf (const gchar *in, gsize inlen,
gchar *out, gsize outlen);
+/**
+ * Encode quoted-printable buffer using rfc2047 format, input and output must not overlap
+ * @param in
+ * @param inlen
+ * @param out
+ * @param outlen
+ * @return
+ */
+gssize rspamd_encode_qp2047_buf (const gchar *in, gsize inlen,
+ gchar *out, gsize outlen);
+
#ifndef g_tolower
# define g_tolower(x) (((x) >= 'A' && (x) <= 'Z') ? (x) - 'A' + 'a' : (x))
#endif