|
|
@ -28,6 +28,28 @@ namespace qp |
|
|
|
|
|
|
|
const char* const hexdigit = "0123456789ABCDEF"; |
|
|
|
|
|
|
|
static const int8_t OK = 0; |
|
|
|
const int8_t allowed[256] = { |
|
|
|
// 1 2 3 4 5 6 7 8 9 A B C D E F
|
|
|
|
__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 0x00 .. 0x0F
|
|
|
|
__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 0x10 .. 0x1F
|
|
|
|
__, OK, __, __, OK, __, __, __, __, __, __, __, __, OK, OK, OK, // 0x20 .. 0x2F
|
|
|
|
OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, __, __, __, __, __, __, // 0x30 .. 0x3F 0x3D = '='
|
|
|
|
__, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, // 0x40 .. 0x4F
|
|
|
|
OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, __, __, __, OK, __, // 0x50 .. 0x5F
|
|
|
|
__, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, // 0x60 .. 0x6F
|
|
|
|
OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, OK, __, // 0x70 .. 0x7F
|
|
|
|
__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 0x80 .. 0x8F
|
|
|
|
__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 0x90 .. 0x9F
|
|
|
|
__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 0xA0 .. 0xAF
|
|
|
|
__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 0xB0 .. 0xBF
|
|
|
|
__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 0xC0 .. 0xCF
|
|
|
|
__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 0xD0 .. 0xDF
|
|
|
|
__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 0xE0 .. 0xEF
|
|
|
|
__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 0xF0 .. 0xFF
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
// decodes "quoted printable"-encoded 'input', throw if illegal character found in string
|
|
|
|
std::string decode(const std::string& input) |
|
|
|
try |
|
|
@ -153,17 +175,20 @@ std::string encode_header(const std::string& input) |
|
|
|
} |
|
|
|
|
|
|
|
unsigned char c = input[u]; |
|
|
|
if(c == '=' || c=='?' || c<' ' || c>126) |
|
|
|
if(allowed[c]==OK) |
|
|
|
{ |
|
|
|
char escape[] = { '=', hexdigit[c>>4], hexdigit[c & 0xF] }; |
|
|
|
ret.append(escape, escape+3); |
|
|
|
line_length+=3; |
|
|
|
ret += char(c); |
|
|
|
++line_length; |
|
|
|
}else if(c==' ') |
|
|
|
{ |
|
|
|
ret += '_'; |
|
|
|
++line_length; |
|
|
|
}else |
|
|
|
{ |
|
|
|
char escape[] = { '=', hexdigit[c>>4], hexdigit[c & 0xF] }; |
|
|
|
ret.append(escape, escape+3); |
|
|
|
line_length+=3; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return ret; |
|
|
|