From 8add4deb4fe88fe04b4469601bbe477c96cefdf3 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 20 Dec 2016 16:46:28 +0000 Subject: [PATCH] [Minor] Add function to perform quoted-printable encoding --- src/libutil/str_util.c | 37 +++++++++++++++++++++++++++++++++++++ src/libutil/str_util.h | 11 +++++++++++ 2 files changed, 48 insertions(+) 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 -- 2.39.5