aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-12-20 16:46:28 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-12-20 17:14:17 +0000
commit8add4deb4fe88fe04b4469601bbe477c96cefdf3 (patch)
treeca96e7b127a58cb3a9e37d2a5fb9d1608401969e /src
parent8bbf0b3b4894c5b683fc3b7f705044a481125c51 (diff)
downloadrspamd-8add4deb4fe88fe04b4469601bbe477c96cefdf3.tar.gz
rspamd-8add4deb4fe88fe04b4469601bbe477c96cefdf3.zip
[Minor] Add function to perform quoted-printable encoding
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