X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fmime_parser.c;h=18b0d97884ea1671d1b4365317b71200c10cea1d;hb=fbdda1a05be0a42b063a5aeb8dbe0b715b21bb55;hp=33b249b5062ff3a050dd5532b073e270b550ef11;hpb=38b22858cee4ed355e2e5c8ad20861aa50af7828;p=citadel.git diff --git a/webcit/mime_parser.c b/webcit/mime_parser.c index 33b249b50..18b0d9788 100644 --- a/webcit/mime_parser.c +++ b/webcit/mime_parser.c @@ -49,72 +49,47 @@ char *fixed_partnum(char *supplied_partnum) { /* * Convert "quoted-printable" to binary. Returns number of bytes decoded. + * according to RFC2045 section 6.7 */ int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen) { - char buf[SIZ]; - int buf_length = 0; - int soft_line_break = 0; unsigned int ch; - int decoded_length = 0; - int i; + int destpos = 1; + int sourcepos = 1; + int ignore_last = 0; + char *check; decoded[0] = 0; - decoded_length = 0; - memset(buf, '\0', SIZ); - buf_length = 0; - - for (i = 0; i < sourcelen; ++i) { - size_t buflen = strlen(buf); - buf[buf_length++] = encoded[i]; - - if ( (encoded[i] == '\n') - || (encoded[i] == 0) - || (i == (sourcelen-1)) ) { - buf[buf_length++] = 0; - - /*** begin -- process one line ***/ - - if (buf[buflen-1] == '\n') { - buf[buflen-1] = 0; - buflen --; - } - if (buf[buflen-1] == '\r') { - buf[buflen-1] = 0; - buflen --; - } - while (isspace(buf[buflen-1])) { - buf[buflen-1] = 0; - buflen --; - } - soft_line_break = 0; - - while (buflen > 0) { - if ((buf[0] == '=') && (buf[1] == '\0')) { - soft_line_break = 1; - buf[0] = '\0'; - buflen = 0; - } else if ((buflen>=3) && (buf[0]=='=')) { - sscanf(&buf[1], "%02x", &ch); - decoded[decoded_length++] = ch; - strcpy(buf, &buf[3]); - buflen -=3; - } else { - decoded[decoded_length++] = buf[0]; - strcpy(buf, &buf[1]); - buflen --; - } + if (sourcelen >0) + decoded[0] = encoded[0]; + while (sourcepos <= sourcelen){ + check = &decoded[destpos]; + decoded[destpos] = encoded[sourcepos]; + if ((ignore_last == 0) && (decoded[destpos-1] == '=')) + { + if ((*check == '\0') || + (*check == '\n') || + (*check == '\r')) + { + decoded[destpos - 1] = '\0'; + destpos-=2; } - if (soft_line_break == 0) { - decoded[decoded_length++] = '\r'; - decoded[decoded_length++] = '\n'; + else if (sourcelen - sourcepos > 2) + { + sscanf(&encoded[sourcepos], "%02x", &ch); + decoded[destpos - 1] = ch; + sourcepos++; + destpos --; + ignore_last = 1; } - buf_length = 0; - /*** end -- process one line ***/ } + else + ignore_last = 0; + destpos ++; + sourcepos ++; } - decoded[decoded_length++] = 0; - return(decoded_length); + decoded[destpos] = 0; + return(destpos - 1); } /*