]> code.citadel.org Git - citadel.git/blobdiff - libcitadel/lib/mime_parser.c
* suport lower case hex digits too
[citadel.git] / libcitadel / lib / mime_parser.c
index 1505a492ac1a8000d24df8980d67c206b33d8213..66f8c0c782d70f4e14871303b9060565f501f8ca 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "xdgmime/xdgmime.h"
 #include "libcitadel.h"
+#include "libcitadellocal.h"
 
 void extract_key(char *target, char *source, char *key)
 {
@@ -70,6 +71,34 @@ char *fixed_partnum(char *supplied_partnum) {
 }
 
 
+unsigned int decode_hex(char *Source)
+{
+       int ret = 0;
+       if (*Source  < 'A') {
+               ret += (*Source - '0');
+       }
+       else if (*Source > 'Z') {
+               ret += (*Source - 'a' + 10);
+       }
+       else {
+               ret += (*Source - 'A' + 10);
+       }
+
+       ret = ret << 4;
+
+       if (*(Source + 1) < 'A') {
+               ret += (*(Source + 1) - '0');
+       }
+       else if (*(Source + 1) > 'Z') {
+               ret += (*(Source + 1) - 'a' + 10);
+       }
+       else {
+               ret += (*(Source + 1) - 'A' + 10);
+       }
+       if (ret > 255)
+               return '?';
+       return ret;
+}
 
 /*
  * Convert "quoted-printable" to binary.  Returns number of bytes decoded.
@@ -93,7 +122,7 @@ int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen) {
                else if (encoded[pos] == '=')
                {
                        ch = 0;
-                       sscanf(&encoded[pos+1], "%02x", &ch);
+                       ch = decode_hex(&encoded[pos+1]);
                        pos += 3;
                        decoded[decoded_length++] = ch;
                }
@@ -891,7 +920,7 @@ const char *GetIconFilename(char *MimeType, size_t len)
        return Icon->FileName;
 }
 
-void ShutDownLibCitadel(void)
+void ShutDownLibCitadelMime(void)
 {
        DeleteHash(&IconHash);
 }