quoted-printable.c revision 1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainenvoid quoted_printable_decode(const unsigned char *src, size_t src_size,
baf346e71ebd7b44fcba4b48f4d39845453b778bTimo Sirainen for (src_pos = 0; src_pos < src_size; src_pos++) {
8a8a3b43987b5ade914f22765e51c9e3de8179d3Timo Sirainen if (src[src_pos] != '=' && src[src_pos] != '\n')
2f4f603d4cebab2cc956c72164efb02da83515c5Timo Sirainen /* drop trailing whitespace */
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen while (pos > 0 && QP_IS_TRAILING_SPACE(src[pos-1]))
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen buffer_append(dest, src + next, src_pos - next);
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen /* =\n -> skip both */
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen if (src[src_pos+1] == '\r' && src[src_pos+2] == '\n') {
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen /* =\r\n -> skip both */
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen /* non-hex data, show as-is */
e245fb1302121d2bc2580f61e040c2c8a558ee9eTimo Sirainen /* add everything but trailing spaces */
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen while (src_pos > 0 && QP_IS_TRAILING_SPACE(src[src_pos-1]))
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen buffer_append(dest, src + next, src_pos - next);
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainenvoid quoted_printable_q_decode(const unsigned char *src, size_t src_size,
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen for (src_pos = 0; src_pos < src_size; src_pos++) {
d5e839aea288aceaddae28a1578cebda3c9e3b58Timo Sirainen if (src[src_pos] != '_' && src[src_pos] != '=')
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen buffer_append(dest, src + next, src_pos - next);
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen /* non-hex data, show as-is */