diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libutil/str_util.c | 37 | ||||
-rw-r--r-- | src/libutil/str_util.h | 11 |
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 |