From: Wilfried Goesgens Date: Mon, 25 Oct 2010 19:48:53 +0000 (+0200) Subject: * use a lookup table to convert hex to char (like we already do vice versa) to be... X-Git-Tag: v8.01~637^2 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=0eca431aaf8ee7e2c51cb2337a48c7acefc2764b * use a lookup table to convert hex to char (like we already do vice versa) to be faster. * don't use strcmp in CtdlDecodeQuotedPrintable --- diff --git a/libcitadel/lib/mime_parser.c b/libcitadel/lib/mime_parser.c index 43f499838..038851e21 100644 --- a/libcitadel/lib/mime_parser.c +++ b/libcitadel/lib/mime_parser.c @@ -22,6 +22,36 @@ #include "libcitadel.h" #include "libcitadellocal.h" +const unsigned char FromHexTable [256] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 0 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 10 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 20 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 30 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, // 40 + 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, // 50 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 60 + 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 70 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 80 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, // 90 + 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //100 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //110 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //120 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //130 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //140 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //150 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //160 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //170 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //180 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //190 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //200 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //210 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //220 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //230 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //240 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF //250 +}; + + void extract_key(char *target, char *source, long sourcelen, char *key, long keylen, char KeyEnd) { char *sptr, *ptr = NULL; @@ -90,36 +120,20 @@ char *fixed_partnum(char *supplied_partnum) { } -static inline unsigned int _decode_hex(char *Source) +static inline unsigned int _decode_hex(const char *Source) { - int ret = 0; - if ((*Source >= '0') && (*Source <= '9')) { - ret += (*Source - '0'); - } - else if ((*Source >= 'A') && (*Source <= 'F')) { - ret += (*Source - 'A' + 10); - } - else if ((*Source >= 'a') && (*Source <= 'f')) { - ret += (*Source - 'a' + 10); - } - else { - return '?'; - } - - ret = ret << 4; + int ret = '?'; + unsigned char LO_NIBBLE; + unsigned char HI_NIBBLE; + + HI_NIBBLE = FromHexTable[(unsigned char) *Source]; + LO_NIBBLE = FromHexTable[(unsigned char) *(Source+1)]; - if ((*(Source + 1) >= '0') && (*(Source + 1) <= '9')) { - ret |= (*(Source + 1) - '0'); - } - else if ((*(Source + 1) >= 'A') && (*(Source + 1) <= 'F')) { - ret |= (*(Source + 1) - 'A' + 10); - } - else if ((*(Source + 1) >= 'a') && (*(Source + 1) <= 'f')) { - ret |= (*(Source + 1) - 'a' + 10); - } - else { - return '?'; - } + if ((LO_NIBBLE == 0xFF) || (LO_NIBBLE == 0xFF)) + return ret; + ret = HI_NIBBLE; + ret = ret << 4; + ret = ret | LO_NIBBLE; return ret; } @@ -136,20 +150,26 @@ int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen) { while (pos < sourcelen) { - if (!strncmp(&encoded[pos], "=\r\n", 3)) - { - pos += 3; - } - else if (!strncmp(&encoded[pos], "=\n", 2)) - { - pos += 2; - } - else if (encoded[pos] == '=') + if (*(encoded + pos) == '=') { - ch = 0; - ch = _decode_hex(&encoded[pos+1]); - pos += 3; - decoded[decoded_length++] = ch; + pos ++; + if (*(encoded + pos) == '\n') + { + pos ++; + } + else if (*(encoded + pos) == '\r') + { + pos ++; + if (*(encoded + pos) == '\n') + pos++; + } + else if (encoded[pos] == '=') + { + ch = 0; + ch = _decode_hex(&encoded[pos]); + pos += 2; + decoded[decoded_length++] = ch; + } } else {